我尝试使用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实现这个?
答案 0 :(得分:1)
我认为您正在寻找serial.readline()
或
serial.read_until()
个方法:
https://pyserial.readthedocs.io/en/latest/pyserial_api.html#serial.Serial.readline
https://pyserial.readthedocs.io/en/latest/pyserial_api.html#serial.Serial.read_until
只要找到相同的结束定界符,它们都允许长度可变的消息。两者都工作良好,但是换行符有时可能是正在传输的二进制数据的正常部分,这给serial.readline()
带来了困难。如果您可以检测到消息帧的结束字符或定界符,那么serial.read_until()
将很有用。
使用像COBS这样的编码方法来保证删除定界符(零字节,b'\x00'
)将有助于找到每个消息的结尾。如果您无法更改发送协议,则可能需要搜索其使用的定界符和数据包结构。