c - 读取设备数据流时缺少流量控制数据 (0x13)

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

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

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

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

最佳答案

感谢任何回复,比如网站。结果 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;

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

关于c - 读取设备数据流时缺少流量控制数据 (0x13),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8070632/

相关文章:

c - 在循环中忽略 i 和 j 的相同值

c - 如何栅格化旋转的矩形(通过 setpixel 在 2d 中)

python - Arduino 和 Python 通信错误

python - matlab到python通信的最佳方式

java - java线程间通信

c - 管道、dup2 和 exec()

linux - 使用 Device::SerialPorts 在 Linux 中编程串口

c# - 释放未插入的虚拟串行端口

.net - 用于极低带宽通信的最佳 .NET 通信组件或协议(protocol)?

c - 将内核模块与预编译对象链接