0

我正在使用 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 周大),并且(尽管阅读了很多)我很难理解不同的字符/字符串格式......因此上面的评论中有问号。请适当地提出答案:)。

提前致谢!

4

2 回答 2

1

write期望参数是str, not bytes,所以b"\xFE\x44\x00\x08\x02\x9F\x25"直接传递给它是行不通的。您需要先转换bytesstrc.write(b"\xFE\x44\x00\x08\x02\x9F\x25".decode())应该可以。

于 2017-07-01T07:28:48.990 回答
1

解决方案

事实证明,将输入指定为字节字符串 (msg=b""\xF​​E\x44\x00\x08\x02\x9F\x25") 确实有效。最初的错误是由于 msg 字符串中的拼写错误...

次要错误来自如何处理输出 - 在 Python 2 中,ord() 必须应用于索引输出以返回整数,在 Python 3 中,整数可以通过索引直接从输出中提取(即不需要 ord())。

希望这可能对将来的某人有所帮助...

于 2017-07-01T14:12:53.397 回答