Python io模块的TextIOWrapper或BufferedRWPair与pySerial不兼容
我正在为一些科学设备写一个串口适配器,这些设备的指令集使用UTF-8字符编码。设备返回的所有响应都以回车符(u'\r')结束。我希望能够使用pySerial的readline()
函数,并指定一个结束行符,所以我按照这个讨论的方式进行了设置。
import serial
import io
ser = serial.Serial(port='COM10', baudrate=128000)
sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser, 1), encoding='utf-8', newline=u'\r')
ser.open()
# these commands move to coordintes (25000, 0, 25000)
cmd = 'M\x80\x1a\x06\x00\x00\x00\x00\x00\x80\x1a\x06\x00'
ucmd = u'M\x80\x1a\x06\x00\x00\x00\x00\x00\x80\x1a\x06\x00'
#this works
ser.write(cmd)
print sio.readline()
#this does not
sio.write(ucmd)
sio.flush()
print sio.readline()
奇怪的是,第一次发送的命令字符串(直接用pySerial发送的非unicode字符串)能让设备正常工作。而第二次(通过Python的io模块发送的unicode字符串)却导致设备动作不稳定,甚至卡住。这是为什么呢?发送unicode命令字符串给设备是可以的,前提是命令字符串只有几个字符。一旦你开始发送字节,其hex(ord(byte))
值大于0x7F(超出ASCII范围),就会出现问题。我可以找到解决这个问题的方法,但我想知道到底发生了什么。谢谢!
1 个回答
2
来自 io 文档:
BufferedRWPair 这个东西不会去同步对它底层原始流的访问。你不应该把同一个对象同时当作读取器和写入器传入;应该使用 BufferedRandom 来代替。
我猜这就是你的问题,因为你把同一个对象 ser
作为读取器和写入器传入了。BufferedRandom 看起来也不太适合这个情况。
那么你的问题是 serial
在等待结束符的时候卡住了吗?