2016-11-25 12 views
0

Ich möchte die Kommunikation zwischen meinem Laptop und meinem Modul. Dafür erstelle ich eine Python-Datei, die einige Pakete an den UART sendet, den er lesen muss. Ich habe einen Python-Skript (Laptop), die ein Paket erstellt:Wie liest man nur die ersten beiden Zahlen? Python + UART

SOF= '24' 
SEND_PLAINTEXT= '72' 
SEND_KEY ='73' 
RECEIVE_CIPHERTEXT='74' 
SIZE_OF_FRAME= '10' 
for a in range (0,1): 

    line_array=lines[a] 
    plaintxt_16b=line_array[0:32] 
    plaintext= '24'+'72'+'32'+plaintxt_16b 
    ser.write (plaintext.encode()) 

Das letzte Paket ist 247232ccddeeff8899aabb4455667700112233

UART das Paket lesen, indem Sie diese Zeilen Code in C unter Verwendung von:

uint8_t rx_buffer[38]; 
int rx_length = dev_uart_ptr->uart_read(rx_buffer, 38); 

if (rx_length <38) 
{ 
    printf(rx_buffer); 
} 

Ich muss nur die zwei ersten Zahlen lesen, um zu testen, ob es der Anfang des Rahmens ist oder nicht. So habe ich meinen Code geändert:

uint8_t rx_buffer[2]; 
int rx_length = dev_uart_ptr->uart_read(rx_buffer,2); 

if (rx_length <2) 
{ 
    printf(rx_buffer); 
} 

Das Problem ist, dass die Zahlen, die angezeigt werden, sind 33 trotz ich 24 lesen wollen, wäre ich sehr dankbar, wenn ihr mir helfen könntet.

+0

Was macht die uart_read() Funktion? Welche Bibliotheken importieren Sie für diese Aufgabe? – Jalo

+0

Es erlaubt nur das Lesen von der UART, – tssmokey46

+0

Ihr Beitrag ist sehr verwirrend. Zuerst dachte ich, es wäre Python-Code, aber es scheint, dass es C/C++ - Code ist. Führst du es auf der anderen Seite des Kanals aus, nicht wahr? Wenn ja, sollten Sie die Bezeichnungen des Posts ändern und sie auf C/C++ setzen, da dies keine Python-Frage ist – Jalo

Antwort

2

ändern Diese Zeile plaintext= '24'+'72'+'32'+plaintxt_16b scheint von rechts nach links ausgeführt werden. Also die erste Sache im Puffer wird sein plaintxt_16b, dann der Rest.

Die Reihenfolge der Bytes ist auch von rechts nach links in dem Paket 247232ccddeeff8899aabb4455667700112233. Also das erste Byte (Index der 0) ist 0x33

18.| 17.| 16.| 15.| 14.| 13.| 12.| 11.| 10.| 9. | 8. | 7. | 6. | 5. | 4. | 3. | 2. | 1. | 0. 
--------------------------------------------------------------------------------------------- 
24 | 72 | 32 | cc | dd | ee | ff | 88 | 99 | aa | bb | 44 | 55 | 66 | 77 | 00 | 11 | 22 | 33 

Versuchen Sie Folgendes:

plaintext= plaintxt_16b + '32' + '72' + '24' 

und lassen Sie die UART-Code gleich.

+0

Sie haben mein upvote;) – Jalo

+0

@Bence Kaulis, Ihre Antwort gibt mir die richtige Lösung, aber, ich nicht wie könnte ich das hexadezimale Format in c verwenden, wie Sie in dieser Tabelle beschreiben. Könntest du mir bitte erklären? – tssmokey46

+0

@ tsmokey46 Bitte stellen Sie ein Problem/eine Frage und wenn es gelöst ist, gehen Sie nicht zum nächsten. Öffnen Sie eine neue Frage für Ihr nächstes Problem, und beziehen Sie sich vielleicht auf dieses. Also posten Sie bitte eine neue Frage und überlegen Sie genau, was Sie mit hexadezimalen Werten in C machen wollen. Hinweis: Wenn Sie nur 'if (rx_buffer [0] == 0x24)' vergleichen möchten. –

1

Ich kann Ihnen vorschlagen, Endianness von UART zu überprüfen.

Ich denke, Sie müssen die letzten 2 Tokens, nicht die ersten 2 Tokens lesen.

EDIT:

Soweit ich verstehe, Ihr UART-Modul wird aus dem Ende des Paketdaten zu senden durch Starten. Wenn Sie also versuchen, die ersten beiden Zahlen zu lesen, erhalten Sie 33, aber Sie sollten die letzten zwei Zahlen lesen, um 24 zu erhalten.

prüfen this

Seit @Jalo für die volle Antwort so viel darauf bestanden, hier geht es:

Wie ich bereits erwähnt, können Sie den letzten zwei Zahlen lesen müssen. Sie können dies erreichen, indem Sie Ihre Eingabe umkehren, indem Sie plaintext= '24'+'72'+'32'+plaintxt_16b in plaintext = plaintxt_16b + '32' + '72' + '24'

+0

Ich verstehe nicht, können Sie bitte eine Erklärung geben. – tssmokey46

+0

@ tsmokey46 https://en.wikipedia.org/wiki/Endianness –

+0

Fügen Sie eine vollständige Antwort, kein Vorschlag – Jalo

Verwandte Themen