mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Stringformatierung


Autor: Floyd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: fieser Rahul (auch Oskar genannt) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>hatte am wochenende schon einmal einen beitrag gepostet
Und hatte geantwortet.

Autor: Floyd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: fieser Rahul (auch Oskar genannt) (Gast)
Datum:

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

  ...
  // Eine Zeile wurde komplett vom Sender übertragen
  // Die kann zb so aussehen
  // y = xxx; y = xxx;
  //
  // y    ... Nummer der PWM die zu setzen ist
  // xxx  ... PWM Wert der zu setzen ist
  // ;    ... Kennzeichnung, dass die PWM Message hier zu Ende ist
  // 
  //
  // Eine Zeile vom Sender besteht also aus mehreren PWM Messages.
  // Eine PWM Message besteht aus (in der Reihenfolge)
  //   Einer Zahl, die die Nummer der PWM Einheit darstellt
  //   Einem '='
  //   Noch einer Zahl, die den zu setzenden Wert darstellt
  //   Einem ';', welches die Message abschliesst.


#define START_PWM_MSG  0    // Maschine wartet auf den Beginn einer PWM Message
#define FIND_EQUALS    1    // Maschine wartet auf ein '=' Zeichen
#define GET_VALUE      2    // Maschine liest den Zahlenwert
#define FIND_SEMICOLON 3    // Maschine wartet auf ein ';' Zeichen

  // Mit Ausnahme des Zustands FIND_SEMIOLON weiss die Maschine immer, was als
  // nächstes kommen muss. Wird das Erwartete nicht vorgefunden, geht die
  // Maschine sofort in den Zustand FIND_SEMICOLON über, bei dem Zeichen
  // überlesen werden, bis ein ';' angetroffen wird. Der Zustand FIND_SEMICOLON
  // fungiert als ein Art 'Wiederaufsetzen nach einem Fehler'

  //
  // Am Anfang ist die Maschine im Zustand:
  // Wir warten auf den Anfang einer PWM Message
  //
  State = START_PWM_MSG;
  PWM_Unit = 0;
  PWM_Value = 0;

  Index = 0;
  while( Input[Index] != Dein_Ende_Zeichen für eine Zeile ) {
    NextChar = Input[Index++];

    //
    // Whitespace Zeichen werden, egal wo sie auftreten, ignoriert
    if( NextChar == ' ' ||
        NextChar == '\t' ||
        NextChar == '\n' )
      continue;


    switch( State ) {
      case START_PWM_MSG:    // Das nächste Zeichen muss eine Zahl sein, wenn nicht
                             // Fehler: Alles bis zum ';' ignorieren

        if( NextChar >= '0' && NextChar <= '9' ) {
          PWM_Unit = NextChar - '0';
          State = FIND_EQUALS;
        }
        else
          State = FIND_SEMICOLON;
        break;

      case FIND_EQUALS:
        if( NextChar == '=' )
          State = GET_VALUE;
        else
          State = FIND_SEMICOLON;
        break;

      case GET_VALUE:
        if( NextChar >= '0' && NextChar <= '9' )
          PWM_Value = 10 * PWM_Value + ( NextChar - '0' );

        else if( NextChar == ';' ) {
          // Eine Message wurde komplett und fehlerfrei empfangen
          // Setze die Werte
          SetPwm( PWM_Unit, PWM_Value );
 
          // und die Maschine wieder auf Anfang zurückstellen
          State = START_PWM_MSG;
          PWM_Unit = 0;
          PWM_Value = 0;
        }

        else
          // Fehler. Dieses Zeichen ist weder das abschliessende ';'
          // noch etwas im Bereich '0' bis '9'
          State = FIND_SEMICOLON

        break;

      case FIND_SEMICOLON:
        if( NextChar == ';' ) {
          State = START_PWM_MSG;
          PWM_Unit = 0;
          PWM_Value = 0;
        }
    }

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Floyd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Dmitri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger

auch vielen Dank!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.