2017-01-29 6 views
1

Ich bin neu bei der Verwendung von Python3 für die Datenerfassung. Ich versuche einen Weg zu finden, um binäre Daten von einem seriellen Port unter Linux zu analysieren.On-the-Fly-Analyse von binären seriellen Daten in Python

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) 

Das gibt mir eine Zeichenfolge, die ich nicht sicher über das Format von bin:

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' 

mit

x.encode('hex') 

eine Reihe von Hex gibt Werte

x='000091000288**424d**001c00000001000100000001000100e1004b001a00020000' 

wo 0x42 ist das Ende von mir ssage und 0x4d ist der Beginn der Nachricht.

ich es in eine Basis-10-Liste konvertieren kann mit

y = map(ord,x) 
print(y) 

Dann habe ich eine Möglichkeit, die Nachricht über die Indizes neu zu ordnen, aber sicher gibt es eine sauberere Art und Weise? Wie erstelle ich eine Liste, die bei 0x4d beginnt, mit zu analysieren?

Antwort

0

Wenn Sie python3 verwenden, ist dies wahrscheinlich bereits Bytes

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' 

Es sieht wahrscheinlich so, weil Python es für Sie gedruckt, und alle nicht-ASCII-Zeichen sind in hex gezeigt. Ihr Anfang der Nachricht ist in 0x42, 0x4d, die BM in ASCII ist und kann in den Daten oben zwischen 0x88 und 0x00 als \x88BM\x00 gesehen werden.

Ich würde vorschlagen, nur über die Byte-Array in x Iterieren, um Ihre Analyse zu tun. Die Codierung und Zuordnung sollte nicht benötigt werden.

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

Hallo, habe ich versucht, diese erste, wenn man sich die codierten Hex-String aussehen 0x4D gibt es aber in der ersten Ausdruck mit \ x88BM ersetzt wurde, die ich enthält 0x88 nehmen, sondern fassen, wie fusionierte 0x42 und 0x4D mit BM. – josh

+1

'\ x88BM' ist drei separate Bytes. 0x88 (\ x88), 0x42 (B) & 0x4d (M) –

+0

ok, das macht Sinn, also müsste man im hex Code zuerst hexen? Wie machst du das, um eine Hex-Liste zu bekommen? – josh

Verwandte Themen