Hallo habe folgendes Programm: Wenn von einem JAVA Programm aus über die Serielle Schnittstelle in diesem Fall ein "A" geschickt wird soll die LED am Pin 7 am Port A leuchten. Andernfalls soll sie ausgeschaltet bleiben. Aber nach meine Programm nach geht da gar nichts. Meiner Meinung nach passt bei dem Befehl uart_gets etwas nicht, weil wenn ich Integer werte sende funktioniert alles perfekt. uint8_t uart_getc(void) { while (!(UCSRA & (1<<RXC))) ; return UDR; } void uart_gets( char* Buffer, uint8_t MaxLen ) { uint8_t NextChar; uint8_t StringLen = 0; NextChar = uart_getc(); // Warte auf und empfange das nächste Zeichen // Sammle solange Zeichen, bis: // * entweder das String Ende Zeichen kam // * oder das aufnehmende Array voll ist while( NextChar != '\n' && StringLen < MaxLen - 1 ) { *Buffer++ = NextChar; StringLen++; NextChar = uart_getc(); } // Noch ein '\0' anhängen um einen Standard // C-String daraus zu machen *Buffer = '\0'; } main: int main () { uint8_t a=0; char line[8]; char line2[8]= "A"; init(); while(1) { if ( (UCSRA & (1<<RXC)) ) { uart_gets(line,8); if(strcmp(line,line2)==0) { PORTA|= (1<<PA7); } else { PORTA&= ~(1<<PA7); } } } return 0; }
Okey super danke funktioniert jetzt soweit! Aber ein Problem ist noch, dass ich das "A" zweimal schicken muss damit die LED reagiert
Ok. Das was ich geschrieben hab, war eher nur ein Workaround, bzw Test, um zu sehen, woran es liegt. Die Funktion "uart_gets" erwartet eigentlich, dass Du ein "A" schickst und danach ein '\n', also ein "ENTER". Je nach OS kann das aber ein "\n" oder ein "\n\r" sein. Außerdem darfst Du dann nicht mehr mit char line2[8]= "A"; vergleiche, sondern mit "A\n" Du kannst natürlich anstatt einen String zu vergleichen, auch einfach nur einzelne Zeichen vergleichen. Dein Code würde dann so aussehen:
1 | uint8_t uart_getc(void) |
2 | {
|
3 | while (!(UCSRA & (1<<RXC))) |
4 | ;
|
5 | return UDR; |
6 | }
|
7 | |
8 | |
9 | |
10 | main: |
11 | |
12 | int main () |
13 | {
|
14 | char zeichen; |
15 | char zeichen2= 'A'; |
16 | |
17 | init(); |
18 | |
19 | while(1) |
20 | {
|
21 | if ( (UCSRA & (1<<RXC)) ) |
22 | {
|
23 | zeichen = uart_getc(); |
24 | |
25 | |
26 | if(zeichen == zeichen2) |
27 | {
|
28 | PORTA|= (1<<PA7); |
29 | }
|
30 | else
|
31 | {
|
32 | PORTA&= ~(1<<PA7); |
33 | }
|
34 | |
35 | |
36 | }
|
37 | }
|
38 | |
39 | return 0; |
40 | |
41 | }
|
Okey und mal angenommen ich würde eine String zb "Hallo" vergleichen wollen? Was wäre da anders?
Dein PC schickt ein H .. dann ein A ... dann ein L .. soll jetzt schon verglichen werden ? dann ein L .. jetzt vergleichen .. dann ein O .. soll man jetzt vergleichen .. dann ein ... moment ... moment ... ja kommt kein Zeichen mehr ? Das Problem ist, dass dein Mikrocontroller wissen muss, WANN er den Vergleich, ob es ein "HALLO" war starten soll. Du solltest deshalb kein "HALLO" senden, sondern ein "HALLO+enter", was ein "HALLO\n" wäre. Deine erste Software wartet auf das "ENTER". Schick also in der ersten Software von Dir einfach mal ein "A\n"
Okey jetzt funktioniert das ganze, hab wirklich bei der JAVA Software das \n vergessen ;-) Danke für die Hilfe!!
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.