Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中二进制串行数据的动态解析_Python_Python 3.x_Stream_Binary_Pyserial - Fatal编程技术网

python中二进制串行数据的动态解析

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

我不熟悉使用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)
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()
返回的对象是什么类型的?