【问题标题】:pyserial Python2/3 string headachepyserial Python/3 字符串头痛
【发布时间】:2017-12-05 02:45:32
【问题描述】:

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

有什么见解吗?我应该在 Python 3 中发送什么以便传感器接收到相同的信号?我已经无计可施了……

我应该补充一点,我对串行连接完全陌生(嗯...... 1 周大),并且(尽管阅读了很多)我很难理解不同的字符/字符串格式......因此问号上面的cmets。请适当地提出答案:)。

提前致谢!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢。不幸的是没有好处:'utf-8' codec can't decode byte 0xfe in position 0: invalid start byte。哪个(根据我对字符编码的有限知识)是有道理的,因为它是十六进制字符串,而不是 unicode/utf-8 字符串。我见过有人使用.decode('hex'),但这给了我'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs。所以我尝试了codecs.decode(b"\xFE\x44\x00\x08\x02\x9F\x25", 'hex'),它给了我decoding with 'hex' codec failed (Error: Odd-length string)...我迷路了!
    • 嗯,对不起。根据文档: pySerial 中定义的pyserial.readthedocs.io/en/latest/pyserial_api.html write 毕竟接受bytes。因此,您应该只使用c.write(b"\xFE\x44\x00\x08\x02\x9F\x25")(如果它不起作用,请指定以何种方式它不起作用)。
    • OK...所以,令人尴尬的是,我刚刚尝试了 c.write(b"\xFE\x44\x00\x08\x02\x9F\x25") 并且它起作用了......错误最初必须来自字符串中的拼写错误,其次来自我处理输出的方式(ord() 不再需要在 Python 3 中处理输出)。在过去的 2 天里,我不知何故错过了我试图解决此问题的...无论如何,感谢您的帮助!
    【解决方案2】:

    解决方案

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      相关资源
      最近更新 更多