【问题标题】:Missing flow control data (0x13) from reading device data stream读取设备数据流时缺少流控制数据 (0x13)
【发布时间】:2011-12-25 14:50:31
【问题描述】:

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

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

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

【问题讨论】:

  • 可以是serial-over-USB协议添加的校验和字节吗?

标签: c serial-port communication linux-device-driver control-characters


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    感谢您的任何回复,例如网站。原来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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 2019-08-18
      • 2014-05-10
      • 2021-05-29
      • 1970-01-01
      相关资源
      最近更新 更多