2017-05-02 4 views
0

Ich verwende Pyserial, um Bytes auf eine Verbindung zu schreiben.Bytes schreiben

Eines der Dinge, mit denen ich zu kämpfen habe, ist herauszufinden, wie man genau die Bits ausgibt, die ich will. Ich habe Erfolg die Bytes eines Strings ascii Form, wie

variable = 'h'.encode() 
serial.write(variable) 

auszuschreiben hatte Und das wird die Bits H erfolgreich auszuschreiben. Aber wenn ich sowas mit b '\ b001 mache, wird es nicht 001 aufschreiben, wie ich es mir erhofft hätte.

Gibt es eine Möglichkeit, dies zu tun, so kann ich einfach Variablen mit 1 und 0 definieren und dann die Schreibfunktion verwenden.

Ich habe versucht, auch so definieren:

y = 0x13 
out = s.write(y) 

, die nach der Dokumentation des Schreibfunktion, die Funktion geschrieben, um die Menge von Bytes zurückgibt. Als ich diesen spezifischen Code lief, gab es 19

+0

Es ist nicht klar, was Sie versuchen zu tun. Können Sie zeigen, was Sie eingeben möchten und was Sie daraus zu generieren hoffen? –

Antwort

1

Wenn ich richtig verstehe, versuchen Sie, einen Weg zu finden, um binäre Daten als Python-Bytes-Objekte zu senden, und Hex-Daten als Python-Bytes-Objekte (im zweiten Teil).

es kann Counter intuitiv sein, aber Pythons b'' Syntax steht nicht für binary, but bytes daher warum b'0010101' funktioniert nicht wie Sie wollen.

Bytes akzeptiert Hex-Daten standardmäßig als Byte, zu diesem Zweck müssen Sie die Hex-Daten als b'\xFF\x04' formatieren. Zum Beispiel

byte_obj = bytes(b'\xFF\x04') 

Dies kann dann über Pyserial gesendet werden. Um eine Binärdatei zu erstellen, müssen Sie die Methoden python int verwenden, also die int(number, base) Methode.

Dies wird weiter erklärt here

aber dies kann grundsätzlich über

bin_to_int int('01010101', 2) 
byte_obj = bytes([bin_to_int]) #requires array of ints 

Leider nur durchgeführt werden, dass für Binärketten der Größe 8 Bits funktioniert (und es wird Ihnen ein Fehler, den Sie so zu sagen) . Um dies zu umgehen, können Sie wie folgt vorgehen:

bin_to_int int('0101010101010101', 2) 
# to_bytes takes size in bytes and endianess, which is the order the bytes are placed. 
byte_obj = bin_to_int.to_bytes(2, 'little') 

Little-Endian ist least significant byte in smallest address (dh Index 0) groß ist gegenüber

der größeren binäre Integer-Methode vorsichtig sein, ich bin nicht sicher was Python intern tut, um binär in eine ganze Zahl zu konvertieren, aber für willkürlich große binäre Daten würde ich vermuten, verlangsamen wegen der Art, wie ich die Umwandlung niavely implementieren würde. Ich gebe Ihnen ein Beispiel dafür, warum, wie ich die binäre Integer ohne Vorzeichen Umwandlung tun würde:

bit_string = "101010101..." 
exponent = 0 
decimal_value = 0 
for bit in bit_string: 
    decimal_value += int(bit)**exponent 
    exponent += 1 

Es ist vielleicht nicht auf den ersten ganz offensichtlich sein, aber weil Python Ints arbitraily sind so bemessen, schließlich Sie gehen zu bekommen bis zu dem Punkt, an dem Sie sehr große Ints zusammenfügen, außerhalb der typischen arithmetischen Int-Größe (dh größer als 64 Bit).Dies bedeutet, dass im Laufe der Zeit mit großen binären Werten (die Sie wahrscheinlich produzieren werden) Sie nichtlineare Zeitkomplexität erhalten werden, da N die Größe in Bytes der Additionen sowie außerhalb von 64 Bit (und mehr Verarbeitungswille) erhöht muss durchgeführt werden, um die Addition durchzuführen, die O (n_bytes) sein wird)

Um dies zu lösen, müssten Sie nur eine Funktion erstellen, die die binären Werte vor der Konvertierung in Bytes mit trennt sie (wie binary_to_bytes(binary_string))

Verwandte Themen