Ankündigung

Einklappen
Keine Ankündigung bisher.

Parsen in Zeichenketten mit Nullstring

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [EibParser] Parsen in Zeichenketten mit Nullstring

    Hallo EibPC-Experten,

    ich möchte mit dem EibPC über RS232 mit meiner Lüftungsanlage (Zehnder) kommunizieren.
    Die Telegramme werden mittels readrs232(rawdata,len) eingelesen und in einem Puffer aneinandergehängt.
    Die Kommandos enthalten aber auch zum Teil Nullstrings (0x00), sodass eine Suche mit find() leider nur Treffer bis zum ersten 0x00 findet.

    Somit kann ich z.B. in folgendem Paket z.B. nur das Muster "0x07 0xF0" finden, nicht aber "0x6A 0x0D":

    [0x07 0xF0 0x00 0x6A 0x0D 0x03 0x14 0x20 ...]

    Wie kann man eine Suche in solchen Datenpaketen durchführen?

    Vielen Dank schonmal & Gruß

    Bernd

    #2
    Hi,

    versteh die Frage nicht ganz.. vielleicht noch zu früh.. aber hast du mal im
    Handbuch nachgesehen, was unter "Find" so drin steht ?

    Funktion find(String1, String2, Pos1)

    ●String1: Zeichenkette, in der eine (Teil-)Zeichenkette gesucht werden soll
    ●String2: zu findende Zeichenkette
    ●Pos1: Die ersten Pos1 - Vorkommen der zu findenden Zeichenkette ignorieren

    jetzt gibts mehrere Möglichkeiten.. endweder du splittest deinen String nach bzw.
    jedem 0x00 in Teilstrings auf.. oder wenn das das ist was du willst, suchst einfach
    nach dem zweiten 0x07 0xF0 (find (string1, string2, 1u16) ..

    Gruß Martin
    Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

    Kommentar


      #3
      Hi Martin,

      danke für Deine Antwort!
      Das Problem ist, dass find(String1, String2, Pos1) im String1 nur solange sucht, bis es ein 0x00 findet. Dann denkt find(), dass String1 zu Ende ist und beendet die Suche. Es wird dann "END" (=65535) als Ergebnis zurückgeliefert, d.h. "nichts gefunden", obwohl nach dem 0x00 die gesuchte Zeichenkette sehr wohl zu finden gewesen wäre (siehe Beispiel oben).
      find() ist für normale, menschenlesbare Zeichenketten gedacht, diese enden üblicherweise mit einem Nullstring als Ende-Markierung.
      Ich bin ziemlich ratlos, wie man einen nicht-menschenlesbaren Datenstrom halbwegs vernünftig parsen kann.
      An die Sache mit dem Aufsplitten nach 0x00 hab ich auch schon gedacht, aber eine praktikable (=schöne, elegante Implementierung dafür ist mir noch nicht eingefallen.
      Ich hoffe aktuell noch, dass es irgendeine bessere Lösung für das parsen/finden von Zeichenketten gibt...

      Gruß

      Bernd

      Kommentar


        #4
        Moin Bernd,

        Du kannst doch in jedem Zyklus ein Byte aus dem RS232-Puffer lesen und in einen weiteren Puffer umkopieren. Wenn Du dabei auf das Zeichen 0 triffst und der RS232 Puffer eigentlich länger ist, dann schneidest Du das an der Stelle ab und wertest den bisher umkopierten String aus.
        Wenn Dir das nicht gefällt, dann kopierst Du eben nicht 0 an der Stelle sondern z.B. ein Zeichen was beim der Zehnder nicht vorkommt (#,|,&) aber was der EibPC lesen kann.
        Wenn der RS232 Puffer leer ist, weißt Du das Du alles hast.

        Gruß,
        Bernd

        Kommentar


          #5
          Hallo Bernd,

          danke für den Tipp! Ich werde mal versuchen, dass Zeichen-für-Zeichen auslesen und gleich auswerten zusammenzubasteln. Mal sehen, wie weit ich komme Ich werde berichten!

          Dank'Dir & Gruß,

          Bernd

          Kommentar

          Lädt...
          X