在python中即时解析二进制串行数据

时间:2017-01-29 18:48:05

标签: python python-3.x stream binary pyserial

我是使用Python3进行数据采集的新手。我正试图找到一种方法来解析Linux上串行端口的二进制数据。

abstract class ServerBase<C extends ClientBase<? extends ServerBase>>
{
    ArrayList<C> clients = new ArrayList<C>();
}
abstract class ClientBase<S extends ServerBase<? extends ClientBase>>
{
    S server;
}

这给了我一个我不确定格式的字符串:

import serial

ser = serial.Serial(   
    port='/dev/ttyS0',
    baudrate = 9600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    timeout=1)
counter = 0

while 1:
    x = ser.read(31)
    print (x)

使用

x='\x00\x00\x91\x00\x02\x88BM\x00\x1c\x00\x00\x00\x01\x00\x01\x00\x00\x00\x01\x00\x01\x00\xe1\x00K\x00\x1a\x00\x02\x00\x00'

给出一个十六进制值字符串

x.encode('hex')

其中x='000091000288**424d**001c00000001000100000001000100e1004b001a00020000' 是消息的结尾,0x42是消息的开头。

我可以使用

将其转换为基数10列表
0x4d

然后我有办法使用索引重新排序邮件,但肯定有一个更简洁的方法?如何创建一个从y = map(ord,x) print(y) 开始解析的列表?

1 个答案:

答案 0 :(得分:0)

如果您使用的是python3,则可能已经是字节:

x='\x00\x00\x91\x00\x02\x88BM\x00\x1c\x00\x00\x00\x01\x00\x01\x00\x00\x00\x01\x00\x01\x00\xe1\x00K\x00\x1a\x00\x02\x00\x00'

它可能看起来像这样,因为Python为你打印,所有非ascii字符都以十六进制显示。您的消息开头位于0x42, 0x4d,其中BM位于ascii中,可以在0x880x00之间的数据中看作\x88BM\x00

我建议只需迭代x中的字节数组来进行解析。不需要编码和映射。

for b in x:
    if b == 0x4d:
        found_byte1 = True
    ...  # etc