【问题标题】:Read complete binary message using pySerial使用 pySerial 读取完整的二进制消息
【发布时间】:2018-03-16 13:53:26
【问题描述】:

我正在尝试使用 pySerial 将二进制数据从一个串行端口重定向到数据库。

问题在于 pySerial 只允许读取带有 serial.read() 的单个字符和一整行直到带有 serial.readline 的 EOL 字符。但是,使用的协议 (RTCMv3) 是二进制的,并且消息的长度各不相同,这意味着 readline 将不起作用并且 read 只会给我一个字节序列。我想要实现的是区分各个消息。

我在 socat 上也试过同样的方法。 Socat 能够以某种方式在不了解协议结构本身的情况下找出单个消息的长度:

socat -u -x /dev/ttyUSB2,raw -
> 2018/03/15 21:04:24.394224  length=171 from=9 to=179 d3 00 a5 3e c0 00 72 
7d b1 40 a0 3c 26 c5 91 fc fc 9f d3 30 f0 07 7f 82 27 fd 82  [...] 9f f0 f8

有没有类似的方式用 Python/pySerial 实现这个?

【问题讨论】:

    标签: python pyserial socat


    【解决方案1】:

    我认为您正在寻找 serial.readline()serial.read_until() 方法:

    只要找到相同的结束分隔符,两者都允许可变长度消息。两者都运行良好,但换行符有时可能是正在传输的二进制数据的正常部分,这对serial.readline() 造成了困难。如果您可以检测到消息帧的结束字符或分隔符,那么serial.read_until() 将很有用。

    使用像COBS 这样保证删除分隔符(零字节,b'\x00')的编码方法将有助于找到每条消息的结尾。如果您无法更改发送协议,您可能需要搜索它使用的分隔符和数据包结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多