AVR fleury UART getS - Vergleich funzt nicht

OP #970412
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:
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
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:
1
  uint16_t ugc;
2
  char c;
3

4
  while ( ( ugc = uart_getc() ) & UART_NO_DATA ) { ; }
5
  c = (char)ugc;
OP #971170
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:
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?
#971871
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren