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


von Moritz S. (moritzs)


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?

von Martin T. (mthomas) (Moderator) Benutzerseite


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;

von Moritz S. (moritzs)


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?

von Stefan E. (sternst)


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.

von Moritz S. (moritzs)


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.

von holger (Gast)


Lesenswert?

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

Weil Null nun mal !='.' ist ?

von Moritz S. (moritzs)


Lesenswert?

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

von Stefan E. (sternst)


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?

von Moritz S. (moritzs)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.