#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) передачу.