我是使用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)
开始解析的列表?
答案 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中,可以在0x88
和0x00
之间的数据中看作\x88BM\x00
。
我建议只需迭代x
中的字节数组来进行解析。不需要编码和映射。
for b in x:
if b == 0x4d:
found_byte1 = True
... # etc