将串行读取从 python2 转换为 python3

converting serial read from python2 to python3

提问人:mike 提问时间:9/25/2021 更新时间:9/25/2021 访问量:128

问:

我是 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 中作的,因此写入不反映读取。

对此的任何帮助将不胜感激。

谢谢。

python-3.x

评论

0赞 tdelaney 9/25/2021
程序的其余部分需要原始数据这可能是问题所在。在 python 2 中,字符串和原始数据都保存在 中。在 python3 中,是否启用了 unicode - 它通常是 unicode 码位的宽字符表示形式。 用于原始数据。这就是 - 原始字节。如果程序的其余部分需要原始字节...它应该更改为 use 而不是 .strstrbytesb'whatever'bytesstr
0赞 jjramsey 9/25/2021
仅供参考,您的方法返回 ,因为它返回方法中的“值”——它不会返回值。poll()Nonedecode()
0赞 tdelaney 9/25/2021
应该做什么?USB 数据是否有某种已知的编码?还是只是添加?它可能只是为了保留对象。如果你想让你的屏幕发疯,你会.TED.decoderaw=return b"raw=" + rawbytessys.stdout.buffer.write(ted.poll())
0赞 mike 9/25/2021
TED.decode 使用原始 USB 数据响应的映射,并在程序的后期将其分解为可用的组件。原始程序执行了“原始字节”来提取这些组件。我尝试将其更改为“for bytes in raw”,但由于 raw 中的值不再匹配,因此无法通过后续测试。我想我只需要一种方法来存储数据,就像读取到原始数据一样。我不知道如何在 python3 中获取转换后的原始数据并使其看起来像读取,如跟踪中所示。有没有办法更改“return self.decode(self.port.read(4096))”以保留原始数据格式?

答: 暂无答案