提问人:mike 提问时间:9/25/2021 更新时间:9/25/2021 访问量:128
将串行读取从 python2 转换为 python3
converting serial read from python2 to python3
问:
我是 python 的新手,正在尝试将我拥有的一个非常旧的实用程序从 python2 转换为 python3。我已经搜索并搜索了答案,但我还没有找到对我所看到的行为的解释或如何解决它......
我从USB(串行)设备中获取数据,如下所示:
class TED(object):
def __init__(self, device):
self.port = serial.Serial(device, 19200, timeout=0)
self.escape_flag = False
def poll(self):
self.port.write(b'\xAA')
return self.decode(self.port.read(4096))
def decode(self, raw):
print("raw=%s" % raw)
在其他地方,我用原始结果做一些事情,但现在,我只是将其打印到屏幕上,python2 和 python3 之间的结果截然不同。
在 python2 中,我得到了预期的结果,这基本上是一堆控制字符和其他废话,使终端屏幕都搞砸了。这表明 raw 中包含的数据实际上是来自串行端口的原始结果,并且 strace 显示它如下:
read(3, "\0\34S\0\0\356\6#\4M\320:\3\311d\261s\7\330\5e\261j\7\321\5f\261L\n\31\10"..., 4096) = 361
write(1, "raw=\0\34S\0\0\356\6#\4M\320:\3\311d\261s\7\330\5e\261j\7\321\5f\261"..., 335
在 python3 中,raw 的值似乎是一个字符串,仅显示实际数据的十六进制值,并以纯文本形式打印到屏幕上。如:
raw=b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x04\n\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x1d\x01\x00\x00^\x01\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x02\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,\x01\x15\xe8\x03\x01\xe4\x90\x00TED \x00\x00\x00\x00\x00\x0f'\x0f'\x0f'\x0f'\xe8\x03\xdc\x05\xc1\x04\xc9\x00\xe7\x04\xa9\x00j\x04c\xaf\x05V\xec\x03O\x00d\t\xb5\x00\x86P\x12\x00P'\x17\x00AS\x00\x00\xd5\xbc$\x04\xb0*<\x03\xc9d\xb1s\x07\xd8\x05e\xb1j\x07\xd1\x05f\xb1L\n\x19\x08g\xb1]\n'\x08h\xb1d\x0b\xf6\x08i\xb16\n\x08\x08j\xb1I\x08\x81\x06k\xb1Q\x08\x88\x06\\\xb1\xad\x08\xd1\x06a\xb1_\x0b\xf3\x08b\xb1\x8b\x0b\x16\tc\xb1\x0c\x08Q\x06\xe4\x00\x12\x00\xde\x04\x89\x03c\nO\r\x0c|\xea\x00\x00\xbe?\x01\x00^\xd6l\x00\x88\x07m\x00\x00\x03\x10\x03"
python3 上的一个 strace 显示了输入和输出之间的差异:
read(3, "\20\4\n\2\0\0\0\0\0\0\0\0\0\0\0\0\200\0\35\1\0\0^\1\377\377\0\0\0\0\0\0"..., 4096) = 282
write(1, "raw=b\"\\x10\\x04\\n\\x02\\x00\\x00\\x00"..., 962raw=b"\x10\x04\n\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x1d\x01\x00\x00^\x01\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x02\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,\x01\x15\xe8\x03\x01\xe4\x90\x00TED \x00\x00\x00\x00\x00\x0f'\x0f'\x0f'\x0f'\xe8\x03\xdc\x05\xc1\x04\xc9\x00\xe7\x04\xa9\x00j\x04c\xaf\x05V\xec\x03O\x00d\t\xb5\x00\x9aW\x12\x00C0\x17\x00BS\x00\x00\xc8\xc5$\x04\xc41<\x03\xc9d\xb1s\x07\xd8\x05e\xb1j\x07\xd1\x05f\xb1L\n\x19\x08g\xb1]\n'\x08h\xb1d\x0b\xf6\x08i\xb16\n\x08\x08j\xb1I\x08\x81\x06k\xb1Q\x08\x88\x06\\\xb1\xad\x08\xd1\x06a\xb1_\x0b\xf3\x08b\xb1\x8b\x0b\x16\tc\xb1\x0c\x08Q\x06\xe4\x00\x12\x00\xde\x04\x89\x03c\nN\r\x0c\xbf\xe9\x00\x00r?\x01\x00\x0e\xd8l\x002\x00m\x00\x00\x03\x10\x03"
所有这一切的结果是,程序的其余部分需要原始数据,而不是转换后的字符串,结果它中断了。
如何让 python3 的 read() 以未操作的形式返回数据?
PS - 请注意,在上面的示例中,实际数据是不同的,因为样本是在不同的时间采集的。这里的问题是数据是在 python3 中作的,因此写入不反映读取。
对此的任何帮助将不胜感激。
谢谢。
答: 暂无答案
上一个:计算元素在文本文件中的位置
评论
str
str
bytes
b'whatever'
bytes
str
poll()
None
decode()
TED.decode
raw=
return b"raw=" + raw
bytes
sys.stdout.buffer.write(ted.poll())