Heinz: Elexol Ether I/O 24 Modul

Moin!

Gestern habe ich mir das Elexol Ether I/O 24 Modul (http://www.elexol.com/IO_Modules/Ether_IO_24.php) zum Testen einfacher Schaltungen gekauft und bin nun am Ausprobieren mit Python. Wenn man nun einen einfachen Befehl wie '%' an das Gerät schickt, so kommt nach Anleitung ein String zurück, der sich wiefolgt zusammensetzt:

1 Byte Response Identifier
3 Byte IO24 Serial
4 Byte Sender IP
6 Byte Sender MAC
2 Byte Sender Port

Als Ergebnis erhält man dann:
'%\x02\x01\x8e\xc0\xa8\x00\n\x00\x11\xd8j\x9eR\x80;'

Meine Frage ist nun, wie dieser String genau codiert ist. Man kann ihn wohl mit dem struct-Modul zerlegen, doch wie genau mache ich das? Und was macht das struct Modul in diesem Falle eigentlich genau?

Mfg, Heinz

  1. Hallo,

    1 Byte Response Identifier
    3 Byte IO24 Serial
    4 Byte Sender IP
    6 Byte Sender MAC
    2 Byte Sender Port

    Als Ergebnis erhält man dann:
    '%\x02\x01\x8e\xc0\xa8\x00\n\x00\x11\xd8j\x9eR\x80;'

    Meine Frage ist nun, wie dieser String genau codiert ist.

    steht doch ausführlich oben drüber.
     1 Byte Response Identifier   0x25 = '%'
     3 Byte IO24 Serial           0x02, 0x01, 0x8E = 00000010, 00000001, 10001110 binär
     4 Byte Sender IP             192.168.0.10
     6 Byte Sender MAC            00 11 D8 6A 9E 52
     2 Byte Sender Port           15232 (0x3B80) oder 32827 (0x803B)

    Bei der Portnummer ist nicht ganz klar, ob LSB zuerst übertragen wird (Intel-Format) oder das MSB (Motorola). Deswegen sind da zwei Interpretationen möglich.

    Man kann ihn wohl mit dem struct-Modul zerlegen, doch wie genau mache ich das? Und was macht das struct Modul in diesem Falle eigentlich genau?

    Ich kenne Python nicht, und das struct-Modul noch weniger. Aber eigentlich brauchst du doch nur auf die einzelnen Bytes des Strings zuzugreifen.

    So long,
     Martin

    --
    Ist die Katze gesund,
    freut sich der Hund.
    1. Moin!

      Als Ergebnis erhält man dann:
      '%\x02\x01\x8e\xc0\xa8\x00\n\x00\x11\xd8j\x9eR\x80;'

      Meine Frage ist nun, wie dieser String genau codiert ist.

      steht doch ausführlich oben drüber.
      1 Byte Response Identifier   0x25 = '%'
      3 Byte IO24 Serial           0x02, 0x01, 0x8E = 00000010, 00000001, 10001110 binär
      4 Byte Sender IP             192.168.0.10
      6 Byte Sender MAC            00 11 D8 6A 9E 52
      2 Byte Sender Port           15232 (0x3B80) oder 32827 (0x803B)

      Bei der Portnummer ist nicht ganz klar, ob LSB zuerst übertragen wird (Intel-Format) oder das MSB (Motorola). Deswegen sind da zwei Interpretationen möglich.

      Danke für die genaue Aufdröselung. Was mir aber nicht ganz klar ist, ist folgendes:

      Warum wird der Linefeed (\n) z.B. nicht als \x0A kodiert sondern steht hier als Escape-Sequenz? Das gleiche ist auch bei % oder dem Strichpunkt für mich nicht ganz erklärlich ...
      Und was bedeutet das \xd8j bzw. das \x9eR? Das sind doch keine gültigen Hexadezimalzahlen, oder?

      Mfg, Heinz

      1. Yerf!

        Warum wird der Linefeed (\n) z.B. nicht als \x0A kodiert sondern steht hier als Escape-Sequenz? Das gleiche ist auch bei % oder dem Strichpunkt für mich nicht ganz erklärlich ...
        Und was bedeutet das \xd8j bzw. das \x9eR? Das sind doch keine gültigen Hexadezimalzahlen, oder?

        Scheint einfach nur eine Eigenheit der Ausgabe zu sein:

        • nichtdruckbare Zeichen werden als Escapesequenz angezeigt ('\xd8','\x9e')
        • für Escapesequenzen wird falls vorhanden eine Kurzschreibweise verwendet ('\n')
        • darstellbare Zeichen werden direkt ausgegeben ('%',';','j','R')

        Gruß,

        Harlequin

        --
        <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->