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
>hatte am wochenende schon einmal einen beitrag gepostet
Und hatte geantwortet.
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?
Dann solltest du diesen Thread weiterführen und keinen neuen aufmachen. Beitrag "Re: usart - stringauswertung"
> 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.
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.
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.