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
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.
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.