Forum: Mikrocontroller und Digitale Elektronik String Zerlegung anhand von Trennzeichen debuggen


von Martin F. (martin_f23)


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

von Peter II (Gast)


Lesenswert?

schalte mal die optimerung aus, dann geht es mit dem Debugger einfacher.

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
Noch kein Account? Hier anmelden.