Hallo,
ich möchte einen über UART empfangenen String zerlegen, aber habe ein
kleines Problem folgenden Code zu debuggen:
1 | // wird sonst über ISR(USART_RXC_vect) gefüllt, zu Testzwecken vorgegeben
|
2 | char uart_string[/*UART_MAXSTRLEN+1*/] = {"<0:F:123:1:12345>"};
|
3 |
|
4 | int main(void)
|
5 | {
|
6 | // so tun als wäre UART-Empfang komplett
|
7 | uart_str_complete = 1;
|
8 |
|
9 | while(1)
|
10 | {
|
11 | if (uart_str_complete)
|
12 | {
|
13 | eval_received(/*uart_string*/);
|
14 | }
|
15 | }
|
16 | }
|
17 |
|
18 |
|
19 | int subcmd_extract(int iStartPos, char* strExtracted)
|
20 | {
|
21 | char buffer[10];
|
22 | strExtracted = buffer;
|
23 | int i=0;
|
24 | // TODO: strcspn verwenden?
|
25 | while (uart_string[i] != ':') // (2) hier steht der Debugger nach (1) für 3 Steps
|
26 | {
|
27 | buffer[i] = uart_string[iStartPos];
|
28 | i++;
|
29 | iStartPos++;
|
30 | }
|
31 | buffer[i]='\0';
|
32 |
|
33 | //strExtracted = buffer;
|
34 | return (i);
|
35 | }
|
36 |
|
37 | void eval_received()
|
38 | { // (1) hier steht der Debugger für 2 Steps
|
39 | //char strExtracted[10];
|
40 | int iCurPos = 0;
|
41 | char tempBuffer[10];
|
42 |
|
43 | // extract R/W command-mode (0=read, 1=write) from string received
|
44 | iCurPos = subcmd_extract(iCurPos, strExtracted);
|
45 | char strRW[2] = "\0"; // (3) hier landet der Debugger nach (2)
|
46 | // hier Abbruch des Debuggens, strExtracted ist laut Watchlist nur ein Leerzeichen
|
47 | strcpy(strRW, strExtracted);
|
48 | int iRW = atoi(strRW);
|
49 |
|
50 | char strValves[10] = "\0";
|
51 | strcpy(strValves, strExtracted);
|
52 |
|
53 | // configure pump
|
54 | iCurPos = subcmd_extract(iCurPos+1, strExtracted);
|
55 | char s_Mclock[6] = "\0";
|
56 | //s_Mclock = *strExtracted;
|
57 | strcpy(s_Mclock, strExtracted);
|
58 |
|
59 | // Clock setzen
|
60 | iCurPos = subcmd_extract(iCurPos+1, strExtracted);
|
61 | char cDir[1] = "\0";
|
62 | strcpy(cDir, strExtracted);
|
63 | iCurPos = subcmd_extract(iCurPos+1, strExtracted);
|
64 | char s_reccrc[6];
|
65 | strcpy(s_reccrc, strExtracted);
|
66 |
|
67 | uart_str_complete = 0;
|
68 | }
|
Ich habe den AVR Simulator für ATmega16 verwendet. Mir ist schleierhaft,
warum er so springt, wie er es in den Kommentaren beschrieben tut. Er
übergeht auch einfach die Variablen-Deklarationen und -Initialisierungen
wenn ich schrittweise steppe, ist das normal?
Weiterhin habe ich diverse Variablen in die Watchlist getan, uart_string
sieht gut aus, für i behauptet er durchweg es sei "not in scope",
dasselbe gilt dann auch für uart_string[i].
Der Code hat vermutlich noch x andere Fehler, ich bin nicht sehr
erfahren im Umgang mit Pointern und Co, jedoch müsste die while-Schleife
in subcmd_extract doch erstmal wie gewünscht abgearbeitet werden. Aber
warum funktioniert dies nicht? Diese Routine sollte mir die
Befehlsbestandteile anhand des Trennzeichens (':') liefern, die dann
später in eval_received() weiter verarbeitet werden.
Gruß
Martin