使用pySerial和socat发送字节时的问题

1 投票
3 回答
3086 浏览
提问于 2025-04-16 14:56

我想通过pySerial发送一些字节。我用socat创建了虚拟串口来做测试:

socat PTY,link=./ptyp1,b9600 PTY,link=./ptyp2,b9600

这是我的Python代码:

ser = serial.Serial('./ptyp1')
x = struct.pack('B',2)
print binascii.hexlify(x) # 02
ser.write(x)
y = ser.read(2)
print binascii.hexlify(y) # 5e42

我得到的输出是:

02   # x
5e42 # y

我期待的输出是:

02 # x
02 # y

我这里做错了什么?是socat的问题还是Python的问题?

补充:

我刚刚注意到对于不同的x值,有一些奇怪的行为。这里是输出:

x = 12  => y = 5E 52 0D 0A 5E 50
x = 100 => y = 100 # why does it work here?

解决方案:

问题在于我在写入的同一个端口上读取。如果我没理解错的话,socat是把两个端口“连接”起来,一个是“输入”,一个是“输出”。所以我在写入./ptyp1时,应该在./ptyp2上读取。这样一来,一切就正常了。

3 个回答

0

我安装了socat来测试你的代码。我运行了这一行:

socat PTY,link=./ptyp1,b9600 PTY,link=./ptyp2,b9600

然后,接下来的代码可以正常工作:

from binascii import hexlify
from serial import Serial, struct

ser = Serial('ptyp1')
x = struct.pack('B', 2)
print hexlify(x) # 02
ser.write(x)
y = ser.read()
print hexlify(y) # 5E
y = ser.read()
print hexlify(y) # 42

输出结果是:

02
5e
42
0

你看到的返回内容是字符串“^B”。这可能是因为 socat(或者其他某个环节)把你发送的字节(\x02)当成了一种控制代码来处理。

我记得 Ctrl-B 是用来翻页回去的快捷键,但我不太确定。

2

问题在于我在写入的同一个端口上进行读取。如果我没理解错的话,socat是把两个端口连接起来,一个是“输入”,一个是“输出”。所以,如果我在./ptyp1上写入,就得在./ptyp2上读取。这样做之后,一切就正常了。

撰写回答