Seite 1 von 1
RS232 auslesen, Verbindungseigenschaften
Verfasst: Freitag 16. Oktober 2009, 09:46
von braku
Hallo Forum,
ich habe ein Problem beim Auslesen einer Wetterstation über RS232 / Serial.
Wenn ich per Hyperterminal mit der Wetterstation kommuniziere funktioniert die Verbindung nur mit meinem Pythoncode anscheinend nicht.
Nun hoffe ich hier Hilfe zu finden.
Meine Verbindungsparameter sind:
comport 4, Baudrate 2400, Datenbits 8, Parität None, Stopbits 1, Flußsteuerung AUS
DTR = 0, RTS = 1
Mein Quellcode:
Code: Alles auswählen
import os, time, serial
ser = serial.Serial(3, 2400, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=1, xonxoff=0, rtscts=0)
ser.setDTR(0)
ser.setRTS(1)
print ser.portstr
time.sleep(1)
#reset
send_reset = 0x06
w = ser.write(send_reset)
w = ser.write(send_reset)
reset = ser.read(2)
print reset
print "%02x" % ord(reset[0]), "%02x" % ord(reset[1])
time.sleep(0.3)
ser.close()
Zum Testen müssen 0x06 0x06 zur Station gesendet werden. Diese sollte dann mit 0x00 0x02 antworten. Tut sie unter Python aber nicht.
Hat jemand eine Idee?
Gruß Braku
edit: ich arbeite auf einem Windowssystem
Verfasst: Freitag 16. Oktober 2009, 10:44
von The Spirit
gibt es ne fehlermeldung oder passiert garnix?
Verfasst: Freitag 16. Oktober 2009, 11:26
von braku
Die Antwort ist:
Wenn ich z.B. den Befehl zum Auslesen der Innentemperatur sende antwortet die Wetterstation aber die Werte sind unbrauchbar.
Mich wundert nur das es per Hyperteminal klappt. Deshalb denke ich das es an den Verbindungseinstellungen liegen könnte.
Verfasst: Freitag 16. Oktober 2009, 11:47
von Zap
Serial.write() erwartet einen String als argument.
Versuche also mal "\x06" anstatt 0x06
Verfasst: Freitag 16. Oktober 2009, 12:32
von braku
Danke für die schnellen Antworten!
Ich probiere schon seit zwei Tagen dran rumm.
Die Antwort der Station mit "\x06" ist die selbe wie mit 0x06. Hatte ich auch schon probiert.
Mit dem Hyperterminal (HTerm) sende ich zwei hex Werte (0x06) und bekomme 0x00 und 0x02 zurück. Mein Code liefert immer 00 00.
Es könnte also an der Verbindung oder an der Interpretation der Daten liegen.
Hast du noch eine ander Idee?
Verfasst: Freitag 16. Oktober 2009, 12:38
von Dav1d
Verfasst: Freitag 16. Oktober 2009, 12:57
von BlackJack
@Dav1d: Das ist nichts anderes als '\x06', birgt aber die Gefahr, dass jemand denkt ``chr(008)`` wäre auch möglich und kein Syntaxfehler.
Verfasst: Freitag 16. Oktober 2009, 12:57
von EyDu
Dav1d hat geschrieben:versuchs mal mit:
In diesem Fall geht es gut, aber dir ist hoffentlich klar, dass man mit voranstehenden Nullen vorsichtig sein muss?
Verfasst: Freitag 16. Oktober 2009, 13:04
von braku
leider gleiche Antwort...
ord() liefert ja keine hex-Werte. Wenn ich die Antwort als hex haben möchte, wie müsste ich das machen? Oder ist es so ok?
Verfasst: Freitag 16. Oktober 2009, 13:37
von braku
Ich möchte mal wissen was das Hyperterminal anders macht als ich.

