Forum: PC-Programmierung RS232 - Parameter bei Hardware Handshake


von c.nelli (Gast)


Angehängte Dateien:

Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von c.nelli (Gast)


Lesenswert?

@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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von c.nelli (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.