gpt4 book ai didi

serial-port - socat创建的虚拟串口对二进制数据丢失0xF和0x16

转载 作者:行者123 更新时间:2023-12-04 02:34:33 24 4
gpt4 key购买 nike

我使用以下命令为串行端口创建一对并尝试通过它们发送二进制数据。

sudo socat -d -d pty,link=/dev/tty.vcp0,raw,echo=0,user=myusername,group=staff pty,link=/dev/tty.vcp1,raw,echo=0,user=myusername,group=staff

但是,即使我尝试发送以下二进制文件

数据.bin

0x16 0x16 0x16 0x16 0x16 0x16

(基本上就是一个6字节的文件,每个字节的值为0x16)

通过

cat /dev/tty.vcp0 > recv.bin

cat data.bin > /dev/tty.vcp1

我得到的只是 3 个字节的 0x16,而不是 6 个。

类似的事情发生在字节 0xF 上。如果我发送一个包含 6 个字节 0xF 的二进制文件,我将无法接收到任何单个字节。

有谁知道是什么原因导致丢失 0x16 和 0xF?如何传输包含 0x16 和 0xF 的二进制数据?

其他测试用例:

测试用例1

发送:

0x16 0x16 0x16 0x0 0x0 0x0 0x0 0x16 0x16 0x16

接收:

0x16 0x0 0x0 0x0 0x0 0x16

测试用例2

发送:

0xf 0xf 0xf 0x0 0x0 0x0 0x0 0xf 0xf 0xf

接收:

0xf 0x0 0x0 0x0 0x0

我在 socat 命令中添加了 -x 选项,我可以看到显示了正确的数据,所以应该是接收方的问题。

附言以上所有测试均在Mac OS X 10.9.2上进行

最佳答案

termios.c_lflag 中的 IEXTEN 标志导致了这个问题。

当 IEXTEN 打开时,VDISCARD=SI (0xF) 和 VLNEXT=SYN(0x16) 将不会传递到输入,如 termios 手册页中所述。

解决此问题的最简单方法是将 iexten=0 传递给 socat 命令,例如:

sudo socat -d -d pty,link=/dev/tty.vcp0,raw,echo=0,iexten=0,user=myusername,group=staff pty,link=/dev/tty.vcp1,raw,echo=0,iexten=0,user=myusername,group=staff

关于serial-port - socat创建的虚拟串口对二进制数据丢失0xF和0x16,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23155939/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com