2016-08-15 5 views
0

Ich benutze Python in Raspberry Pi und mein Paket ist in Hexadezimalwert wie "0x750x010x010x060x000x08". Ich mag die serielle Kommunikation zwischen UART und Raspberry Pi so dass ich ein Programm mit Python in Raspberry Pi geschrieben und ich bin auf dem Terminal überprüft Daten, aber wenn ich in Terminal ASCII Option ausgewählt es unter Ausgabe zeigt:Raspberry Pi - Wie hex Wert zu drucken?

75 
01 
01 
06 
00 
08 

Und wenn ich ausgewählte Hex-Option im Terminal zeigt es nicht über Ausgabe. Jetzt möchte ich über Ausgabe, wenn ich Hex-Option, aber nicht ASCII-Option auswählen werde. Also wie bekomme ich das? Wenn ich es in Hex oder Byte oder irgendeinen anderen konvertieren muss, als mir den Code in Python zu sagen.

Antwort

0
import serial 

port=serial.Serial("/dev/ttyAMA0",baudrate=115200,timeout=3.0) 

while True: 
    a="0x750x010x010x060x000x08" 
    b=a.replace("0x"," ") 
    #print b 
    alist = b.split(" ") 
    for element in alist 
     port.write("\r\n"+str(element)) 

dies die gewünschte formatierte Daten gibt möchten Sie

+0

thank u abhishek .. aber dies wird Ausgabe in Himbeer Pi-Terminal geben ... Ich möchte Ausgabe in Uart Terminal durch Auswahl Hex-Option in Uart Terminal –

+0

Bitte erklären ganze Szenario so kann ich Ihnen helfen –

+0

Ich habe Snapshot der Terminal-Fenster-Ausgabe angeschlossen ... Sie sehen können in meiner bearbeiteten Frage .. kann ich sehen, dass ich asci gewählt habe Ich Option, aber wenn ich hex Option wählen wird es nicht geben diese Ausgabe ... Ich möchte diese gleiche Ausgabe, wenn ich hex Option, ich möchte nicht diese Ausgabe in ascii Option –

0

Zu allererst Ihre for Schleife und if statment sind hier falsch verwendet, und sie sind nicht erforderlich. Die while Schleife kann equivently werden rewriten wie:

a = "0x750x010x010x060x000x08" 
b = a.replace("0x", " ") 
while True: 
     port.write("\r\n"+b) 

Ihr Haupt misanderstanding ist, dass Sie davon ausgehen, Python versteht man über Hex-Zahlen iterieren wollen. Aber das tut es nicht. In Ihrer ursprünglichen Schleife wiederholt es nur den Buchstaben a Buchstabe für Buchstabe. Und tatsächlich ändert man bei jeder Iteration von for den orignal a String auf "75 01 01 06 00 08" und sendet ihn als String.

Wenn Sie Bytes senden müssen, sollten Sie Ihre Zeichenfolge in separate Datensätze mit jedem Byte der Information teilen und diese Datensätze in Bytes konvertieren. Hier ist der Code für das

a = "0x750x010x010x060x000x08" 
b1 = a.split("0x") 
# b1 is ["", "75", "01", "01", "06", "00", "08"], the values are still strings 
b2 = [int(x, 16) for x in b1[1:]] 
# b2 is a list of integers, the values calculated from strings assuming they are hex (16-bit) numbers 
# use b1[1:] to cut the first blank string 
b = str(bytearray(b2)) 
#b joins values list into a bytes string (each interger transformed into one byte) 
while True: 
     port.write("\r\n" + b) 

Update für Frage in den Kommentaren: Wenn a Format ist wie dieser "0x750101060008", können Sie es nur um 2 Buchstaben aufgeteilt:

b1 = [a[2*i:2*i+2] for i in range(len(a)/2)] 
+0

danke u ... aber dies wird Fehler wie geben b2 = [int (x, 16) für x in b1] ValueError: ungültiges Literal für int() mit Basis 16: '' ... also wie löst man das? –

+0

Entschuldigung, behoben. Das Problem war, dass die Teilung das erste Element mit einer leeren Zeichenfolge ergibt. –

+0

danke dir so viel .. es genau geben Ausgabe, was ich will, wenn Sie die Hex-Option im Terminalfenster von Uart –