pyserial Python2/3字符串

pyserial Python2/3字符串,python,serial-port,hex,pyserial,python-2to3,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 (?). 在P

我使用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中,这不起作用。我知道这与Python2/3处理二进制字符串和unicode字符串的方式不同有关。我发现许多其他线程建议解决方案应该是在我的消息(
msg=b”“\xFE\x44\x00\x08\x02\x9F\x25”
)上简单地预先加上一个
b
,将其指定为二进制字符串,但这对我的情况不起作用

有什么见解吗?我应该在Python3中发送什么以使传感器接收到相同的信号?我已经不知所措了

我应该补充一点,我对串行连接是完全陌生的(嗯……一周大了),而且(尽管读了很多书),我很难理解不同的字符/字符串格式……因此在上面的评论中打上问号。请适当地给出答案:)


提前感谢!

write
希望参数是
str
,而不是
字节
,因此直接将
b“\xFE\x44\x00\x08\x02\x9F\x25”
传递到它将不起作用。您需要将
字节
转换为
str
首先:
c.write(b”\xFE\xFE\x44\x00\x08\x02\xf\x25“.decode())
应该可以工作。

write
希望参数是
str
,而不是
字节
,所以直接将
b“\xFE\x44\x00\x08\x02\x9F\x25”
传递到它将不起作用。您需要先将
字节
转换为
str
字节:
c.write(b“\xFE\x44\x00\x08\x02\x9F\x25”)
应该可以工作。

解决方案 事实证明,将输入指定为字节字符串(msg=b”“\xFE\x44\x00\x08\x02\x9F\x25”)确实有效。最初的错误是由于msg字符串中的输入错误

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

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

解决方案 事实证明,将输入指定为字节字符串(msg=b”“\xFE\x44\x00\x08\x02\x9F\x25”)确实有效。最初的错误是由于msg字符串中的键入错误

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


希望这可能会对将来的人有所帮助…

谢谢。不幸的是没有什么好处:
“utf-8”编解码器无法解码位置0:无效起始字节的字节0xfe。这(从我有限的字符编码知识来看)是有意义的,因为它是十六进制字符串,而不是unicode/utf-8字符串。我见过有人使用
。decode('hex'))
,但这给了我
“hex”不是文本编码;使用codecs.decode()来处理任意编解码器
。所以我尝试了
codecs.decode(b“\xFE\x44\x00\x08\x02\x9F\x25”,“hex”)
,这让我
用“hex”编解码器解码失败(错误:奇数长度字符串)
…我迷路了!嗯,很抱歉。根据文档:
毕竟是pySerial中定义的接受
字节的。所以,你应该只使用
c.write(b“\xFE\x44\x00\x08\x02\x9F\x25”)
(如果它不起作用,请指定它不起作用的方式)。好吧……所以,我只是尴尬地尝试了c.write(b)\xFE\x44\x00\x08\x02\x9F\x25),它起作用了…错误最初一定来自字符串中的键入错误,其次来自我处理输出的方式(
ord()
不再需要在Python 3中处理输出).在过去的两天里,我不知怎么错过了这一点……无论如何,谢谢你的帮助!谢谢。不幸的是没有什么好处:
“utf-8”编解码器无法解码位置0:无效起始字节的字节0xfe
。这(从我有限的字符编码知识来看)有道理,因为它是一个十六进制字符串,而不是unicode/utf-8字符串。我见过有人使用
.decode('hex')
,但这给了我
“hex”不是文本编码;使用codecs.decode()处理任意编解码器
。所以我尝试了
编解码器.decode(b“\xFE\x44\x00\x08\x02\x9F\x25”,“hex”)
,它给了我
用“hex”编解码器解码失败(错误:奇数长度字符串)
…我迷路了!嗯,对不起。根据文档:
write
按照pySerial中的定义接受
字节
。所以,你应该只使用
c.write(b“\xFE\x44\x00\x08\x02\x9F\x25”)
(如果它不起作用,请指定它不起作用的方式)。好吧……那么,令人尴尬的是,我刚刚尝试了c.write(b“\xFE\x44\x00\x08\x02\x9F\x25”),它起了作用……错误最初一定来自字符串中的键入错误,其次是来自我处理输出的方式(
ord()
不再需要在Python 3中处理输出)。在过去两天的故障排除过程中,我不知怎的错过了这一点……无论如何,感谢您的帮助!