Parsen (serieller) Komandos

Nikodemus
2011-12-09
2011-12-14
  • Nikodemus - 2011-12-09

    Für eine Steuerung lese ich eine Komandosequenz über die serielle Schnittstelle (WAGE 750-873) ein.
    Die Sequenz steht mir dann als ARRAY OF BYTE zur Verfügung. Bisher parse ich das ganze ziemlich
    simpel, schlecht les- und erweiterbar durch geschachtelte Arrays ein:

       CASE Command[0] OF
       71: (*G*)
          CASE Command[1] OF
          69: (*E*)
             CASE Command[2] OF
             84: (*T*)
                Request:=Command[4];
                RVal:=TRUE;
             END_CASE
          END_CASE
       79: (*O*)
    ...
    

    Geht das sinnvoller? Z.B. Membersuche in einem ARRAY OF STRING?

    Ich bekomme die Daten aus Serial_Interface_01.lib in einem Ringbuffer.
    Bisher setze ich den Indexpointer einfach wieder auf 0, wenn ich einen
    Befehl eingelesen habe. Dabei fürchte ich allerdings, dass Daten verloren
    gehen können, sollte zwei Befehle schneller eingehen als ich sie parsen
    kann. Ohne diesen Trick wäre allerdings ein mitgeführter Lesepointer und
    ein Wrap-around-handling notwendig. Hat jemand mit sowas Erfahrung?

     

    Related

    Talk.ru: 1
    Talk.ru: 2

  • Schuero - 2011-12-09

    Hallo.

    Ich gehe immer diesen Ansatz nach. (funzt wie doof)

    Vergeiche jeden Zyklus ob sich der "Index" verändert hat.
    Wenn nein, ist nich mehr im Lesepuffer der seriellen Schnittstelle.
    Also nehme ich ann, dass der "Befehl" da ist.

    Diesen kann man dann auswerten und dannach den Index wieder auf 0 setzen.

    Hinweis noch zum Auswerten:
    Meist werden die Befehle im Ascii Byte Format übertragen, dann ist das Array nix anders als ein String (String = Anzahl von Bytes der Länge x). Diesen kann man dann prima vergleichen.
    Ich vergleiche aber meist die Arrayinhalte, spar Zeit und ist "kapiergeschützt"

    Gruß schuero

     
  • Oberchefe - 2011-12-14

    wenn's nur darum geht, dass mehrere Bytes auf einen bestimmten Wert (in Kombination) abgefragt werden sollen, kann man das auch so schreiben:

    IF Command[0]=71 AND Command[1]=69 AND Command[2]=84 THEN
       Request:=Command[4];
           RVal:=TRUE;
    END_IF
    
     

    Related

    Talk.ru: 1
    Talk.ru: 2


Log in to post a comment.