www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR fleury UART getS - Vergleich funzt nicht


Autor: Moritz S. (moritzs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Zusammen
...mal wieder das leidige Thema UART:
Ich hab ein paar Probleme mit der Library von Peter Fleury:
ich versuche auf meinem ATmega8 einen String, der über den UART 
reinkommt, mit einer Konstante ("an", "aus", ...) zu vergleichen. Dies 
klappt jedoch leider nicht. Die Vergleiche sind immer false. Hier also 
mein Code:
void uart_gets(char* Buffer, int MaxLen)
{
  char NextChar;
  char StringLen = 0;

  NextChar = uart_getc();                                  // Warte auf und empfange das nächste Zeichen
  uart_putc(NextChar);                                     // für Echo
  while((NextChar != '\r') && (StringLen < MaxLen - 1))    //sammle Zeichen bis '\r' empfangen oder Array voll
  {
    *Buffer++ = NextChar;
    StringLen++;
    NextChar = uart_getc();
    uart_putc(NextChar);
  }
  Buffer = '\0';
}



int main(void)
{
  uart_init(UART_BAUD_SELECT(UART_BAUD_RATE, F_CPU));               //init
  sei();
  char temp[25];

  while(1)
  {
    uart_gets(temp, 20);
    if(strcmp(temp, "an") == 0)
    {
      uart_puts("non-empty string received:");                     //dieser Fall tritt nie ein
      uart_puts(temp);
    }
  }
}

Was mache ich falsch?

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uart_getc aus Peter Fleurys AVR UART-Library gibt einen 16-bit integer 
zurück. Zumindest wenn das nicht inzwischen geändert wurde, habe nur 
ältere Version hier. Im MSB ist u.a. kodierte, ob ein Zeichen gelesen 
wurde, falls Zeichen empfangen ( steht dieses im LSB. Ist in uart.h 
erläutert und wird in der Beispielanwendung demonstriert. "Auf Zeichen 
warten" in der Art:
  uint16_t ugc;
  char c;

  while ( ( ugc = uart_getc() ) & UART_NO_DATA ) { ; }
  c = (char)ugc;

Autor: Moritz S. (moritzs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Herzlichen Dank erstmal, die Sache mit den 16bit-Zahlen wusste ich zwar, 
hatte sie aber nicht hinreichend berücksichtigt. Leider funzt mein 
modifizierter Code immer noch nicht:
void uart_gets(char* Buffer, int MaxLen)
{
  int Count = 0;
  unsigned int c;

  c = uart_getc();
  c = (unsigned char)c;
  uart_putc(c);
  while(c != '.')
  {
    Buffer[Count++] = c;
    c = uart_getc();
    c = (unsigned char)c;
    uart_putc(c);
  }
  Buffer[Count] = '\0';          //wird nie ausgeführt
  uart_puts("-->");  
  uart_puts(Buffer);
}
Ich hab die Fehlerbehandlung mal komplett rausgelassen, 'Luxus' kann man 
immer noch später implementieren. Die Bedingung in der while-Schleife 
ist allerdings immer wahr, so dass der Pfeil (-->) nie ausgegeben wird.
Wo ist mein Denkfehler?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Problem ist nicht, dass uart_getc ein int zurück gibt, sondern dass 
es immer sofort zurück kommt. Du erwartest offensichtlich, dass 
uart_getc erst zurück kommt, wenn auch ein Zeichen zur Verfügung steht. 
Dem ist aber nicht so.

Autor: Moritz S. (moritzs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...ja, wenn grad keine Daten da sind, gibt der mir halt dieses 
UART_NO_DATA zurück, das ich ja "wegcaste". Übrig bleibt dann ja nur 
noch ne (binäre) Null. Das erklärt mir leider noch nicht, wieso der 
Vergleich in der while-Schleife immer wahr ist.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Übrig bleibt dann ja nur
>noch ne (binäre) Null.

Weil Null nun mal !='.' ist ?

Autor: Moritz S. (moritzs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schon klar, dass Null != '.' ist,
aber ich wenn ich doch (vom PC) nen Punkt sende, muss der Vergleich doch 
wahr sein, oder?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moritz S. wrote:

> aber ich wenn ich doch (vom PC) nen Punkt sende, muss der Vergleich doch
> wahr sein, oder?

Und wann ist das? Wie viele Nullen hast du zu diesem Zeitpunkt schon 
nach Buffer geschrieben, bzw über das Ende von Buffer hinaus? Woher 
weißt du, dass zu dem Zeitpunkt, an dem der Punkt eintrifft, dein 
Programm nicht schon längst im Nirwana gelandet ist?

Autor: Moritz S. (moritzs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weil ich immer noch die Buchstaben sehe, die ich in mein 
Terminalprogramm eingebe. Die werden ja - direkt nach Empfang - zurück 
an mich gesendet.

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.