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.
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);
}
?>
Kommentar