Guten Abend zusammen. Seit einigen Tagen versuche ich, eine RS232-Schnittstelle für eine Kaffeemaschine zu basteln. Das ganze ist Teil eines Schulprojektes, wo es darum geht, den Kaffeekonsum in einer Firma zu erfassen und eine bargeldlose Bezahlmöglichkeit zu realisieren. Dies ist mein erstes Projekt mit AVRs Aber bereits beim Befehle auswerten hapert es. Das Ding macht nicht das was es sollte/ich will. Der UART selbst geht, das hab ich durch ein lokales Echo-Testprogramm auf dem AVR getestet. Nur das strcmp-verzweigungs-konstrukt treibt mich in den Wahnsinn. Irgendwie blick ich da noch nicht so ganz durch. Könnte mir da bitte jemand sagen welch groben Fehler ich da begangen habe? Kompiliert wird mit AVR-GCC. Danke im Voraus, shpank
ich hab's nur kurz überflogen, aber in recvstr() machst Du einen groben Fehler!
1 | void recvstr(unsigned char * text) |
2 | {
|
3 | unsigned int next; |
4 | unsigned char * tmp; |
5 | text = tmp; |
6 | do
|
7 | {
|
8 | next = USART_Receive(); |
9 | *tmp++ = next; |
10 | }while( next != '\r'); |
11 | |
12 | *tmp = '\0'; |
13 | }
|
Zeiger angelegt, aber keinen Speicher => Du schreibst deine Sachen irgendwo hin, kann gut gehen, aber idR macht das nur Probleme. C-Buch Stichwörter: Zeiger, Array, malloc
Wäre es für den Anfang vielleicht besser, das ganze mit einem großen char-Array mit fixer größe zu machen, wo ich einfach alles reinschreibe? Tut mir leid wenn ich euch auf den Wecker gehe. So wirklich viel Ahnung hab ich von dem Zeugs hier noch nicht, da ich aus der schönen bunten Welt der objektorientierten Programmierung (C#, Java) komme.
Ja, mach dir nen kleinen Zeilenpuffer (so klein wie möglich, aber so groß wie nötig) und schreib da rein. Irgendwie sowas in der Art:
1 | char zeile[32]; |
2 | |
3 | void recvstr() |
4 | {
|
5 | int i; |
6 | char c; |
7 | |
8 | for(i=0; i<(32 - 1); i++) |
9 | {
|
10 | c = usart_getc(); |
11 | |
12 | // Zeilenende erreicht?
|
13 | if(c == '\r') |
14 | {
|
15 | // ja: dann String terminieren
|
16 | zeile[i] = '\0'; |
17 | break; |
18 | }
|
19 | else
|
20 | {
|
21 | // nein: empfangenes Zeichen anhängen
|
22 | zeile[i] = c; |
23 | }
|
24 | |
25 | zeile[31] = '\0'; // zwingende Terminierung |
26 | }
|
MfG Marius
Danke Marius! Ich werd das heute mal ausprobieren. gibts sonst noch grobe fehler? jaja... ich weiß, meine main-methode sieht grauenhaft aus. das kommt vom rumfrickeln. das werd ich heute noch bereinigen. schönen sonntag noch.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.