pyserial Python2 / 3字符串头痛

时间:2017-07-01 07:10:04

标签: python serial-port hex pyserial python-2to3

我使用pyserial与一些使用Modbus协议的传感器进行通信。在Python 2.7中,这非常有效:

import serial

c = serial.Serial('port/address')  # connect to sensor
msg = "\xFE\x44\x00\x08\x02\x9F\x25"  # 7 hex bytes(?)
c.write(msg)  # send signal
r = c.read(7)  # read 7 hex bytes (?).

在Python 3中,这不起作用。我知道它与Python 2/3处理二进制和unicode字符串的方式有所不同。我发现许多其他线程建议解决方案应该只是在我的消息(b)上添加msg=b""\xFE\x44\x00\x08\x02\x9F\x25"以将其指定为二进制字符串,但这不起作用对我而言。

任何见解?我应该在Python 3中发送什么,以便传感器收到相同的信号?我的智慧结束了......

我应该补充一点,我对串行连接完全陌生(好吧...... 1周大),并且(尽管阅读了很多)我努力理解不同的字符/字符串格式...因此问题在上面的评论中标记。请妥善表达答案:)。

提前致谢!

2 个答案:

答案 0 :(得分:1)

write期望参数为str,而不是bytes,因此直接将b"\xFE\x44\x00\x08\x02\x9F\x25"传递给它不会有效。您需要先将bytes转换为strc.write(b"\xFE\x44\x00\x08\x02\x9F\x25".decode())应该有效。

答案 1 :(得分:0)

解决方案

事实证明,将输入指定为字节字符串(msg = b"" \ xFE \ x44 \ x00 \ x08 \ x02 \ x9F \ x25")确实有效。初始错误来自msg字符串中的拼写错误...

二次错误源于输出的处理方式 - 在Python 2 ord()中必须应用于索引输出以返回整数,在Python 3中,整数可以通过索引直接从输出中提取(即没有ord()必要)。

希望这可能会帮助将来的某个人......