mikrocontroller.net

Forum: Compiler & IDEs UART Empfangen mit Lib von P. Fleury


Autor: Bart (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich versuche einen String mit der Lib von P. Fleury zu empfangen und 
habe mir dazu folgende Funktion geschrieben, die jede Sekunde einmal 
aufgerufen wird:
void uart_gets()
{
  char string[20];
  int i=0;
  if(uart_getc() != UART_NO_DATA)
  {
  do {
    string[i] = uart_getc();
    i++;
    }while(uart_getc() != '\0');
  uart_puts(string);
  }
}
Es wird leider immer nur das 2 und das 4 Zeichen zurückgeschickt, kann 
mir jemand weiterhelfen?
Grüße
Bart

Autor: Andreas R. (rebirama)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schau dir nochmal an, was genau uart_getc macht...
in der 5. zeile wird nämlich das erste zeichen verworfen
und in der 10ten das dritte.

Autor: Bart (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ich habe mir das angeschaut, lower byte enthält den char, higher byte 
zb einen Fehler oder halt 0.
void uart_gets()
{
  char string[20];
  int i=0;
  if(!(uart_getc() &UART_NO_DATA)) //So besser?
  {
  do {
    string[i] = uart_getc();
    i++;
    }while(uart_getc() != '\0');
  uart_puts(string);
  }
}
Weiss nciht so genau auf was du anspielt, hab eine Sache verändert aber 
das hilft auch nicht.

Autor: Bart (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs ;) Danke für den Tip, mit dem ersten getc hole ich mir ja schon ein 
Byte aus dem ringbuffer.

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was rebirama meint:
void uart_gets()
{
  char string[20];
  int i=0;
  if(!(uart_getc() &UART_NO_DATA)) /* WENN Daten da sind, verlierst du hier 
                                      ein Datenbyte */
  {
  do {
    string[i] = uart_getc();
    i++;
    }while(uart_getc() != '\0');  /* Und hier nochmal */
  uart_puts(string);
  }
}
Du wlst wohl eher sowas:
void uart_gets(void) //Leere Klammern bedeuten in C 'int' parameter
{
  char buffer[20];
  uint16_t i=0, data;
  while(!( (data = uart_getc()) & UART_NO_DATA)) { // Datenbyte speichern
    buffer[i] = data;           // Highbyte geht verloren, ggf. cast'en
    ++i;
    if( (data & 0xff != '\0') ) // Ganzer string empfangen?
      break;
  }
  uart_puts(buffer);
}
hth, Jörg

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg G. schrieb:

> Du wlst wohl eher sowas:

Und wenn man dann noch das "!=" durch ein "==" ersetzt, könnte es sogar 
funktionieren. ;-)

Zumindest gelegentlich, denn wenn die Funktion aufgerufen wird, während 
die Übertragung gerade im Gange ist, hat man in buffer die bisher 
empfangenen Daten, aber ohne Null-Terminierung. Und wenn sie aufgerufen 
wird, ohne das irgendwelche Daten empfangen wurden, ist ebenfalls keine 
Null-Terminierung vorhanden. Das ist natürlich jeweils schlecht für das 
"uart_puts(buffer);".

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Und wenn man dann noch das "!=" durch ein "==" ersetzt, könnte es sogar
> funktionieren. ;-)
Ups!

OK, Die Funktion funktioniert so, wie ich sie geschrieben habe, nicht: 
Sobald alle Bytes aus dem Puffer gelesen wurden, werden sie unterminiert 
gesendet, d.h. alle Bytes aus dem RAM bis irgendwo eine 0 steht.
Also nochmal
char *uart_gets(const char *buffer, size_t buf_len)
{
  do {
    while ((data = uart_getc()) & UART_NO_DATA)
    {}  // auf Daten warten
    buffer[i] = data;
    ++i;
    if (i== buf_len) break;
  while( (data & 0xff) != 0); // Endlosschleife, falls kein 0-Byte kommt
                              // '\n' waere evtl. als Trenner besser
  if (i == buf_len) buffer[i-1] = '\0'; //'Notfall'-terminierung
  return buffer;
}
uups, Jörg

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.