使用pySerial读取完整的二进制消息

时间:2018-03-16 13:53:27

标签: python pyserial socat

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

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

我和socat一样尝试过。 Socat能够在不知道protocoll结构本身的情况下找到单个消息的长度:

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实现这个?

1 个答案:

答案 0 :(得分:1)

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

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

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