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
voiduart_gets(char*Buffer,intMaxLen)
2
{
3
charNextChar;
4
charStringLen=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
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:
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
voiduart_gets(char*Buffer,intMaxLen)
2
{
3
intCount=0;
4
unsignedintc;
5
6
c=uart_getc();
7
c=(unsignedchar)c;
8
uart_putc(c);
9
while(c!='.')
10
{
11
Buffer[Count++]=c;
12
c=uart_getc();
13
c=(unsignedchar)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?
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.
...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.
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?
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.