AVR fleury UART getS - Vergleich funzt nicht

OP #970412
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:
1
void uart_gets(char* Buffer, int MaxLen)
2
{
3
  char NextChar;
4
  char StringLen = 0;
5

6
  NextChar = uart_getc();                                  // Warte auf und empfange das nächste Zeichen
7
  uart_putc(NextChar);                                     // für Echo
8
  while((NextChar != '\r') && (StringLen < MaxLen - 1))    //sammle Zeichen bis '\r' empfangen oder Array voll
9
  {
10
    *Buffer++ = NextChar;
11
    StringLen++;
12
    NextChar = uart_getc();
13
    uart_putc(NextChar);
14
  }
15
  Buffer = '\0';
16
}
17

18

19

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

26
  while(1)
27
  {
28
    uart_gets(temp, 20);
29
    if(strcmp(temp, "an") == 0)
30
    {
31
      uart_puts("non-empty string received:");                     //dieser Fall tritt nie ein
32
      uart_puts(temp);
33
    }
34
  }
35
}

Was mache ich falsch?
Moderator Persönliche Seite #970454
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:
1
  uint16_t ugc;
2
  char c;
3

4
  while ( ( ugc = uart_getc() ) & UART_NO_DATA ) { ; }
5
  c = (char)ugc;
OP #971170
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:
1
void uart_gets(char* Buffer, int MaxLen)
2
{
3
  int Count = 0;
4
  unsigned int c;
5

6
  c = uart_getc();
7
  c = (unsigned char)c;
8
  uart_putc(c);
9
  while(c != '.')
10
  {
11
    Buffer[Count++] = c;
12
    c = uart_getc();
13
    c = (unsigned char)c;
14
    uart_putc(c);
15
  }
16
  Buffer[Count] = '\0';          //wird nie ausgeführt
17
  uart_puts("-->");  
18
  uart_puts(Buffer);
19
}
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?
#971205
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.
OP #971782
...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.
#971871
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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.