Verfasst: Freitag 16. Oktober 2009, 13:50
von numerix
EyDu hat geschrieben:Dav1d hat geschrieben:versuchs mal mit:
In diesem Fall geht es gut, aber dir ist hoffentlich klar, dass man mit voranstehenden Nullen vorsichtig sein muss?
Hat sich mit Python 3 sowieso erledigt:
Code: Alles auswählen
>>> 012 == 10
File "<stdin>", line 1
012 == 10
^
SyntaxError: invalid token
>>> chr(006)
File "<stdin>", line 1
chr(006)
^
SyntaxError: invalid token
Verfasst: Freitag 16. Oktober 2009, 14:35
von BlackJack
@braku: Wie gehst Du denn beim Hyperterminal *genau* vor. Was gibst Du da ein? Und du drückst nicht zufällig am Ende der Eingabe die Eingabetaste, bevor die Antwort kommt!?
Verfasst: Freitag 16. Oktober 2009, 17:02
von braku
Hallo BlackJack.
Ich stelle die Baudrate auf 2400 dann die Datenabits auf 8 und so weiter..
Zum Schluß noch RTS auf '1'.
Dann zum Versenden die Eingabe auf hex stellen 06 06 eingeben und ENTER. Wird aber kein Enter mitgesendet. (Kann man bei HTerm einstellen.)
Ich hab die Station auch schon mit LabView ausgelesen und per Microchip (MAX32). Sie kommuniziert nicht auf die übliche Weise. Mann schickt einen Befehl (Adressbereich) und die Wetterstation antwortet mit dem Inhalt des Adressbereiches. (vereinfacht)
Deshalb ist es mir so Rätzelhaft warum es nicht funktioniert. Habs ja schon mehrmals geschaft.
Kann es sein das Python ein Enter mit sendet?
Verfasst: Freitag 16. Oktober 2009, 20:30
von BlackJack
@braku: Nein Python sendet da kein Enter. Vielleicht wird ja auch überhaupt nichts gesendet. Hast Du schon mal die `flush()`-Methode versucht, um sicherzustellen, dass der Ausgabepuffer auch wirklich rausgeschrieben wird?
Verfasst: Samstag 17. Oktober 2009, 06:58
von pyFan
Hallo,
Lass doch mal den Timeout-Parameter
timeout=1
weg. Falls keine Zeichen empfangen werden,
hängt dann die Kommunikation.
Gruss
pyfan
Verfasst: Samstag 17. Oktober 2009, 13:28
von braku
Guten Tag.
@BlackJack: Hab es gerade mal mit Flush() probiert. Gleiches Ergebnis.
@pyFan: wenn ich den Timeout auf None stelle klemmt die Verbindung und das Programm hängt sich auf. Hab kein except eingebaut
Aber ihr habt mich auf eine Idee gebracht. Habe mir das Programm Serial Port Monitor runter geladen. Es hat eine Spy-Funktion.
Nun habe ich mitgeschnitte was das Hyperterminal sendet und empfängt und was Python raus sendet.
Hyperterminal:
sendet: #06#06
empfängt: #02
Python:
sendet: #36#36
empfängt: #00
Es werden also nicht die von mir vorgegebenen hex-Werte gesendet. Habe jetzt die Funktion write(0x06) in ("\x06") geändert. Jetzt werden die korrekten hex-Werte gesendet.
Ein weiterer Test, zum Auslesen der Luftfeuchtigkeit, hat ebenfalls funktioniert. Obwohl mich dabei gewundert hat das die Wetterstation eigentlich mit 3 Bytes antworten sollte sie aber mit 9 Bytes antwortet.
Man muss aber dazu sagen das diese Wetterstation sehr eigenwillig ist.
Also vielen Dank für eure Hilfe!!!
Verfasst: Samstag 17. Oktober 2009, 13:41
von HWK
Das hatte doch aber Zap schon vorgeschlagen und du meintest darauf, auch das würde nicht funktionieren.
MfG
HWK
Verfasst: Samstag 17. Oktober 2009, 15:35
von braku
Da hast du Recht.
Als ich den Tipp von Zap ausprobierte hab ich "\x06\x06" in den write-Befehl geschrieben. Das geht der Station aber zu schnell. Musste noch einen kurzen sleep dazwischen einbauen.
Da saß der Fehler mal wieder zwischen den Ohren.

Verfasst: Samstag 17. Oktober 2009, 16:49
von pyFan
Hallo,
> Obwohl mich dabei gewundert hat das die Wetterstation eigentlich mit 3 Bytes antworten sollte sie aber mit 9 Bytes antwortet
Mach Dir eine Funktion, die eine variable Folge von Bytes liest,
nicht eine feste. Dann hängt sich das Programm nicht auf.
Ich lese immer jedes Byte einzeln. Man kann ja mit einem Timeout
abbrechen. Das funktioniert sehr gut.
Gruss
Pyfan