www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Uart Strings einlesen


Autor: Joerg Miehle (Firma: TU Wien) (pinning)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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';
}

Autor: Joerg Miehle (Firma: TU Wien) (pinning)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Überleg dir mal:
Was genau macht die uart_getc() ?

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.