pyserial Python2/3 字符串头痛
pyserial Python2/3 string headache
我正在使用 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 (?).
在Python3,这个不行。我知道这与 Python 2/3 处理二进制字符串和 unicode 字符串的方式不同有关。我发现许多其他线程建议解决方案应该是简单地在我的消息 (msg=b""\xFE\x44\x00\x08\x02\x9F\x25"
) 前添加一个 b
以将其指定为二进制字符串,但 这不起作用 对我来说。
有什么见解吗?我应该在 Python 3 中发送什么,以便传感器接收到相同的信号?我已经无计可施了...
我应该补充一点,我对串行连接完全陌生(好吧... 1 周大),并且(尽管阅读了大量内容)我在理解不同的 character/string 格式方面遇到了困难...因此,上面的评论中有问号。请适当地回答问题:).
提前致谢!
write
期望参数为 str
,而不是 bytes
,因此将 b"\xFE\x44\x00\x08\x02\x9F\x25"
直接传递给它是行不通的。您需要先将 bytes
转换为 str
:c.write(b"\xFE\x44\x00\x08\x02\x9F\x25".decode())
应该可以。
解决方案
事实证明,将输入指定为字节字符串 (msg=b""\xFE\x44\x00\x08\x02\x9F\x25") 确实有效。最初的错误是由于 msg 字符串中的拼写错误...
次要错误源于输出的处理方式 - 在 Python 中,必须将 ord() 应用于索引输出以达到 return 个整数,在 Python 中,3 个整数可以通过索引直接从输出中提取(即不需要 ord())。
希望这对以后的人有所帮助...
我正在使用 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 (?).
在Python3,这个不行。我知道这与 Python 2/3 处理二进制字符串和 unicode 字符串的方式不同有关。我发现许多其他线程建议解决方案应该是简单地在我的消息 (msg=b""\xFE\x44\x00\x08\x02\x9F\x25"
) 前添加一个 b
以将其指定为二进制字符串,但 这不起作用 对我来说。
有什么见解吗?我应该在 Python 3 中发送什么,以便传感器接收到相同的信号?我已经无计可施了...
我应该补充一点,我对串行连接完全陌生(好吧... 1 周大),并且(尽管阅读了大量内容)我在理解不同的 character/string 格式方面遇到了困难...因此,上面的评论中有问号。请适当地回答问题:).
提前致谢!
write
期望参数为 str
,而不是 bytes
,因此将 b"\xFE\x44\x00\x08\x02\x9F\x25"
直接传递给它是行不通的。您需要先将 bytes
转换为 str
:c.write(b"\xFE\x44\x00\x08\x02\x9F\x25".decode())
应该可以。
解决方案
事实证明,将输入指定为字节字符串 (msg=b""\xFE\x44\x00\x08\x02\x9F\x25") 确实有效。最初的错误是由于 msg 字符串中的拼写错误...
次要错误源于输出的处理方式 - 在 Python 中,必须将 ord() 应用于索引输出以达到 return 个整数,在 Python 中,3 个整数可以通过索引直接从输出中提取(即不需要 ord())。
希望这对以后的人有所帮助...