Hallo Community, ich stehe vor einem "Kommunikationsproblem" mit einer Digitalwaage. Google, Foren etc. habe ich schon in den letzten Tagen durchforstet, viel dabei erfahren, doch leider noch nicht die Ursache für die fehlende Gesprächsbereitschaft der Waage gefunden. Ich will das aktuelle Gewicht einer digitale Waage mit RS232 Schnittstelle über einen Laptop auslesen. Lt. SS-Beschreibung der Waage habe PIN 6-4 und PIN 7-8 verbunden (Hardware Handshake). Am PC verwende ich einen USB-Adapter. Um das aktuelle Gewicht abzufragen, muss folgende Anfrage gesendet werden: S I CR LF bzw. (53h 49h 0Dh 0Ah). Verbindungsparameter: 4800bps, 8 Bit, 1 Stop, no parity Antwort der Waage: 16 Byte Ich versuche die Lösung mit Python und PySerial zu realiseren - teste das ganze aus der PythonShell und würde auch gerne dabei bleiben, da ich ohne es 100% sagen zu können, hier das Problem nicht vermute. Wenn ich nun die Anfrage über ein Terminalprogramm sende bekomme ich das gewünschte Ergebnis. Teste ich das über mein Programm klappt es nicht, trotz der gleichen Standard Parameter (erkennbarer Unterschied bei ControlHandShake) => siehe Anbei die angewendeten Verbindungsparameter: <bound method Serial.getRtsCts of Serial<id=0x2f6a590, open=True>(port='COM2', baudrate=4800, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=1, dsrdtr=0)> Nun stellt sich mir die Frage, welche Parameter wie geändert werden müssen, damit ich eine Antwort erhalte. Ich hoffe, die Beschreibung ist verständlich und freue mich auch hilfreiche Antworten. c.nelli
c.nelli schrieb: > Lt. SS-Beschreibung der Waage > habe PIN 6-4 und PIN 7-8 verbunden (Hardware Handshake) Mit diesen Verbindungen wird das Hardwarehandshake deaktiviert. Du müsstest schon ein 1:1 verdrahtetes Kabel ohne Brücken darin verwenden, damit das Hardwarehandshake funktioniert. Oder Du passt Deine Software so an, daß sie kein Hardwarehandshake nutzt. Bei der gewählten Übertragungsrate ist der PC ausreichend schnell, um auch ohne Handshake Daten empfangen zu können - allenfalls die Waage könnte zu langsam sein, um längere Telegramme empfangen zu können. Das aber lässt sich durch Einfügen einer geeigneten Wartezeit zwischen den einzelnen an die Waage gesendeten Zeichen hinbekommen. Probiere mal Werte von 10 .. 100 msec.
@Rufus: danke für den Hinweis. Habe nun das senden der Anfrage mit Wartezeit und einiges weitere probiert - leider noch nicht mit dem gewünschten Ergebnis. Wie beschrieben verwende ich Python + PySerial. Ich habe versucht alles zu deaktiveren was mit Handshake zu tun hat (RTS/CTS, DSR/DTR (siehe Code) - dennoch bleiben lt. Portmonitor folgende Werte: Handflow: ControlHandShake=(DTR_CONTROL), FlowReplace=(TRANSMIT_TOGGLE, RTS_CONTROL), XonLimit=34496, XoffLimit=8624 Python Code:
1 | import serial |
2 | import time |
3 | |
4 | ser = serial.Serial( |
5 | port='COM2', |
6 | baudrate=4800, |
7 | rtscts=False, |
8 | dsrdtr=False) |
9 | ser.setDsrDtr(0) |
10 | ser.setRTS(0) |
11 | ser.setDTR(0) |
12 | |
13 | |
14 | #ser.write('\x53') |
15 | #time.sleep(0.1) |
16 | #ser.write('\x49') |
17 | |
18 | ser.write('\x53\x49') |
19 | time.sleep(0.1) |
20 | ser.write('\x0d') |
21 | time.sleep(0.1) |
22 | ser.write('\x0a') |
23 | time.sleep(2) |
24 | ser.close() |
Protokoll: Port Monitor
1 | Baud rate 4800 |
2 | <20100727153758.500 SYS> |
3 | RTS on |
4 | <20100727153758.500 SYS> |
5 | DTR on |
6 | <20100727153758.500 SYS> |
7 | Data bits=8, Stop bits=1, Parity=None |
8 | <20100727153758.500 SYS> |
9 | Set chars: Eof=0x00, Error=0x00, Break=0x00, Event=0x00, Xon=0x11, Xoff=0x13 |
10 | <20100727153758.509 SYS> |
11 | Handflow: ControlHandShake=(DTR_CONTROL), FlowReplace=(TRANSMIT_TOGGLE, RTS_CONTROL), XonLimit=34496, XoffLimit=8624 |
12 | <20100727153758.512 SYS> |
13 | RTS off |
14 | <20100727153758.518 SYS> |
15 | DTR off |
16 | <20100727153758.533 TX> |
17 | SI [len=2] |
18 | <20100727153758.735 TX> |
19 | <LF> |
20 | <20100727153800.735 SYS> |
21 | Set timeouts: ReadInterval=0, ReadTotalTimeoutMultiplier=0, ReadTotalTimeoutConstant=0, WriteTotalTimeoutMultiplier=0, WriteTotalTimeoutConstant=0 |
22 | <20100727153800.742 SYS> |
23 | COM port is closed |
Ich hab nun keine Ahnung mehr, welche Möglichkeiten ich habe an den Einstellunge zu schrauben. Interessant ist, dass die Anfrage über das Terminalprogramm sowohl mit RTS/CTS und OFF funktioniert. Ich freue mich auf hilfreiche Hinweise. c.nelli
Was geschieht, wenn Du die Zeilen ser.setDsrDtr(0) ser.setRTS(0) ser.setDTR(0) auskommentierst und beim Konstruktor(?) nur Schnittstellenname und Baudrate angibst? Laut Dokumentation (http://pyserial.sourceforge.net/pyserial_api.html#classes) sollte dann die Schnittstelle ohne jedwedes Handshake angesteuert werden.
Folgender Code ändert nichts an den Parametern. Liege ich richtig, dass ControlHandShake() und FlowReplace() einfach leer sein sollten?
1 | import serial |
2 | import time |
3 | |
4 | ser = serial.Serial(port='COM2', baudrate=4800) |
5 | |
6 | ser.write('\x53\x49') |
7 | time.sleep(0.1) |
8 | ser.write('\x0d') |
9 | time.sleep(0.1) |
10 | ser.write('\x0a') |
11 | time.sleep(2) |
12 | ser.close() |
PortMonitor:
1 | <20100727161143.285 SYS> |
2 | COM port is opened |
3 | <20100727161143.285 SYS> |
4 | In/out queue size 4096/4096 |
5 | <20100727161143.285 SYS> |
6 | Set timeouts: ReadInterval=0, ReadTotalTimeoutMultiplier=0, ReadTotalTimeoutConstant=0, WriteTotalTimeoutMultiplier=0, WriteTotalTimeoutConstant=0 |
7 | <20100727161143.285 SYS> |
8 | Baud rate 4800 |
9 | <20100727161143.285 SYS> |
10 | RTS on |
11 | <20100727161143.285 SYS> |
12 | DTR on |
13 | <20100727161143.285 SYS> |
14 | Data bits=8, Stop bits=1, Parity=None |
15 | <20100727161143.285 SYS> |
16 | Set chars: Eof=0x00, Error=0x00, Break=0x00, Event=0x00, Xon=0x11, Xoff=0x13 |
17 | <20100727161143.292 SYS> |
18 | Handflow: ControlHandShake=(DTR_CONTROL), FlowReplace=(TRANSMIT_TOGGLE, RTS_CONTROL), XonLimit=34496, XoffLimit=8624 |
19 | <20100727161143.292 SYS> |
20 | Purge the serial port: RXABORT, RXCLEAR, TXABORT, TXCLEAR |
21 | <20100727161143.293 TX> |
22 | SI [len=2] |
23 | <20100727161143.495 TX> |
24 | <LF> |
25 | <20100727161145.495 SYS> |
26 | Set timeouts: ReadInterval=0, ReadTotalTimeoutMultiplier=0, ReadTotalTimeoutConstant=0, WriteTotalTimeoutMultiplier=0, WriteTotalTimeoutConstant=0 |
27 | <20100727161145.507 SYS> |
28 | COM port is closed |
Dann scheint entweder Dein Portmonitor merkwürdiges zu lesen oder aber pySerial merkwürdiges zu treiben. Probier mal, im Gerätemanager das Hardwarehandshake der Schnittstelle zu deaktivieren. Was dort eingestellt wird, dient quasi als "default-Parameter" für Programme, die es nicht selbst anders festlegen. Vielleicht ist pySerial ja so aufgebaut, daß es die Systemvorgaben übernimmt.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.