ЗАО «ЗЭО»

Пожалуйста, войдите или зарегистрируйтесь.

Расширенный поиск  

Новости:

Автор Тема: Использование RS-485  (Прочитано 2003 раз)

0 Пользователей и 1 Гость просматривают эту тему.

VadimJigulin

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 2
Использование RS-485
« : 06 Мая, 2016, 14:05:25 »

Здравствуйте. Являюсь новичком в программировании для встраиваемых систем. Долгое время пытаюсь заставить работать 485 протокол на Орион 28.

#include <sys/types.h>
#include <sys/stat.h>
#include <termios.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include "crc16.h"

#define BAUDRATE B9600
#define DEVICE "/dev/ttySP0"

main(){
    printf("hello");
    int fd;
    struct termios opt;
    struct timespec req, rem;
    fd = open(DEVICE, O_RDWR | O_NOCTTY | O_NDELAY);
    if ( fd < 0 ){
        perror(DEVICE);
    }
    char txBuffer[8] = { 0x01, 0x04, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00 };
    char rxBuffer[100];
    unsigned short crc16 = CRC16(reinterpret_cast<const unsigned char*>(txBuffer), 6);
    txBuffer [6] = (crc16&0x00ff);
    txBuffer [7] = ((crc16&0xff00)>>8);

    opt.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
    opt.c_iflag = IGNPAR;
    opt.c_lflag = 0;
    opt.c_oflag = 0;
    opt.c_cc[VMIN] = 0;      //Minimum bytes available
    opt.c_cc[VTIME] = 0;
    tcflush(fd, TCIFLUSH);
    tcsetattr (fd, TCSANOW, &opt);

    int r = 0;

    while(r<=0){
        //printf("Sending...\n");
        int sended = write(fd, &txBuffer, 8);
        printf ("Sended = %d\n", sended);
        req.tv_sec = 0;
        req.tv_nsec = 100 * 1000000;
        nanosleep(&req, &rem);
        //opt.c_cflag |= CREAD;
        //tcsetattr (fd, TCSANOW, &opt);
        r = read(fd, &rxBuffer, 1);
        //opt.c_cflag &= ~CREAD;
        //tcsetattr (fd, TCSANOW, &opt);
        //printf("Reading...\n");
        printf("Readed = %d\n", r);
        //for (int i = 0; i < r; i++) {
        //    printf("%c", data);
        //}
    }
}

Вот этот код я пытаюсь запустить. Исхожу из того, что при одновременно-включенном приемнике и передатчике, я должен считать с входного буфера то что и передал. Этого не происходит или, по крайней мере, я не правильно работаю с устройством. Также пытался посылать данные в реальное устройство, оно их принимает и отвечает, но ответа снова не вижу... Перепробовал кучу комбинаций. Код выше взят из примеров этого форума от Danila. С отправкой все нормально происходит, с приемом - нет. Помогите, в чем я ошибаюсь.
P.S.
Глубоко в дебри Линукс я пока не забирался, исхожу из того, что ничего сверэкстра не должно быть... Опыт программирования 485 интерфейса имел.
PPS
Былобы супер получить информацию о том, как работать с 485 протоколом в асинхронном режиме.
Спасибо.
Записан

VadimJigulin

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 2
Re: Использование RS-485
« Ответ #1 : 15 Мая, 2016, 21:46:15 »

Извините. Лоханулись. Все работает как часы. (тупо не было контакта на приеме, в заблуждение ввел сигнал устройства, что ответ есть).
Записан