Отсутствуют данные управления потоком (0x13) из потока данных устройства чтения - PullRequest
1 голос
/ 09 ноября 2011

Я написал приложение для Linux для чтения и записи двоичных данных на удаленное устройство через порт USB, который эмулирует последовательный порт.

Когда я читаю данные с устройства, у меня есть USB-анализатор, который показывает поток двоичных данных, подобный этому (0x01, 0x0A ...... 0x13), но когда моя программа читает байты, 0x13 не находится в поток байтов - это символ XOFF, но я не использую управление потоком XON / XOFF (я думаю).

Пробовал открывать чтение и запись, а также открывать fread и fwrite в двоичном режиме, результат один и тот же. Есть идеи?

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Спасибо за любые ответы, например, на сайте. Оказывается, стты показали:

# stty -F /dev/ttyUSB0

speed 115200 baud;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 0; time = 10;
-brkint -imaxbel
-opost
-isig -icanon -echo -echoe

Хотя казалось, что управление потоком было отключено, Решением было использование настроек cfmakeraw, чтобы увидеть ВСЕ символы и ничего не игнорировать.

cfmakeraw () устанавливает для терминала что-то вроде «сырого» режима старого драйвера терминала версии 7: ввод доступен символ за символом, эхо отключено, а вся специальная обработка символов ввода и вывода терминала отключена. Терминальные атрибуты устанавливаются следующим образом:

termios_p->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
            | INLCR | IGNCR | ICRNL | IXON);
termios_p->c_oflag &= ~OPOST;
termios_p->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
termios_p->c_cflag &= ~(CSIZE | PARENB);
termios_p->c_cflag |= CS8;

Теперь вижу все мои данные:)

0 голосов
/ 10 ноября 2011

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

0x00 0x00 -> 0x00
0x00 0x01 -> 0x13 (escape XOFF)
0x00 0x02 -> 0x11 (escape XON) 

Учитывая вероятность появления этих 3 байтов в двоичном потоке, это не должно уменьшать общую пропускную способность, я думаю.

И, кстати, XON / XOFFэто программное управление потоком и основная функция последовательных / терминальных драйверов.На самом деле эта функция может быть полезна и в вашем случае - чтобы избежать переполнения буферов и пропуска некоторых ценных байтов, вы можете приостановить (XOFF) или возобновить (XON) передачу.

...