String Zerlegung anhand von Trennzeichen debuggen

OP #2307406
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren