2016-10-22 1 views
0

Ich bin kein Python-Programmierer, sondern ein eher elektronischer Schaltungsentwickler, aber diesmal muss ich einige rohe Daten verarbeiten, die von einem Mikrocontroller über den RS232-Port zum Python-Skript gesendet werden (das von PHP-Skript aufgerufen wird).Verarbeitung von Rohdaten, die von der seriellen Schnittstelle mit der seriellen Python-Bibliothek gelesen werden?

Ich habe einige Stunden damit verbracht, die besten Möglichkeiten zu finden, rohe Bytes vom seriellen (RS232) Port mit Python zu lesen, und ich habe die Ergebnisse erhalten - aber ich hätte gerne, wenn jemand gewisse Inkonsistenzen klären könnte Erforschung und hier sind sie:

1:
ich eine Menge Leute sehen, die ähnliche Frage gestellt hatte gefragt, ob sie serial oder pySerial-Modul verwenden und wie haben sie die Serien Bibliothek installieren. Ich kann nur sagen, dass ich nicht wirklich weiß, welches Modul ich verwende, da das Modul out-of-the-box funktionierte. Irgendwo lese ich serial und pySerial ist das gleiche, aber ich kann nicht finden, ob das wahr ist. Alles was ich weiß ist, dass ich Python 2.7.9 mit Raspbian OS benutze.

2:
Ich habe gelesen, es gibt read() und readline() Methoden für von der seriellen Schnittstelle zu lesen, aber in den pySerial API docs es keine Erwähnung des Verfahrens readline() ist. Darüber hinaus entdeckte ich, dass das Argument 'Anzahl der zu lesenden Bytes' sowohl an die Methode readline() als auch an die Methode read() übergeben werden kann (und genauso funktioniert, indem die Anzahl der zu lesenden Bytes begrenzt wird), aber das kann nicht dokumentiert werden .

3:
Bei der Suche nach, wie Sie feststellen, ob alle der Daten aus dem RS232-Puffer gelesen worden Ich habe here fand den folgenden Code ein:

read_byte = ser.read() 
while read_byte is not None: 
    read_byte = ser.read() 
    print '%x' % ord(read_byte) 

aber, dass die Ergebnisse mit dem:

Traceback (most recent call last): 
    File "./testread.py", line 53, in <module> 
    read_all() 
    File "./testread.py", line 32, in read_all 
    print '%x' % ord(read_byte) 
TypeError: ord() expected a character, but string of length 0 found 

beim Lesen der l ast Byte aus dem Puffer und ich konnte den leeren Puffer nur mit dem folgenden Code erkennen:

while True: 
    c = rs232.read() 
    if len(c) == 0: 
     break 
    print int(c.encode("hex"), 16), " ", 

so bin ich nicht sicher, ob der Code, der für mich nicht für einige serielle Bibliothek ist nicht funktioniert, die andere ist als meins. Mein Code für Port openinig ist BTW:

rs232 = serial.Serial(
    port = '/dev/ttyUSB0', 
    baudrate = 2400, 
    parity = serial.PARITY_NONE, 
    stopbits = serial.STOPBITS_ONE, 
    bytesize = serial.EIGHTBITS, 
    timeout = 1 
) 

4:
Die Daten, die ich von uC empfange ist im Format:

0x16 0x02 0x0b 0xc9 ... 0x0d 0x0a 

Das some raw bytes + \r\n ist. Da 'rohe Bytes' 0x00 enthalten kann, kann jemand bestätigen, dass es kein Problem bezüglich des Lesens der Bytes in die Python-String-Variable gibt? Soweit ich weiß, sollte das gut funktionieren, bin aber nicht 100% ig sicher.

Antwort

1

PySerial funktioniert für mich, obwohl ich es nicht auf einem Pi verwendet habe.

3: Read() gibt eine Zeichenkette zurück - das ist Null, wenn keine Daten gelesen werden, also ist Ihre spätere Version korrekt.Da eine Zeichenfolge kein Zeichen ist, sollten Sie z. ord (read_byte [0]) die Zahl entsprechend dem ersten Zeichen drucken (wenn die Länge der Zeichenfolge> 0) Ihre Funktion:

while True: 
    c = rs232.read() 
    if len(c) == 0: 
     break 
    print int(c.encode("hex"), 16), " ", 

Needs etwas die Daten lesen zu akkumulieren Zugabe, sonst wird es ausgelöst wird,

rcvd = "" 
while True: 
    c = rs232.read() 
    if len(c) == 0: 
     break 
    rcvd += c 
    for ch in c: 
     print ord(ch), " ", 
entfernt

4: Ja, Sie können nul erhalten und setzen (0x00) Bytes in einem String. Zum Beispiel:

a="\x00" 
print len(a) 

druckt Länge 1

+0

Does 'Ja, Sie können aber 0 Bytes in einem String.', Bedeuten: 'Ja, Sie können aber * ohne * Null-Bytes in einem String'? Was ich gerne wissen würde ist, wenn z.B. '0x00, 0x00, 0x00, 0x00, 0x0d, 0x0a', die von RS232 empfangen und einer String-Variablen zugewiesen wurden, können zu Problemen führen. Wie ich verstehe, sind die interne Zeichenfolgendarstellung nullterminierte C-Zeichenfolgen, aber ich kann nicht finden, ob Nullen trotzdem auf der High-Level-Darstellung der internen Repräsentation gespeichert werden können. –

+0

Die interne Darstellung von Strings in dem üblichen Python, das wir unter Linux/Windows verwenden, ist nicht terminiert. Sie können beliebige Werte in eine Zeichenfolge eingeben. – barny

+0

Das würde bedeuten, dass [vided-up anwer] (http://stackoverflow.com/a/24409793/1324175) sagt: '* Intern ist die beliebteste Python-Implementierung in C geschrieben, also ist dort wahrscheinlich ein NULL-terminiert Schnur irgendwo unter der Haube. * ', ist falsch? –

Verwandte Themen