Чтение необработанных байтов из последовательного порта - PullRequest
11 голосов
/ 22 декабря 2011

Я пытаюсь прочитать необработанные байты из последовательного порта, отправленного имитатором протокола win32 МЭК 870-5-101 с программой, написанной на C, работающей в 32-битном Linux.

Работает нормально для значений байтовкак 0x00 - 0x7F.Но для значений, начинающихся от 0x80 до 0xAF, старший бит неверен, например:

0x7F -> 0x7F //correct
0x18 -> 0x18 //correct
0x79 -> 0x79 //correct
0x80 -> 0x00 //wrong
0xAF -> 0x2F //wrong
0xFF -> 0x7F //wrong

После того, как копаться в течение двух дней, я понятия не имею, что это вызывает.

Этомоя конфигурация последовательного порта:

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

    config.c_cflag |= (CLOCAL | CREAD);

    config.c_cflag &= ~CSIZE;                               /* Mask the character size bits */
    config.c_cflag |= (PARENB | CS8);                       /* Parity bit Select 8 data bits */

    config.c_cflag &= ~(PARODD | CSTOPB);                   /* even parity, 1 stop bit */


    config.c_cflag |= CRTSCTS;                              /*enable RTS/CTS flow control - linux only supports rts/cts*/


    config.c_iflag &= ~(IXON | IXOFF | IXANY);              /*disable software flow control*/ 

    config.c_oflag &= ~OPOST;                               /* enable raw output */
    config.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);      /* enable raw input */

    config.c_iflag &= ~(INPCK | PARMRK);                    /* DANGEROUS no parity check*/
    config.c_iflag |= ISTRIP;                               /* strip parity bits */
    config.c_iflag |= IGNPAR;                               /* DANGEROUS ignore parity errors*/

    config.c_cc[VTIME] = 1;                                 /*timeout to read a character in tenth of a second*/

Я читаю с последовательного порта с помощью:

*bytesread = read((int) fd, in_buf, BytesToRead);

Сразу после этой операции "in_buf" содержит неправильный байт, поэтому я думаю,что-то не так с моим конфигом, который является портом из структуры win32 DCB.

Спасибо за любые идеи!

1 Ответ

14 голосов
/ 22 декабря 2011

Исходя из ваших примеров, только 8-й бит (старший бит) неправильный, и он всегда равен 0. Вы устанавливаете ISTRIP в своей дисциплине линии на стороне Linux, и это может вызвать это.ISTRIP не делает, как говорится в комментарии в коде C, биты четности.Он удаляет 8-й бит данных.

Если установлен ISTRIP, допустимые входные байты должны быть сначала сокращены до семи битов;в противном случае все восемь битов должны быть обработаны. Стандарт IEEE 1003.1, издание 2004 г., глава 11, Общий интерфейс терминала

...