Forum: Mikrocontroller und Digitale Elektronik Stringformatierung


von Floyd (Gast)


Lesenswert?

hallo zusammen.
hatte am wochenende schon einmal einen beitrag gepostet, doch leider bin 
ich noch nicht weiter gekommen...
also ich habe einen string: "1 xxx; 2 xxx; 3 xxx; 4 xxx_"
wie kann ich diesen formatieren, damit ich später folgende zuweisungen 
machen kann: motor1 = xxx, motor2 = xxx, etc. (xxx steht für den 
pwm-wert)

würde mich sehr über beispielcode freuen.

gruß
  Floyd

von fieser Rahul (auch Oskar genannt) (Gast)


Lesenswert?

>hatte am wochenende schon einmal einen beitrag gepostet
Und hatte geantwortet.

von Floyd (Gast)


Lesenswert?

das stimmt! fand deine antwort auch sehr interessant, doch ich hab mich 
schon auf die andere lösung eingestellt... - das weitere programm 
verlangt diese auswertung.

weißt du, wie die von mir vorgestellte lösung aussieht?

von fieser Rahul (auch Oskar genannt) (Gast)


Lesenswert?

Dann solltest du diesen Thread weiterführen und keinen neuen aufmachen.
Beitrag "Re: usart - stringauswertung"

von Karl heinz B. (kbucheg)


Lesenswert?

> also ich habe einen string: "1 xxx; 2 xxx; 3 xxx; 4 xxx_"
> wie kann ich diesen formatieren,

Fang mal damit an die richtige Nomenklatur zu benutzen.
Du willst nicht den String formatieren sondern zu willst
den String parsen.

  Formatieren: Den String nach bestimmten Regeln aufbauen
               -> Werte gegeben; String wird aufgebaut

  Parsen: Den String nach bestimmten Regeln auswerten
               -> String gegeben; Werte gesucht

Und so eine State-Maschine wie sie im anderen Post
besprochen wurde ist gar keine so schlechte Idee.

Du gehst den String Zeichen für Zeichen durch und die
State Maschine ändert ihren Zustand, jenachdem welches
Zeichen angetroffen wurde. Das ist nun wirklich nicht
schwierig.
1
  ...
2
  // Eine Zeile wurde komplett vom Sender übertragen
3
  // Die kann zb so aussehen
4
  // y = xxx; y = xxx;
5
  //
6
  // y    ... Nummer der PWM die zu setzen ist
7
  // xxx  ... PWM Wert der zu setzen ist
8
  // ;    ... Kennzeichnung, dass die PWM Message hier zu Ende ist
9
  // 
10
  //
11
  // Eine Zeile vom Sender besteht also aus mehreren PWM Messages.
12
  // Eine PWM Message besteht aus (in der Reihenfolge)
13
  //   Einer Zahl, die die Nummer der PWM Einheit darstellt
14
  //   Einem '='
15
  //   Noch einer Zahl, die den zu setzenden Wert darstellt
16
  //   Einem ';', welches die Message abschliesst.
17
18
19
#define START_PWM_MSG  0    // Maschine wartet auf den Beginn einer PWM Message
20
#define FIND_EQUALS    1    // Maschine wartet auf ein '=' Zeichen
21
#define GET_VALUE      2    // Maschine liest den Zahlenwert
22
#define FIND_SEMICOLON 3    // Maschine wartet auf ein ';' Zeichen
23
24
  // Mit Ausnahme des Zustands FIND_SEMIOLON weiss die Maschine immer, was als
25
  // nächstes kommen muss. Wird das Erwartete nicht vorgefunden, geht die
26
  // Maschine sofort in den Zustand FIND_SEMICOLON über, bei dem Zeichen
27
  // überlesen werden, bis ein ';' angetroffen wird. Der Zustand FIND_SEMICOLON
28
  // fungiert als ein Art 'Wiederaufsetzen nach einem Fehler'
29
30
  //
31
  // Am Anfang ist die Maschine im Zustand:
