我正在转换我的代码,因此它适用于Python 3.剩下的主要问题是成功使用serial.write命令。在我之前的代码中,我创建了一个这样的字符串:read_frame ='\ xAA \ x00 \ x01 \ x00 \ x00 \ x00 \ x65 \ x00 \ x00 \ x00 \ x0A \ x00 \ x6F \ x71'。然后使用serial.write(read_frame)发送此字符串。
但是,在Python 3中,我必须将其转换为'byte'才能使用serial.write(read_frame)。如果是静态帧,则将其声明为:read_frame_byte = b'\ xAA \ x00 \ x01 \ x00 \ x00 \ x00 \ x65 \ x00 \ x00 \ x00 \ x0A \ x00 \ x6F \ x71'
但问题是,我动态创建了这个十六进制字符串,所以最后我必须将字符串转换为字节。如果我使用命令read_frame.encode('utf-8'),转换会产生不同的十六进制数(例如,x65变为xe,因为这是相应的ASCII值)。这在技术上是正确的,但我只想将字符串转换为字节而不更改任何值。有任何建议/解决方法可以进行此转换吗?
我猜你正在创建一个"AA0001000000650000000A006F71"
形式的十六进制字符串,你想从每对十六进制数字创建一个字节。我不应该猜...
拿你的数据:
>>> digits = "AA0001000000650000000A006F71"
将其拆分为两个字符的块:
>>> [digits[i:i+2] for i in range(0, len(digits), 2)]
['AA', '00', '01', '00', '00', '00', '65', '00', '00', '00', '0A', '00', '6F', '71']
将转换添加到整数,告诉int
内置使用base 16:
>>> [int(digits[i:i+2], 16) for i in range(0, len(digits), 2)]
[170, 0, 1, 0, 0, 0, 101, 0, 0, 0, 10, 0, 111, 113]
最后,将整数列表转换为bytes
对象:
>>> bytes([int(digits[i:i+2], 16) for i in range(0, len(digits), 2)])
b'\xaa\x00\x01\x00\x00\x00e\x00\x00\x00\n\x00oq'