2010-12-01 6 views
0

Ich habe ein gutes Stück gesucht und gelesen, aber habe keine genaue Antwort gefunden. Ich mache Python-Anwendung, die mit anderen über den seriellen Port kommunizieren wird. Ich habe PySerial verwendet, um dies zu erreichen. Die Arten von Paketen, die ich senden möchte, sind Statusinformationen und Datenlesungen. schlage ich vor meiner Pakete wie folgt zu bilden:Python: Was ist der beste Weg, um Statusbits und Zeitstempel mit PySerial zu senden?

[ Start Byte ][ Length ][ Message ][ End Byte ][ Checksum ] 

Obwohl ich nicht glaube, ich das Ende Byte müssen, da dort eine Länge haben. Hab ich recht?

Ich denke, die ‚Message‘ Teil des Pakets für Statusinformationen wie so die Gestaltung:

[ MsgTypeID ][ PacketID ][ Status Bits ][ Timestamp ] 

Die Botschaft ID ist nur zu unterscheiden, dass dies ein Statuspaket ist eher als ein Datenpaket. Die Statusinformation selbst besteht aus 16 Bits, die den Zustand einer Anzahl von Subsystemen in der sendenden Anwendung darstellen. Für einige dieser Subsysteme liefert ein einzelnes Bit genügend Informationen ("0" bedeutet, dass das Subsystem ausgeschaltet ist/niedrig/falsch, "1" für "Ein/Hoch/Wahr"). Andere benötigen 2 oder 3 Bits (die Zustände und dergleichen darstellen). Um das System zu prototypieren, konstruiere ich einfach einen String, der die Bits zu einem so etwas wie '1001110101101100' verkettet und diesen an den seriellen Port sendet, wobei die Checksumme ein Modulo 256 der Statusbits ist.

Ich bin ziemlich neu in Python und serielle Kommunikation, aber ich weiß, das ist wahrscheinlich eine Verschwendung von Bandbreite. Ich weiß, dass PySerial Strings senden muss, aber jedes Bit als '0' oder '1' darstellen muss, so dass für jedes Bit eine vollständige String-Repräsentation verwendet wird. Ich habe mich gefragt, was der beste Weg ist, diese Bits zu senden, um die Bandbreite zu reduzieren?

Zum Beispiel würde ich nehmen jeweils 8 Bits, wandeln sie verketteten hex Bytes verhexen und zu senden, wie in:

'10011101' + '01101100' 

dargestellt als

'\x9d' + '\x6c' 

oder sollte ich sie als ASCII senden ? Ich habe auch das Struct-Modul erwähnt. Sollte ich stattdessen diese Route gehen?

Die andere Sache, die ich mich wundere, ist, wie man die Zeitstempel Teile der Nachricht darstellt.

Jede Hilfe, Vorschläge, die Sie mir geben können, würde sehr geschätzt werden. sehr viel

Thanks :)

Antwort

0

Nun, natürlich braucht es einen Byte pro Zeichen gesendet, so dass, wenn Sie Ihre Daten als ASCII-String kodieren können (str in Python 2, bytes in Python 3), das ist die effizienteste . Das struct Modul ist definitiv eine gute Idee: es packt Python-Daten in eine Zeichenfolge (und entpackt es am anderen Ende). Das wird für deine Zeitstempel funktionieren; packen Sie sie als beliebigen Typ von int oder lange scheint angemessen (siehe die verknüpfte Dokumentation für Ihre Optionen).

struct macht jedoch keine einzelnen Bits, also müssen Sie das selbst tun.Ich habe ein Wörterbuch aufgebaut, bevor Zeichen in Gruppen von acht True/False Werte zu übersetzen:

zu entschlüsseln:

pot = [2**x for x in range(8)] # Powers of 2 (bytes with one 1 and seven 0s) 
bitvalues = {} 
for x in range(256): 
    bitvalues[chr(x)] = [(x & y) != 0 for y in pot] 

Um ein Wörterbuch für die Codierung zu machen, ersetzen Sie die letzte Zeile mit:

bitvalues[tuple((x & y) != 0 for y in pot)] = chr(x) 

Wenn Sie von Strings von 1 und 0 statt kodieren/dekodieren möchten, ersetzen Sie das Bit die Liste/Tupel mit der Erzeugung:

"".join("1" if (x&y) else "0" for y in pot) 
+0

Danke für Ihre Antwort Thomas. – Jack

+0

@Jack: Gern geschehen. Kannst du tun, was du versuchst? –

+0

Ich werde mir das Strukturmodul ansehen. Ich bin mir jedoch nicht sicher, ob ich verstehe, was du meinst. Wenn ich die Bits als '11011001' dargestellt habe, wie bekomme ich die codierte Zeichenketten-Darstellung dieser binären Zahl (schon Zeichenfolge dargestellt)? – Jack

0

Wie oft erwarten Sie diese Updates zu senden? Wenn update_frequency * length_of_message weit unter der Datenrate der seriellen Verbindung liegt, gibt es wenig Grund, sich über die Effizienz der Datencodierung Sorgen zu machen, und Sie könnten sogar erwägen, die Dinge auf ein besser lesbares Format auszuweiten, besonders wenn Sie es tun fange an zu beginnen.

+0

Hallo Russell. Ich habe hier nur eine Art von Paket beschrieben. Diese Statusinfo wird nur einmal pro Sekunde gesendet. Es gibt aber auch Datenpakete, die ich 100 mal pro Sekunde senden möchte. Ich brauche einen maximalen Datendurchsatz und nicht die meisten menschlichen Lesbarkeit, so dass ich so viel wie möglich übertragen muss. Vielen Dank – Jack

Verwandte Themen