2016-08-01 45 views
-1

Ich versuche Daten von einem Sensor zu lesen, der über UART mit einem MCU verbunden ist. Bei der Stromversorgung gibt der Sensor kontinuierlich ein ASCII-Großbuchstaben "R" aus, gefolgt von vier ASCII-Zeichen, die die Entfernung in Millimetern darstellen, gefolgt von einem Wagenrücklauf (ASCII 13).c Programmierlogik zum Lesen des Sensors über UART

Ich fragte mich, ob jemand mir helfen könnte, eine Logik zu finden, um eine Lesung z. 9999 als eine Variable namens Lesen.

Soll ich die blockierende oder nicht blockierende Funktion verwenden und wie würde ich die Zeichen isolieren, wenn die Daten strömen?

+1

Was denken Sie sollten Sie verwenden? –

+0

Blockieren bedeutet, dass die Funktion nicht zurückkehrt, bis ein Zeichen eintrifft. Non-Blocking bedeutet, dass es zurückgibt, ob ein Charakter verfügbar ist oder nicht (und es wird Sie wissen lassen, ob es einen gab). Ob Sie blockieren oder nicht blockieren wollen, hängt vom Rest Ihrer Logik ab, also müssen Sie das selbst beantworten. – lurker

Antwort

0

Zuerst würde ich mit der blockierenden Version gehen. Ich nehme an, dass Sie am Anfang fehlende Zeichen erwarten könnten, da der Sensor vor dem eigentlichen Lesen von Daten mit dem Streamen von Zeichen beginnen könnte. Wenn der UART also voll ist, brauchen Sie ihn vielleicht. Also Beispielcode wäre:

#define CR (13) 
uart_t my_uart; // You need to setup this 
uart_status_t status; 
uint8_t c; 
int status; 
char distance[255] = { 0 }; // Whatever, large enough 
int seen_r = 0; // You have not yet seen 'R' 
int offset = 0; 

while ((status = uart_read(my_uart, &c, &status)) == 0) 
{ 
    if (seen_r) 
    { 
     if (c == CR) 
     { 
      printf("Distance: %s\n", distance); 
      seen_r = 0; 
      memset(distance, 0, sizeof(distance)); 
     } 
     if (offset < sizeof(distance)-1) 
     { 
      distance[offset++] = (char)c; 
     } 
     else 
     { 
      printf("Unexpected size, reset!\n"); 
      seen_r = 0; 
      memset(distance, 0, sizeof(distance)); 
     } 
    } 
    else 
    { 
     if (c != 'R') continue; 
     seen_r = 1; 
    } 
} 

Natürlich ist dies ungeprüfter Code, aber es kann Ihnen einige Hinweise geben. Grundsätzlich haben Sie eine Zustandsmaschine, die mit 'R' beginnt und mit CR endet.

+0

Schlagen Sie 'if (offset chux

+0

@Aif danke für deine Hilfe - schnelle Frage - wo wird 'seen_r' auf 1 gesetzt - um in die erste if-Schleife zu gelangen? Auch ist "next" ein Schlüsselwort in c? – gatherriver

+1

Sie haben Recht, korrigieren. Danke auch @chux. – Aif