从读取设备数据流中丢失流量控制数据(0x13)

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

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

尝试打开读取和写入,以及在二进制模式下fopen fread和fwrite,同样的结果。 有任何想法吗?

感谢任何回复,比如网站。 结果显示:

# stty -F /dev/ttyUSB0 speed 115200 baud; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ; eol2 = ; 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; 

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

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

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

考虑到在二进制流中出现这3个字节的概率,这不应该降低我认为的总吞吐量。

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