32
  // Wir warten auf den Anfang einer PWM Message
33
  //
34
  State = START_PWM_MSG;
35
  PWM_Unit = 0;
36
  PWM_Value = 0;
37
38
  Index = 0;
39
  while( Input[Index] != Dein_Ende_Zeichen für eine Zeile ) {
40
    NextChar = Input[Index++];
41
42
    //
43
    // Whitespace Zeichen werden, egal wo sie auftreten, ignoriert
44
    if( NextChar == ' ' ||
45
        NextChar == '\t' ||
46
        NextChar == '\n' )
47
      continue;
48
49
50
    switch( State ) {
51
      case START_PWM_MSG:    // Das nächste Zeichen muss eine Zahl sein, wenn nicht
52
                             // Fehler: Alles bis zum ';' ignorieren
53
54
        if( NextChar >= '0' && NextChar <= '9' ) {
55
          PWM_Unit = NextChar - '0';
56
          State = FIND_EQUALS;
57
        }
58
        else
59
          State = FIND_SEMICOLON;
60
        break;
61
62
      case FIND_EQUALS:
63
        if( NextChar == '=' )
64
          State = GET_VALUE;
65
        else
66
          State = FIND_SEMICOLON;
67
        break;
68
69
      case GET_VALUE:
70
        if( NextChar >= '0' && NextChar <= '9' )
71
          PWM_Value = 10 * PWM_Value + ( NextChar - '0' );
72
73
        else if( NextChar == ';' ) {
74
          // Eine Message wurde komplett und fehlerfrei empfangen
75
          // Setze die Werte
76
          SetPwm( PWM_Unit, PWM_Value );
77
 
78
          // und die Maschine wieder auf Anfang zurückstellen
79
          State = START_PWM_MSG;
80
          PWM_Unit = 0;
81
          PWM_Value = 0;
82
        }
83
84
        else
85
          // Fehler. Dieses Zeichen ist weder das abschliessende ';'
86
          // noch etwas im Bereich '0' bis '9'
87
          State = FIND_SEMICOLON
88
89
        break;
90
91
      case FIND_SEMICOLON:
92
        if( NextChar == ';' ) {
93
          State = START_PWM_MSG;
94
          PWM_Unit = 0;
95
          PWM_Value = 0;
96
        }
97
    }

Der Code ist ungetestet. Die Grundstruktur sollte stimmen,
möglicherweise sind ein paar Tippfehler drinnen.

von Karl heinz B. (kbucheg)


Angehängte Dateien:

Lesenswert?

Und so sieht dann die State Maschine aus, wenn man
in der Planungsphase ist.
Mit so einem Schaubild fängt man an.

Jeder Kreis symbolisiert einen Zustand.
Jeder Pfeil ist ein Übergang von einem Zustand
zu einem anderen Zustand. Bei jedem Pfeil steht dabei
unter welchen Bedingungen dieser Übergang genommen
wird (hier: der rote Text. zu lesen als: nächstes
Zeichen muss sein ...) und welche Aktionen bei der
Wahl dieses Übergangs ausgeführt werden (in Blau)


Interessant ist übrigens, dass die State Maschine einfacher
wird, wenn man die Beschränkung, dass die PWM Nummer nur
einstellig sein kann, weglässt. Dann fällt der Zustand
FIND_EQUALS komplett raus.
Ist aber eine Übungsaufgabe für den Leser.

von Floyd (Gast)


Lesenswert?

vielen dank für die ausführlichen antworten! jetzt erst verstehe ich die 
zustandsmodelle.
hat der string die form ";1=xxx; 2=xxx; 3=xxx; 4=xxx;_", dann läuft das 
programm vollständig durch. modifiziere jetzt noch den vom pc gesendeten 
string - an das c-programmieren werde ich mich wohl noch gewöhnen 
müssen.

DANKE!

von Dmitri (Gast)


Lesenswert?

@Karl heinz Buchegger

auch vielen Dank!

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.