HintergrundPerl pack() ing eine Nachricht?
Ich habe ein Gerät an einer seriellen Schnittstelle an meine Maschine verbunden, die Nachricht ausgerichtet ist, wobei jede eingehende Befehlsnachricht genau acht Worte 16-Bit ist. Das höchstwertige Byte jedes Wortes wird zuerst empfangen und das niedrigstwertige Byte wird als zweites empfangen. Jedes Kopfzeilenwort ist eine Befehlskennung (von 0 bis 255). Das Format ist wie so definiert:
XXXX Header Word (Placeholder for 16-bit Hexadecimal value)
XXXX Data Word
XXXX Data Word
XXXX Data Word
XXXX Data Word
XXXX Data Word
XXXX Data Word
XXXX Checksum Word (Result of Exclusive OR on header word and all six data words)
Das Format für den Befehl, den ich senden müssen, header 0x5D, wie so definiert:
Word 1: Header = 005Dh
Word 2: Mode (values can be 2, 3, 6, 8, 9)
Words 3-7: Not significant
Word 8: 16 bit checksum
Fragen (alle bezogen)
Ich habe dieses Beispiel aus anderem Quellcode, der diese Nachricht scheinbar korrekt sendet, aber ich bin mir nicht sicher, was vor sich geht, auch nach dem Lesen von perldoc auf dem Paket.
pack("v"x8, 0x00, 0x5D, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x5D);
- "v" bedeutet, Little-Endian, aber ich kann keinen Hinweis auf die x8 folgenden es finden.
- Und nach dem Format der Nachricht, sollte nicht der 0x5D Wert nach dem "v" x8, nicht nach dem 0x00 sein?
- Die Nachricht soll acht 16-Bit-Wörter haben, also warum gibt es 16 und nicht 8? Einige sind 0x00 und nicht 0x0? Macht das einen Unterschied?
nicht ' "v" x8' bedeutet' vvvvvvvv'? – Fabricator
Ah, richtig. Die Zeichenfolge, die Multiplikatormagie wiederholt. Nicht im Zusammenhang mit Pack sondern Saiten im Allgemeinen. Also wurde es nur knapp geschrieben anstatt "pack" ("vvvvvvvv", ....). Immer noch auf Fragen 2 und 3 verloren. – rem45acp
Auf welchen "0x68-Wert" beziehen Sie sich in Frage 2? Es gibt keinen 0x68-Wert in der angegebenen Spezifikation oder im Code. – jwodder