mikrocontroller.net

Forum: PC-Programmierung RS232 - Parameter bei Hardware Handshake


Autor: c.nelli (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: c.nelli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
import serial
import time

ser = serial.Serial(
                    port='COM2',
                    baudrate=4800,
                    rtscts=False,
                    dsrdtr=False)
ser.setDsrDtr(0)
ser.setRTS(0)
ser.setDTR(0)


#ser.write('\x53')
#time.sleep(0.1)
#ser.write('\x49')

ser.write('\x53\x49')
time.sleep(0.1)
ser.write('\x0d')
time.sleep(0.1)
ser.write('\x0a')
time.sleep(2)
ser.close()


Protokoll: Port Monitor
Baud rate 4800
<20100727153758.500 SYS>
RTS on
<20100727153758.500 SYS>
DTR on
<20100727153758.500 SYS>
Data bits=8, Stop bits=1, Parity=None
<20100727153758.500 SYS>
Set chars: Eof=0x00, Error=0x00, Break=0x00, Event=0x00, Xon=0x11, Xoff=0x13
<20100727153758.509 SYS>
Handflow: ControlHandShake=(DTR_CONTROL), FlowReplace=(TRANSMIT_TOGGLE, RTS_CONTROL), XonLimit=34496, XoffLimit=8624
<20100727153758.512 SYS>
RTS off
<20100727153758.518 SYS>
DTR off
<20100727153758.533 TX>
SI [len=2]
<20100727153758.735 TX>
<LF>
<20100727153800.735 SYS>
Set timeouts: ReadInterval=0, ReadTotalTimeoutMultiplier=0, ReadTotalTimeoutConstant=0, WriteTotalTimeoutMultiplier=0, WriteTotalTimeoutConstant=0
<20100727153800.742 SYS>
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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: c.nelli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Folgender Code ändert nichts an den Parametern.
Liege ich richtig, dass ControlHandShake() und FlowReplace() einfach 
leer sein sollten?
import serial
import time

ser = serial.Serial(port='COM2', baudrate=4800)

ser.write('\x53\x49')
time.sleep(0.1)
ser.write('\x0d')
time.sleep(0.1)
ser.write('\x0a')
time.sleep(2)
ser.close()



PortMonitor:
<20100727161143.285 SYS>
COM port is opened
<20100727161143.285 SYS>
In/out queue size 4096/4096
<20100727161143.285 SYS>
Set timeouts: ReadInterval=0, ReadTotalTimeoutMultiplier=0, ReadTotalTimeoutConstant=0, WriteTotalTimeoutMultiplier=0, WriteTotalTimeoutConstant=0
<20100727161143.285 SYS>
Baud rate 4800
<20100727161143.285 SYS>
RTS on
<20100727161143.285 SYS>
DTR on
<20100727161143.285 SYS>
Data bits=8, Stop bits=1, Parity=None
<20100727161143.285 SYS>
Set chars: Eof=0x00, Error=0x00, Break=0x00, Event=0x00, Xon=0x11, Xoff=0x13
<20100727161143.292 SYS>
Handflow: ControlHandShake=(DTR_CONTROL), FlowReplace=(TRANSMIT_TOGGLE, RTS_CONTROL), XonLimit=34496, XoffLimit=8624
<20100727161143.292 SYS>
Purge the serial port: RXABORT, RXCLEAR, TXABORT, TXCLEAR
<20100727161143.293 TX>
SI [len=2]
<20100727161143.495 TX>
<LF>
<20100727161145.495 SYS>
Set timeouts: ReadInterval=0, ReadTotalTimeoutMultiplier=0, ReadTotalTimeoutConstant=0, WriteTotalTimeoutMultiplier=0, WriteTotalTimeoutConstant=0
<20100727161145.507 SYS>
COM port is closed

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.