我想通过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将两个端口“连接”为“in”和“out”。所以如果我写信给./ptyp1,我必须阅读./ptyp2。在那之后,一切都很好。
答案 0 :(得分:1)
问题在于我在我写的同一个端口上阅读。如果我做得对,socat将两个端口“连接”为“in”和“out”。所以如果我写信给./ptyp1,我必须阅读./ptyp2。在那之后,一切都很好。
答案 1 :(得分: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
答案 2 :(得分:0)
你似乎要回来的是字符串“^ B”。 socat
(或者其他方面的其他内容)可能会将您发送的字节(\x02
)解释为某种控制代码。
在我的头顶,Ctrl-B
是页面返回的助记符,但我不确定。