ASCII Zeichen von Seriellerschnittstelle

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
lucky-nobody
User
Beiträge: 3
Registriert: Donnerstag 20. Januar 2011, 13:35

Hallo,

ich versuche über Python meinen ATMega16 Byteweise auszulesen und die Bytes in verschiedene Variablen zu schreiben.
Wenn ich die Variablen dann ausgebe erhalte ich einen ASCII-Char, diesen wandle ich mit ord(x) in eine Dezimalzahl die ich als Wert ausgeben oder für weitere Berechnungen nutzen kann.
Das Problem ist nun wenn der ATMega eine 0 oder 0x00 oder 0b00000000 überträgt steht in der Variablen beim einlesen--> b'' (das sind 2 einzelne Hochkommas ohne etwas dazwischen) dies kann ich jedoch nicht mit ord(x) umwandeln da bekomm ich eine Fehlermeldung.
Meine Frage warum liest python das Byte als ASCII und nicht z.B. als hex und wie bekomm ich meine 0 als Dezimal bzw Int.

gruß

roman
BlackJack

@lucky-nobody: Wie werden die Daten denn eingelesen? Ein Nullbyte kennzeichnet in C das Ende von Zeichenketten. Danach sieht das hier irgendwie aus.
lucky-nobody
User
Beiträge: 3
Registriert: Donnerstag 20. Januar 2011, 13:35

es sind keine Zeichenketten sonder nur einzelne Byts, dies sind im Kontroller im Ram abgelegt und werden per UART gesendet, in Python lese ich dann die Byte einzeln in variablen z.B. analogwert=com3.write(1), in dieser Variable steht dann z.B. b'd' da ich diesen Wert als Integer brauche wandle ich ihn mit ord(analogwert) um.
wenn nun im Kontroller eine Null stand steht in analogwert: b'' diesen wert kann ich nicht mit ord umwandeln.
kann ich den Wert nicht direkt als hex oder dezimal von der Com-Schnittstelle in die Variable laden?
oder wie kann ich das ASCII Steuerzeichen NUL---> b'' in eine nutzbare Zahl umwandeln?
BlackJack

@lucky-nobody: In Python sind es Zeichenketten bzw. `bytes` was eine "Bytekette" ist und irgendwo auf C-Ebene muss das ja mal umgewandelt werden.

Du *liest* mit ``com3.write(1)``? Wer immer die Methode so genannt hat, sollte gehauen werden. ;-) Woher kommt denn das Objekt dass Du hier `com3` genannt hast?

Wie willst Du eine Byte*folge* denn bitte als einen Zahlwert an einen Namen binden? Dieses `write()` gibt ja kein einzelnes Byte sondern eine Bytefolge zurück. Die Du halt nur zufällig auf die Länge 1 beschränkst.

Wie man an den Bytewert als Zahl herankommt (ausser `ord()` zu verwenden) erfährst Du sicher aus der Dokumentation zum `bytes`-Datentyp.

Und einen Wert als "hex" an einen Namen binden ist Unsinn, es sei denn Du willst doch keine Zahl sondern eine Zeichenkette. Zahlen sind weder hex noch dezimal. Erst wenn man sie zur Darstellung in eine Zeichenkette umwandelt, muss man eine Basis und ein "Alphabet" verwenden.

Was immer hinter `com3` steckt -- wenn dieses Verhalten für Nullbytes nicht dokumentiert ist, dann solltest Du das als Bug melden.
lucky-nobody
User
Beiträge: 3
Registriert: Donnerstag 20. Januar 2011, 13:35

guten morgen
danke erstmal für die Antworten
hier mal der Programmcode

Code: Alles auswählen

import serial
com3=serial.Serial(2, timeout=10)
print ('Drücken sie Daten --> Starten am Prüfgerät')

analogwert=com3.read(1)

analogwert=ord(analogwert)

print ('Analogwert: ',analogwert, '%')
gibt es eine Möglichkeit einzelne Bytes aus der Com-Schnittstelle irgendwo zu speichern?
Antworten