Forum: Mikrocontroller und Digitale Elektronik AVR Uart Strings einlesen


von Joerg M. (Firma: TU Wien) (pinning)


Lesenswert?

Zur Uart-Programmierung  verwende die C-Bibliothek von Peter Fleury.
Hier gibt es die Möglichkeit einen einzelnen Charakter zu empfangen
(uart_getc()). Wie bewerkstellige ich das Einlesen eines ganzen Strings
(Text von einem externen Messgerät)?
Hat hier jemand schon mal was programmiert?

von Karl heinz B. (kbucheg)


Lesenswert?

Das allerwichtigste, das du klären musst ist:
Woran kann man erkennen das der übertragene String
jetzt zuende ist?

Das ist das der Dreh- und Angelpunkt in der ganzen Sache.
Normalerweise wird dazu ein spezielles Zeichen benutzt.
Sei dies jetzt ein Carriage Return oder ein ';', sei es
ein '.' oder sonst irgendein Sonderzeichen. Denkbar wäre
auch, dass mit dem ersten Leerzeichen der String zuende ist,
oder das der zu übertragende String in " eingeschlossen wird.
Es gibt mit Sicherheit noch x andere verschiedene Möglichkeiten
die mir jetzt in 20 Sekunden nicht einfallen.

Und daher gibt es keine fertige Funktionen.
In dem Moment aber, in dem du weist welche Methode du
benutzen kannst/willst ergibt sich die String Lesefunktion
praktisch von selbst. Es läuft letztendlich immer auf
eine Schleife hinaus, die einzelne Zeichen einiest und im
Zielstring speichert. Wie die Schleifenabbruchbedingung jetzt
konkret aussieht ergibt sich aus der gewählten Methode, wie das
Ende des zu übertragenden Strings aussieht.

Benutzt du zb. einen ';'

void uart_gets( char* Buffer, int BufferLen )
{
  int i = 0;
  char c;

  while( ( c = uart_getc() ) != ';' && i < BufferLen - 1 )
    Buffer[ i++ ] = c;

  Buffer[i] = '\0';
}

von Joerg M. (Firma: TU Wien) (pinning)


Lesenswert?

Danke!!
ich hatte schon eine ähnliche Routine geschrieben nur wollte das nicht
klappen.
Der Grund lag darin, dass ich bevor ich die Daten empfangen kann, dem
Messgerät einen Befehl senden muss, dass er die Messdaten senden soll.

Der Art: uart_puts("$SP\r"); <-- Sende Powerwert

Frage ich danach sofort ab (siehe deine Funktion) dann klappt das
nicht!
Ich musste eine Verzögerung von einigen ms einbauen! Nun klappt es!
Obwohl mir das nicht ganz klar ist! Ist doch die Abfrage interrupt-
gesteuert! Das Eintreffen eines Zeichens, wird doch durch eine
Interruptroutine festgestellt. Vielleicht komme ich noch dahinter.

von Karl heinz B. (kbucheg)


Lesenswert?

Überleg dir mal:
Was genau macht die uart_getc() ?

Welche Bedingungen muessen erfüllt sein, damit uart_getc()
seinen return ausführt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.