RS232 auslesen, Verbindungseigenschaften

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
braku
User
Beiträge: 8
Registriert: Freitag 16. Oktober 2009, 09:20

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
The Spirit
User
Beiträge: 276
Registriert: Freitag 8. Juni 2007, 08:50
Wohnort: 84xxx Bereich
Kontaktdaten:

gibt es ne fehlermeldung oder passiert garnix?
braku
User
Beiträge: 8
Registriert: Freitag 16. Oktober 2009, 09:20

Die Antwort ist:

Code: Alles auswählen

COM4

00 00
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.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Serial.write() erwartet einen String als argument.
Versuche also mal "\x06" anstatt 0x06
braku
User
Beiträge: 8
Registriert: Freitag 16. Oktober 2009, 09:20

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?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

versuchs mal mit:

Code: Alles auswählen

chr(006)
the more they change the more they stay the same
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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dav1d hat geschrieben:versuchs mal mit:

Code: Alles auswählen

chr(006)
In diesem Fall geht es gut, aber dir ist hoffentlich klar, dass man mit voranstehenden Nullen vorsichtig sein muss?

Code: Alles auswählen

>>> 012 == 10
True
Das Leben ist wie ein Tennisball.
braku
User
Beiträge: 8
Registriert: Freitag 16. Oktober 2009, 09:20

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?

Code: Alles auswählen

print "%02x" % ord(xyz)
braku
User
Beiträge: 8
Registriert: Freitag 16. Oktober 2009, 09:20

Ich möchte mal wissen was das Hyperterminal anders macht als ich. :?:
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

EyDu hat geschrieben:
Dav1d hat geschrieben:versuchs mal mit:

Code: Alles auswählen

chr(006)
In diesem Fall geht es gut, aber dir ist hoffentlich klar, dass man mit voranstehenden Nullen vorsichtig sein muss?

Code: Alles auswählen

>>> 012 == 10
True
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
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!?
braku
User
Beiträge: 8
Registriert: Freitag 16. Oktober 2009, 09:20

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?
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?
Benutzeravatar
pyFan
User
Beiträge: 22
Registriert: Sonntag 4. Januar 2009, 15:44

Hallo,

Lass doch mal den Timeout-Parameter

timeout=1

weg. Falls keine Zeichen empfangen werden,
hängt dann die Kommunikation.

Gruss

pyfan
braku
User
Beiträge: 8
Registriert: Freitag 16. Oktober 2009, 09:20

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!!!
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Das hatte doch aber Zap schon vorgeschlagen und du meintest darauf, auch das würde nicht funktionieren. :?:
MfG
HWK
braku
User
Beiträge: 8
Registriert: Freitag 16. Oktober 2009, 09:20

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. ;-)
Benutzeravatar
pyFan
User
Beiträge: 22
Registriert: Sonntag 4. Januar 2009, 15:44

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
Antworten