Hallo Zusammen,
ich habe folgendes Problem und weiß nicht weiter:
Ich sende über den PC einen Befehl an meinen MC, der sieht z.B. so aus:
LED001;
Über den USART-Interrupt lasse ich den String zerlegen und will ihn im
Grunde zum Test direkt wieder zurück schicken.
Hier der entsprechende Codeabschnitt:
1 | volatile char uart_string[11] = "";
|
2 | volatile uint8_t uart_str_count = 0;
|
3 |
|
4 | ISR(USART_RXC_vect)
|
5 | {
|
6 | unsigned char nextChar;
|
7 | nextChar = UDR;
|
8 | //SendChar(nextChar);
|
9 | if( nextChar != ';')
|
10 | { //String ist noch im Aufbau
|
11 | uart_string[uart_str_count] = nextChar;
|
12 | uart_str_count++;
|
13 | }
|
14 | else
|
15 | { //String ist Komplett!
|
16 | uart_string[uart_str_count] = '\0';
|
17 | uart_str_count = 0;
|
18 | unsigned char Empfaenger[3];
|
19 | unsigned char Wert[3];
|
20 |
|
21 | Empfaenger[0] = uart_string[0];
|
22 | Empfaenger[1] = uart_string[1];
|
23 | Empfaenger[2] = uart_string[2];
|
24 | Empfaenger[3] = '\0';
|
25 |
|
26 | Wert[0] = uart_string[3];
|
27 | Wert[1] = uart_string[4];
|
28 | Wert[2] = uart_string[5];
|
29 | Wert[3] = '\0';
|
30 |
|
31 | sendstring(Empfaenger);
|
32 | sendstring(Wert);
|
33 | }
|
34 | }
|
35 |
|
36 |
|
37 | void sendstring(char *s)
|
38 | {
|
39 | while (*s)
|
40 | { /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
|
41 | SendChar(*s);
|
42 | s++;
|
43 | }
|
44 | }
|
45 |
|
46 | void SendChar(unsigned char c)
|
47 | {
|
48 | while ( !( UCSRA & (1<<UDRE)) );
|
49 | UDR = c;
|
50 | return 0;
|
51 | }
|
Das Problem ist nun das ich am PC nur den "Wert" empfange, ohne das
vorherige "Empfaenger". Wenn ich es aber z.B. so schreibe:
sendstring(Empfaenger);
sendstring(Empfaenger);
oder so:
sendstring(Wert);
sendstring(Wert);
kommt alles passend (doppelt) an.
Drehe ich es um:
sendstring(Wert);
sendstring(Empfaenger);
kommt nur der "Wert" an, "Empfaenger" wird wieder verschluckt.
Hat Jemand eine Idee?