【问题标题】:creating/formatting string of hex values for serial device为串行设备创建/格式化十六进制值字符串
【发布时间】:2020-11-04 18:29:06
【问题描述】:

我正在使用 2.7 上的一些旧 Python 代码,通过 python 串行库向 FTDI 设备发送和接收数据。

例如,十六进制数据以字节文字字符串转义发送 ser.write(b"\x02\x27\x01") 以类似的格式返回响应。

我有一个计算密码的函数,我需要以字符串格式发送响应。 b"\xnn" 其中 nn 是十六进制值。

因此尝试以以下方式制作响应(代码是现有程序的一部分),这是失败的

在哪里

high = 0x54
low = 0xd3

key_answer="\x04\x27\x02"+chr(int(high)).encode('latin1')+chr(int(low)).encode('latin1')

它失败了:

Message='ascii' codec can't decode byte 0xd3 in position 0: ordinal not in range(128)

如果我只使用 chr() 函数,我会得到 "\x04'\x02**T**\xd3" 其中高值应该是 \x54 而不是字符 T

所以问题是:如何强制将十六进制值的格式从 0a54 格式转换为字符串文字 '\x54'

【问题讨论】:

  • Python 2.7 尝试“提供帮助”并将字节转换为字符串,反之亦然。它使用 ASCII 编解码器来做到这一点,这几乎总是错误的选择。要解决此问题,请在使用字节和字符串方面保持一致。 chr(x) 创建一个字符串。

标签: python python-2.7 pyserial


【解决方案1】:

使用我的编解码器all-escapes,它就是为这个用例而设计的。

pip install all-escapes

最简单的演示:

>>> b"T".decode("all-escapes")
"\\x54"

您的案例的完整用法示例:

>>> key_answer = b"\x04\x27\x02"
>>> b = bytearray(key_answer)
>>> b.extend([high, low])
>>> print(b)
bytearray(b"\x04\'\x02T\xd3")
>>> print(b.decode('all-escapes'))
\x04\x27\x02\x54\xd3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2022-07-08
    • 2012-08-15
    相关资源
    最近更新 更多