Hex wird falsch umgewandelt?

Hi zusammen,

ich versuche gerade eine Serielle Kommunikation zu basteln.

Ich habe auch schon erfolgreich Kommandos gesendet und entsprechende Antwort erhalten.
Mein nächster Versuch war das ganze etwas dynamischer zu gestalten und habe mir aus einem String den Hexcode
zusammengebaut. Der Hexcode wird aber im Debug Fenster anders ausgegeben im Transmit als wie der gesendete Code aussieht.

Hat jemand eine Idee woran das liegen könnte ?
Verwende die 4.0 auf einem Raspberry Pi 3

Gesendet wird : \xF6\x0A\x02\x00\x00\x13\x04\x21\x22\x46
Im Transmit steht : 5C 78 46 36 5C 78 30 41 5C 78 30 32 5C 78 30 30 5C 78 30 30 5C 78 31 33 5C 78 30 34 5C 78 32 31 5C 78 32 32 5C 78 34 36
Was soviel heißt das der String 1:1 von Ascii in Hex umgesetzt wird … 5C = / z.b.

$BDADDR = '001304212246';
$BDADDR = wordwrap($BDADDR, 2, '\x',true);


$STRING = '\xF6\x0A\x02\x00\x'.$BDADDR;
$STRING = trim($STRING);
print_r($STRING);

$data = SPRT_SendText($serial, $STRING); // Blink

…bist Du sicher das die „\x“ mitgesendet werden müssen?
Ich würde mal die reinen HEX-Zeichen vor dem Senden mit hexdec umwandeln…

Joachim

Du hast leider gleich zwei Fehler in deinem Skript


echo '\x65'; //geht nicht
echo "\x65"; //korrekt!

Und: Das Hinzufügen von \x in einen String macht daraus nicht magisch, was du erreichen willst. \x ist eine Escape Sequenz, die nur geht, wenn Sie direkt vorhanden ist. Siehe: PHP: Escape sequences - Manual

paresy

Hallo,

ich teste auf der aktuellen Beta auch gerade die serielle Kommunikation und habe das Problem, dass beim Rückschreiben (des unvollständigen Telegramms) in den Buffer der Registervariablen plötzlich pro Zeichen (byte) ein Null hinzugefügt wird.

Beispiel:
Ich teile mit explode („Anfang des Telegramms“,$hexdaten) den hexdaten-String auf. Den zweiten Teil möchte ich gern wieder in den Buffer zurückschreiben (da ja dies mein „neues“ Telegramm ist).

Die hexToString-Umwandlung liefert auch wunder bar:
5A A5 01 00

Wenn ich dies nun in die Registervariable schreibe (RegVar_SetBuffer($_IPS[‚INSTANCE‘], $telegram2):wink: steht im DEBUG der Registervariable:
5A 0A 05 01 00 00

Hat jemand einen Tipp für mich?

Ciao
herbertf

@flobo
Escape Sequenzen benötigt doppelte Anführungszeichen.
Damn sollte es klappen.
Michael

@herbertf:
Warum hextostring?
Du schreibst dann Ascii-Zeichen und keine Bytes in den Buffer.
Lass den Befehl einfach mal weg.
Michael

Hi Nallchan,

ich habe da bestimmt noch einen Hänger :wink:

Um die Daten der Registervar vernünftig in HEX auswerten zu können, muss ich folgendes tun:
$data = RegVar_GetBuffer($_IPS[‚INSTANCE‘]);
// neu empfangene Daten an $data anhängen
$data .= $_IPS[‚VALUE‘];
echo "
data $data"; DIES LIEFERT IRGENDWELCHEN ZEICHENMÜLL (Ascii)
$hexdata=ascii2hex($data); ERST HIERMT KOMME ICH ZU GEscheiten HEX-Darstellungen welche ich auch wieder „bearbeiten“ kann.

Dadurch macht sich auch wieder eine Rückumwandlung hexToString erforderlich.

Hast Due einen Tipp wie ich mir diese dopplete Umwandlung schenke und trotzdem noch gescheite HexBytes sehe?

herbertf

Ah sorry habe Hextostring gelesen und stringtohex gedacht.
Grundsätzlich würde ich so wenig wie irgendwie möglich versuchen den String in ein lesbares Format zu wandeln.
Wonach trennst du den den String?
Zeig mal das ganze Script von dem empfangen der Daten.
Michael
PS:ascii2hex ist ja keine Funktion von PHP. Wie sieht die aus?

Hier scheint der Fehler zu sein:
function ascii2hex($ascii) {
$hex = ‚‘;
for ($i = 0; $i < strlen($ascii); $i++) {
$byte = strtoupper(dechex(ord($ascii{$i})));
$byte = str_repeat(‚0‘, 2 - strlen($byte)).$byte;
$hex.=$byte."\x";
}
return $hex;
}

 
function ascii2hex($ascii) 
{   
  $hex = '';    
  for ($i = 0; $i < strlen($ascii); $i++)   
  {      
    $byte = strtoupper(dechex(ord($ascii{$i})));      
    $byte = str_repeat('0', 2 - strlen($byte)).$byte;      
    $hex.="\x".$byte;    
  }   
  return $hex;  
}

Probier mal so… (Ungetestet)

Gruß,

Toni