python中二进制串行数据的动态解析
我不熟悉使用Python3进行数据采集。我正试图找到一种方法来解析Linux上串行端口的二进制数据python中二进制串行数据的动态解析,python,python-3.x,stream,binary,pyserial,Python,Python 3.x,Stream,Binary,Pyserial,我不熟悉使用Python3进行数据采集。我正试图找到一种方法来解析Linux上串行端口的二进制数据 import serial ser = serial.Serial( port='/dev/ttyS0', baudrate = 9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1) counte
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
是消息的结尾,0x4d
是消息的开始
我可以使用
y = map(ord,x)
print(y)
然后我有一种方法可以使用索引对消息重新排序,但肯定有一种更整洁的方法吗?如何创建一个从
0x4d
开始的列表进行解析?如果您使用的是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
中,这是ascii格式的BM
,可以在0x88
和0x00
之间的数据中看到,如\x88BM\x00
所示
我建议您只需在x
中的字节数组上迭代即可进行解析。不需要编码和映射
for b in x:
if b == 0x4d:
found_byte1 = True
... # etc
如果您使用的是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
中,这是ascii格式的BM
,可以在0x88
和0x00
之间的数据中看到,如\x88BM\x00
所示
我建议您只需在x
中的字节数组上迭代即可进行解析。不需要编码和映射
for b in x:
if b == 0x4d:
found_byte1 = True
... # etc
您好,我首先尝试了这个,如果您查看编码的十六进制字符串0x4d,但在第一次打印输出中它已被替换为\x88BM,我假设它包括0x88,但将0x42和0x4d与BM合并的方式相加。
\x88BM
是三个单独的字节。0x88(\x88)、0x42(B)和0x4d(M)好的,这是有意义的,所以要用十六进制进行编码,首先需要编码为十六进制?你是如何得到一个十六进制列表的?我认为你不需要编码。type
是由ser.read()
返回的对象吗?您好,我首先尝试了这个方法,如果您查看编码的十六进制字符串0x4d是否存在,但在第一次打印输出中它已被替换为\x88BM,我假设它包括0x88,但将0x42和0x4d与BM合并的方式相加。\x88BM
是三个单独的字节。0x88(\x88)、0x42(B)和0x4d(M)好的,这是有意义的,所以要用十六进制进行编码,首先需要编码为十六进制?你是如何得到一个十六进制列表的?我认为你不需要编码。ser.read()
返回的对象是什么类型的?