Hex Zahlen über uart senden

  • Guten Tag

    Ich habe vor Daten vom Raspberry zu einen Controller zu übertragen über die UART Schnittstelle. Jedoch entspricht mein Protokoll nicht der ASCII Tabelle sondern sind 12 Byte im HEX Format. Meine Frage, wie kann ich über die Serielle Schnittstelle HEX Zahlen übertragen ohne weitere Zeichen, wie Zeilenumbruch usw.

    Ich habe das Packet python-serial installiert und dachte das ich mit dem Testprogramm klappt (siehe weiter unten), wenn ich port.write satt ("hello world") einer eine HEX Zahl eintrage (0x0A). Aber das klappt nicht.

    import serial
    port = serial.Serial("/dev/ttyAMA0", baudrate=115200, timeout=3.0)
    while True:
    port.write(0x0A) #

    Das ist die Fehlermeldung die die Konsole nach versuchter Ausführung des Programms


    Traceback (most recent call last):
    File "serialtest.py", line 6, in <module>
    port.write(0x0A)
    File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 463, in write
    t = len(data)
    TypeError: object of type 'int' has no len()

    Kann mir jemand helfen ?

  • Hi,

    ich kenne jetzt die API nicht, daher
    Mutmaßung: die Funktion erwartet einen String, keinen Zahlenwert ...
    Lösung evtl.: Versuch mal port.write("0x0A")

    du wirst allerdings auf der Gegenseite dann statt Zahlenwerten einen String 0x0A empfangen.

    Abhilfe: ich denke, Du könntest
    1. Auf der Gegenseite den String wieder nach Zahlenwert konvertieren
    2. mal nachsehen, ob es eine Funktion port.write.binary oder so ähnlich gibt, mit der man Zahlenwerte übertragen kann.

    ciao und Grüsse aus dem nassen Chiemgau,
    -ds-

  • Uhmm das stellt mich irgendwie nicht zufrieden, es muss doch möglich sein, wie beim microcontroller , ein einzelnes Byte per uart zu übertragen. Ein Byte das ich definiere ohne an die ASCII Tabelle zu halten.

  • Hey,
    ich hab ein ähnliches Problem, wenn du das liest kannst du mal bitte beschreiben was die Lösung ist?
    Ich empfange ein Protokoll in Hex. Der Rpi macht daraus aber Ascii zeichen. Gibt es die Möglichkeit das aus reines Hex in eine Datei zu schreiben, ohne jegliche Veränderung?

    Sorry für Threadübernehmen. Ich hab auch gesehen, dass der Thread schon was älter ist, trotzdem erhoffe ich mir eine Antwort.

    Danke im Vorraus.

    Einmal editiert, zuletzt von sebwir (26. August 2013 um 14:47)

  • Ok, das schaue ich mir an. Danke.
    Aber wie ist das prinzipiell? Ich bekomme Hexzeichen rein mit cat /dev/ttyAMA0 >> /tmp/text.
    Alles was es im Ascii Hex gibt wird umgewandelt und alles was nicht mehr Ascii Hex ist, bleibt stehen.
    Z.B. so: 1944A1AD wird eingelesen und direkt in ^YD<A1><AD> umgeformt.
    Gibt es eine Möglichkeit diese Umwandlung von Anfang an zu verhindern und nur als Hex in die Datei zu speichern?

    Einmal editiert, zuletzt von sebwir (26. August 2013 um 14:38)

  • Moin sebwir,

    vieleicht sollte mal klargestellt werden, dass immer binäre Werte übertragen werden - also Bitfolgen von 0 (low) und 1 (high) , sofern es sich nicht um analoge Signale handelt.

    Eine übertragung in hex die von einem anderen, von Mythen verhüllten und in geheimnisvollen Nebeln verborgenen Alien wieder in etwas sonderbares anderes umgewandelt wird, gibt es nicht.

    Die 0 auf der Tastatur hat in hex den Wert 0x30 der durch die ASCII-0 dargestellt wird, dem dezimalen Wert 48 entspricht und mit 00110000 als Bitfolge dargestellt werden kann.

    Du verwechselst hier Wert und Darstellung ...

    cu,
    -ds-

  • Guten Morgen,

    vielen Dank für deine Antwort. Ich bin aber nicht ganz sicher, ob ich dir folgen kann. Wie stelle ich das eins, dass nur binäre Werte übertragen werden? Ich habe hier ein Sensorsystem das je nach Zustand Hexwerte überträgt. Das ist ganz sicher, ich habe dazu Datenblatt und Softwarespezifikation. An diesem System kann ich aber nichts verändern/konfigurieren/programmieren. Aber die Funktion ist getestet.
    Ich hab das System also an an den Rpi angeschlossen, Baudrate verändert und parity bit hinzugefügt, nach Spezifikation des Sensorsystems.
    Wenn ich nun über ttyAMA0 einlese kommt oben Beschriebenes raus. Wenn ich händisch die Protokolle in Ascii Hex umschreibe kommt das Protokoll raus was ich brauche.
    Kannst du mir denn vielleicht erklären wie ich die Darstellung ändere?

    Ach noch eins, ich greife per SSH mit Putty auf den Rpi zu. Könnte es sein, dass dadurch die Darstellung verändert wird? Hab leider kein HDMI Adapter/Bildschirm da, sonst würd ichs eben ausprobieren.

    Grüße und danke nochmal

  • Hi sebwir,

    den Eindruck, dass Du mir da nicht folgen konntest, habe ich allerdings auch ;) ...

    Sicher steht im Datenblatt, dass der Sensor den Wert 0x11 übermittelt. Aber das ist eben nur die Darstellung des Wertes (auf dem Papier). Genauso könnte da stehen, dass er 00010001 übermittelt oder 21 oktal oder 17 dezimal.
    Fakt ist, dass so ein digitales System nur mit 0 und 1 umgehen kann und so in jedem Fall der Wert als 00010001 über die Leitung geht und am anderen Ende als 00010001 empfangen wird.

    Das Problem ist, dass "Mensch" mit diesen digitalen Werten nicht so recht umgehen kann und sich deshalb was einfallen lassen musste.
    Resultat ist das Hexadzimal-System, das oktale, das dezimale, das binäre Darstellungsformat.


    Zitat


    Wenn ich nun über ttyAMA0 einlese kommt oben Beschriebenes raus. Wenn ich händisch die Protokolle in Ascii Hex umschreibe kommt das Protokoll raus was ich brauche.
    Kannst du mir denn vielleicht erklären wie ich die Darstellung ändere?

    Genau das hast Du gemacht ... die Darstellung geändert. Den Wert kannst Du nicht beeinflussen, der kommt einfach an. Und in diesem Moment hast Du entschieden, ich möchte den Wert in Hexadezimal-Darstellung "sehen".

    So gesehen schreibt Dein cat /dev/ttyAMA0 > datei genau das in die Datei, was über die Leitung kommt ...
    Du kannst sie aber wiederum auf dem Terminal nicht anschauen, weil das Terminal nur ASCII-Zeichen im druckbaren Bereich darstellen kann.
    Also wäre es jetzt Dein Job, die Daten aus der seriellen Schnittstelle auszulesen und anschliessend in einer Form darzustellen, die Deinen Wünschen entspricht ( also z.b. read(fd, .... ... printf("%0x", wert) ) um die Daten in hexadezimaler Darstellung auszugeben.

    Jetzt klar?
    cheers,
    -ds-

  • Danke nochmal für die Antwort, ist mir auch im Laufe des Tages schon klar geworden ;)
    Ich hab dann ttyAMA0 mit hexdump gepiped und hatte mein Protokoll. Hat wunderbar geklappt. Allerdings werden jetzt irgendwo bytes verschluckt und ich weiß noch nicht wo.
    Das ist jetzt die nächste Baustelle ;)

  • manches sind halt Steuercodes Xon und Xoff z.B. wenn du soft flow aktiviert hast dann passiert sowas

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)


  • Also wäre es jetzt Dein Job, die Daten aus der seriellen Schnittstelle auszulesen und anschliessend in einer Form darzustellen, die Deinen Wünschen entspricht ( also z.b. read(fd, .... ... printf("%0x", wert) ) um die Daten in hexadezimaler Darstellung auszugeben.

    dbv hat den Weg oben schon mit python hex() vorgeschlagen. Da steckst Du Deine gelesenen binaeren Werte rein und danach hast Du sie in einer hex Darstellung und musst sie nur noch auf dem Bildschirm ausgeben.

    Also wird 1944A1AD eingelesen und dann als 0x1944A1AD ausgegeben.

  • Hey Sry,
    aber die lösung ist die datengröße anzugeben (chr) dann macht er es.....

    sieher des beispiel hier
    port.write(chr(0x0A))

    Waere nett wenn Du noch kurz fuer die Nachwelt schildern koenntest was Deine Problemloesung ist :rolleyes:

    RE: Hex Zahlen über uart senden
    Hey Sry,
    aber die lösung ist die datengröße anzugeben (chr) dann macht er es.....

    siehe des beispiel hier
    port.write(chr(0x0A))

    Einmal editiert, zuletzt von JayB (31. August 2013 um 13:48)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!