Hi,
der Democode hier aus dem Dorum funktioniert nicht?
1 | /* Zeichen empfangen */
|
2 | uint8_t uart_getc(void)
|
3 | {
|
4 | while (!(UCSRA & (1<<RXC))) // warten bis Zeichen verfuegbar
|
5 | ;
|
6 | return UDR; // Zeichen aus UDR an Aufrufer zurueckgeben
|
7 | }
|
8 |
|
9 | void uart_gets( char* Buffer, uint8_t MaxLen )
|
10 | {
|
11 | uint8_t NextChar;
|
12 | uint8_t StringLen = 0;
|
13 |
|
14 | NextChar = uart_getc(); // Warte auf und empfange das nächste Zeichen
|
15 |
|
16 | // Sammle solange Zeichen, bis:
|
17 | // * entweder das String Ende Zeichen kam
|
18 | // * oder das aufnehmende Array voll ist
|
19 | while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
|
20 | *Buffer++ = NextChar;
|
21 | StringLen++;
|
22 | NextChar = uart_getc();
|
23 | }
|
24 |
|
25 | // Noch ein '\0' anhängen um einen Standard
|
26 | // C-String daraus zu machen
|
27 | *Buffer = '\0';
|
28 | }
|
Das liegt glaube ich daran, dass hier ein fehler ist.
1 | NextChar = uart_getc(); // Warte auf und empfange das nächste Zeichen
|
2 |
|
3 | // Sammle solange Zeichen, bis:
|
4 | // * entweder das String Ende Zeichen kam
|
5 | // * oder das aufnehmende Array voll ist
|
6 | while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
|
7 | *Buffer++ = NextChar;
|
8 | StringLen++;
|
9 | NextChar = uart_getc();
|
10 | }
|
11 |
|
12 | // Noch ein '\0' anhängen um einen Standard
|
13 | // C-String daraus zu machen
|
14 | *Buffer = '\0';
|
Denn so wird Buffer[0] nie beschrieben, da das Array buffer schon
inkrementiert wird, bevor NextChar hereingeschriebwn wurde.
Genauso überrschreibt '\0' das letzte zeichen. Weil nichtmehr
inkrementiert wird..
Jetzt gibt es aber ein Problem dieser Code funktioniert auch
nicht(mehr).
1 | while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
|
2 | *Buffer= NextChar;
|
3 | Buffer++;
|
4 | StringLen++;
|
5 | NextChar = uart_getc();
|
6 | }
|
Warum funktioniert das nichtmehr? Warum hat das Beispiel aus dem AVR-GCC
Tutorial einmal funktioniert? Wuerde früher wenn man den Befeh,
*Buffer++ = NextChar; genommen hat das inkrement der Adresse erst im
nächten Programmdurchlauf ünernommen. Sodass die Speicherstelle 0 i.
Array doch genutzt wurde? Warum funktioniert meine Version nichtmehr.
hat es bis jetzt immer.. Ich bin ein wenig verwirrt... Vielleicht weiß
ja jemand weiter...