Ankündigung

Einklappen
Keine Ankündigung bisher.

String mit Buffer lesen

Einklappen

Neue Werbung 2019

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

  • String mit Buffer lesen

    Hallo Leute,

    brauche dringend Eure Hilfe, irgendwas klappt bei mir nicht.
    Ich versuche RFID-Reader über COM-Port abzufragen. Antworten vom Reader werden manchmal in einem Datensatz gesendet, manchmal in drei, manchmal in zwei. Dafür wird den Buffer verwendet.
    Ablauf: von anderem Skript aus wird das Kommando "Antenne einschalten" an den Reader gesendet. Hier geht es um das Empfangen und das Auswerten von Daten. Je nach Auswertung werden weitere Kommandos verschickt.
    Fehlermeldung kommt keine, die ID des Transponders wird aber nicht gelesen, da die Daten im Buffer nicht vollständig gespeichert werden. Nur den letzten String wird gespeichert.
    Ich weiß, dass ich Daten solange in den Buffer schreiben soll, bis der String vollständig ist. Etwa so:

    $data = RegVar_GetBuffer($idPort);
    $data .= $IPS_Value;
    WENN Datenstream vollständig
    Datenstream verarbeiten
    SONST
    Teilstream mit RegVar_SetBuffer($idPort,$data) zwischenspeichern
    Der Buffer wird jeweils vom auslösenden Befehl gelöscht.

    Nachrichten haben verschiedene Länge. Am Ende jeder Nachricht wird die Prüfsumme angehängt, nichts mehr. Kann man damit entscheiden, ob der Datenstring vollständig ist? Oder ein anderer Ansatz?
    Hier ist der Code, wenn jemand Lust hat, drauf zu kucken.
    PHP-Code:
    <?
      // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
      $data  = RegVar_GetBuffer($id);  
      // neu empfangene Daten an $data anhängen
      $data .= $VALUE;

      // String nach Hex umwandeln
      $str = Str2Hex($data);

      //Wenn  Datenstream vollständig, dann verarbeiten
    if (strlen($data) == 6) {

        // ID des Transponders lesen: [0x01]Inventory
         $inventory = chr(0x07).chr(0xFF).chr(0xB0).chr(0x01).chr(0x00).chr(0x1C).chr(0x56);

         // wenn Antwort auf "Antenne ein " ist 'OK'
         if ($str == "06 00 6A 00 9E D0 ") {
             SetValueString($idAnzeige, "OK, Antenne ein");
             COMPort_SendText($idPort, $inventory);
             RegVar_SetBuffer($idPort, "");
            
         }

         // Wenn Antwort auf Inventory 'No Transponder in Reader Field'
         if ($str == "06 00 B0 01 5C 63 ") {

                SetValueString($idAnzeige, "No Transponder");
         }
     }

         elseif ((substr($str, 0, 14) == "11 00 B0 00 01")&(strlen($data) == 17)) {
               // UID des Transponders extrachieren
                 $tagID = substr($str, 21, 23);
                 SetValueString($idAnzeige, $tagID);
                // Antenne ausschalten
                            $rfOff = "\x06\xFF\x6A\x00\6D\x16";
                 COMPort_SendText($idPort, $rfOff);
                 RegVar_SetBuffer($idPort, "");
         }

     else {

          // Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
          RegVar_SetBuffer($idPort, $data);
     }
     
    ?>


  • #2
    Ganz unbedarft und ohne Kenntnis deiner Funktionen, Variablen, COM oder RFID-Leseverhalten, würde ich eine Schleife vermuten, die das ganze ausliest, bis die Antwort komplett ist.

    ala do {
    $data .= $VALUE;
    usleep(100);
    } while (data_has_pruefsumme($data));

    Woher stammt denn $VALUE? Wird die asynchron befüllt?
    "Mein Name ist Lohse, ich kaufe hier ein."

    Kommentar


    • #3
      In $VALUE werden empfangene Daten gespeichert.
      Du meinst mit der Prüfsumme zu prüfen, ob der String vollständig ist? Soll man dann nach jedem empfangenen Bit die Prüfsumme berechnen? Im ersten Byte steht die Anzahl der Protokollbytes (Länge).

      Kommentar


      • #4
        Kann mir wirklich niemand helfen? Vielleicht ein praktischer Hinweis...

        Kommentar

        Lädt...
        X