1

我想通过 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。之后,一切都很好。

4

3 回答 3

2

问题是我在写信的同一个端口上阅读。如果我做对了,socat 将两个端口“连接”为“输入”和“输出”。因此,如果我写入 ./ptyp1,我必须阅读 ./ptyp2。之后,一切都很好。

于 2011-05-20T07:51:33.873 回答
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
于 2011-04-02T15:54:39.867 回答
0

您似乎得到的是字符串“^B”。有可能socat(或其他方式)正在将您发送的字节 ( \x02) 解释为某种控制代码。

在我的脑海中,Ctrl-B是翻页助记符,但我不确定。

于 2011-04-02T17:43:06.677 回答