为串行设备创建/格式化十六进制值字符串

Posted

技术标签:

【中文标题】为串行设备创建/格式化十六进制值字符串【英文标题】: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) 创建一个字符串。 【参考方案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

【讨论】:

以上是关于为串行设备创建/格式化十六进制值字符串的主要内容,如果未能解决你的问题,请参考以下文章

从串行端口发送十六进制数据的问题

将十六进制转换为 Swift 格式的字符串以保持相同的位数

C#,输入字符串的格式不正确,十进制值

php的对象串行化

二进制串行通信协议 - 得到意外响应

路由器串行接口互联地址可以不在同一个网段