我正在为一些科学硬件编写一个串行适配器,其命令集 http://www.sutter.com/SOFTWARE/USBv3.pdf使用 UTF-8 字符编码。来自硬件的所有响应均以回车符 (u'\r') 终止。我希望能够使用 pySerialreadline()
指定了 EOL 字符的函数,所以我有这个设置,ala这个线程 https://stackoverflow.com/questions/16470903/pyserial-2-6-specify-end-of-line-in-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 命令字符串确实有效IF命令字符串只有几个字符。一旦你开始发送字节hex(ord(byte))
值 > 0x7F(超出 ASCII 范围),那么您就会开始遇到麻烦。我可以轻松解决这个问题,但我想知道发生了什么。谢谢!
From io docs https://docs.python.org/2/library/io.html#io.BufferedRWPair:
BufferedRWPair 不会尝试同步对其的访问
底层原始流。你不应该将相同的对象传递给它
读者和作家; use 缓冲随机 https://docs.python.org/2/library/io.html#io.BufferedRandom反而。
我猜这是你的问题,因为你传递的是同一个对象ser
作为读者和作家。 BufferendRandom 看起来也不符合要求。
你的问题也是如此serial
它挂起等待 EOL?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)