1

我编写了一个 Linux 应用程序,通过模拟串行端口的 USB 端口读取和写入二进制数据到远程设备。

当我从设备读取数据时,我有一个 USB 嗅探器,它显示这样的二进制数据流(0x01,0x0A......0x13),但是当我的程序读取字节时,0x13 不在字节流中- 这是 XOFF 字符,但我没有使用 XON/XOFF 流控制(我认为)。

尝试了 open read 和 write,以及二进制模式下的 fopen fread 和 fwrite,结果相同。有任何想法吗?

4

2 回答 2

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 &= ~(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;

现在可以看到我所有的数据了:)

于 2011-11-10T15:43:09.833 回答
0

也许最好完全避免通过串口发送控制字符,而是稍微修改 Linux 和远程设备上的应用程序以将它们编码/解码为两个字节。例如:

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

考虑到这 3 个字节出现在二进制流中的可能性,这不应该降低我认为的整体吞吐量。

顺便说一下,XON/XOFF 是软件流控制和串行/终端驱动程序的基本功能。实际上,此功能在您的情况下也很有用 - 为了避免缓冲区溢出和丢失一些有价值的字节,您可以暂停 (XOFF) 或恢复 (XON) 传输。

于 2011-11-10T06:04:45.117 回答