2016-09-10 3 views
1

Ich versuche, eine Zeichenfolge Variable enthält den Befehl senden.Senden Zeichenfolge an serial.to_bytes funktioniert nicht

So:

value="[0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a]" 
self.s.write(serial.to_bytes(value)) 

Die oben ausfällt. Gibt keinen Fehler.

Aber es funktioniert, wenn ich einen Wert wie folgt senden:

self.s.write(serial.to_bytes([0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a])) 

Ich habe auch versucht Zeichenfolge wie folgt zu senden:

self.s.write(serial.to_bytes(str(value))) 

noch nicht funktioniert. Kann mir bitte jemand sagen, wie man den Wert sendet, indem er in einer Zeichenfolge speichert?

Ich möchte, dies zu tun:

value="[0x"+anotherstring+",0x"+string2+"0x33, 0x0a]" 

und den Wert zu senden.

Danke!

+0

Verwenden Sie Python 2 oder Python 3? Versuchen Sie in Python 3 's.write (b" Hello ")', um anstelle einer Unicode-Zeichenfolge eine Bytefolge zu senden. – Dietrich

+0

@Dietrich ich benutze 2.7 – arslion

Antwort

2

Wenn eine Liste von ganzen Zahlen arbeitet vorbei für Sie dann Konvertieren Sie einfach Ihre hexadezimalen Darstellungen in Ganzzahlen und fügen Sie sie in eine Liste ein.

Ausführliche Schritte:

  1. Öffnen Sie ein Python-Interpreter

  2. Import serial und einen seriellen Port öffnen, rufen Sie es ser.

  3. Kopieren Sie den Code unten und in der Python-Interpreter einfügen:

Der Code:

command = '310a320a330a' 
hex_values = ['0x' + command[0:2], '0x' + command[2:4], 
       '0x' + command[4:6], '0x' + command[6:8], 
       '0x' + command[8:10], '0x' + command[10:12]] 
int_values = [int(h, base=16) for h in hex_values] 
ser.write(serial.to_bytes(int_values)) 

Es wird die gleiche Wirkung haben, die gerade dies:

ser.write(serial.to_bytes([0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a])) 

tatsächlich können Sie testen, dass int_values == [0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a]True ist, so dass Sie wr sind genau dasselbe.

+0

Ich habe diese '310a320a330a' hex Daten konvertiert aus einer Zeichenfolge mit 'encode (' hex ')' Ich möchte Hex-Daten in diese konvertieren: '[ 0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a] 'und dann als Variable an diese' s.write (serial.to_bytes (value)) ' – arslion

+0

Das ist genau das, was der Code in meiner Antwort außer (a) I tut benutzte den Namen 'int_values' anstelle von' value', um Klarheit zu schaffen. Fühlen Sie sich frei, es auf den Inhalt Ihres Herzens zu ändern. (b) Ich nahm an, dass Ihre hex Daten bereits in einzelne Bytes aufgeteilt sind, denn so scheint es in Ihrer Frage zu sein um es zu bearbeiten, wenn du denkst, dass etwas fehlt. – Goyo

+0

getan genau die gleiche Sache, die Sie getan haben, gibt mir Syntaxfehler auf Python 2.7 @goyo – arslion

4

serial.to_bytes nimmt eine Sequenz als Eingabe. Sie sollten in doppelte Anführungszeichen value entfernen anstelle eines str eine Folge von ganzen Zahlen zu übergeben, die die Sequenz, die Sie weitergeben möchten:

value = [0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a] 
self.s.write(serial.to_bytes(value)) # works now 

Im ersten Fall können Sie eine Folge von Bytes gesendet darstellt "[0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a]". Jetzt senden Sie die Sequenz [0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a] wie erwartet.


Wenn Sie eine Zeichenfolge senden möchten, senden Sie es einfach als bytes:

# Python 2 
self.s.write('this is my string') 
text = 'a string' 
self.s.write(text) 

# Python 3 
self.s.write(b'this is my string') 
text = 'a string' 
self.s.write(text.encode()) 

Und für eine Sequenz:

for value in values: 
    # Python 2 
    self.s.write(value) 

    # Python 3 
    self.s.write(value.encode()) 
+0

'str' ist auch eine Sequenz ... es passiert einfach, dass die Darstellung einer Liste von Ints mit Hex-Notation ist anders als die eigentliche Liste selbst ... –

+0

Ich möchte mehrere Werte beitreten wie dieser Wert = "[0x" + Anotherstring + ", 0x" + String2' wie kann ich das tun? – arslion

+0

@JonClements Ja, ich weiß das, aber in diesem Fall ist es nicht das, wonach Arslion sucht. –

Verwandte Themen