Отсутствуют данные управления потоком (0x13) из потока данных считывающего устройства

#c #serial-port #communication #linux-device-driver #control-characters

#c #последовательный порт #Информационные материалы #linux-драйвер устройства #управляющие символы

Вопрос:

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

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

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

Комментарии:

1. может ли это быть байт контрольной суммы, добавляемый протоколом serial-over-USB?

Ответ №1:

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

 # 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 amp;= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
            | INLCR | IGNCR | ICRNL | IXON);
termios_p->c_oflag amp;= ~OPOST;
termios_p->c_lflag amp;= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
termios_p->c_cflag amp;= ~(CSIZE | PARENB);
termios_p->c_cflag |= CS8;
  

Теперь я могу видеть все свои данные 🙂

Ответ №2:

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

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

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

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