2016-02-18 3 views
-1

У меня возникли проблемы с выбором правильных настроек для последовательного порта, который нужно открыть. информация У меня следующий:Ошибка чтения/открытия последовательного порта в C, Linux

  • Синхронизация: Метод Асинхронный
  • Связь Метод: дуплексной передачи
  • Скорость передачи: 9600 бит (бит в секунду)
  • Код передачи: 8-битные данные
  • Конфигурация данных: начальный бит 1, данные 8 бит + четность 1, стоповый бит 1
  • Контроль ошибок: горизонтальные (CRC) и вертикальные (четные числа) паритеты
  • 1 байтовая конфигурация ПК не должен использовать управляющий сигнал (DTR, DSR, RTS и CTS) во время этого соединения.

Что у меня есть что-то вроде:

bool configurePort(void) { 
    struct termios port_settings; 
    bzero(&port_settings, sizeof(port_settings)); 

    tcgetattr(fd, &port_settings); 

    cfsetispeed(&port_settings, B9600); 
    cfsetospeed(&port_settings, B9600); 

    port_settings.c_cflag &= ~CSIZE; 
    port_settings.c_cflag |= CS8; 

    // parity bit 
    //port_settings.c_cflag &= ~PARENB; 
    //port_settings.c_cflag &= ~PARODD; 
    // hardware flow 
    port_settings.c_cflag &= ~CRTSCTS; 
    // stop bit 
    //port_settings.c_cflag &= ~CSTOPB; 

    port_settings.c_iflag = IGNBRK; 
    port_settings.c_iflag &= ~(IXON | IXOFF | IXANY); 
    port_settings.c_lflag = 0; 
    port_settings.c_oflag = 0; 

    port_settings.c_cc[VMIN] = 1; 
    port_settings.c_cc[VTIME] = 0; 
    port_settings.c_cc[VEOF] = 4; 

    tcsetattr(fd, TCSANOW, &port_settings); 


    return true; 
} 

Пробовал различные модификации, но ничего, кажется, работает.

Устройство подключено через USB-последовательный порт (ttyUSB0), и у меня есть разрешения. Он открывает устройство, отправляет (?) Данные, но никогда ничего не получает ...

Может кто-нибудь указать мне, что делать?

+1

Ваш комментарий не конструктивна и не имеет отношения к вопросу. Более того, это больше C, чем C++ – kometonja

+0

Вам нужно проверить коды возврата из ** tcgetattr() ** и ** tcsetattr() **, тем более, что вы столкнулись с проблемами. Возможно, это не сделано в примерах, но проверка кодов возврата - это правильное средство для написания надежного кода. Вы не указали, является ли это каноническим вводом-выводом или нет. Определение VEOF в сыром режиме нелогично. Вы не установили паритет. Исследование [Настройка правильных режимов терминала] (http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_12.html#SEC237) и [Руководство по серийному программированию для операционных систем POSIX] (http://www.cmrr.umn.edu/~strupp/serial.html) – sawdust

ответ

1

Попробуйте с этим:

bool configurePort(void) { 
    struct termios port_settings; 
    bzero(&port_settings, sizeof(port_settings)); 

    if(tcgetattr(fd, &port_settings) < 0) { 
     perror("tcgetattr"); 
     return false; 
    } 

    cfmakeraw(&port_settings); 

    cfsetispeed(&port_settings, B9600); 
    cfsetospeed(&port_settings, B9600); 

    //input 
    port_settings.c_iflag &= ~(IXON | IXOFF | IXANY); //disable flow control 

    //local 
    port_settings.c_lflag = 0; // No local flags 

    //output 
    port_settings.c_oflag |= ONLRET; 
    port_settings.c_oflag |= ONOCR; 
    port_settings.c_oflag &= ~OPOST; 


    port_settings.c_cflag &= ~CRTSCTS; // Disable RTS/CTS  
    port_settings.c_cflag |= CREAD; // Enable receiver 
    port_settings.c_cflag &= ~CSTOPB; 


    tcflush(fd, TCIFLUSH); 


    if(tcsetattr(fd, TCSANOW, &port_settings) < 0) { 
     perror("tcsetattr"); 
     return false; 
    } 

    int iflags = TIOCM_DTR; 
    ioctl(fd, TIOCMBIC, &iflags); // turn off DTR 

    return true; 
} //configure port 
Смежные вопросы