beteigeuze
Anmeldungsdatum: 23. April 2009
Beiträge: 55
|
Hallo Leute, ich habe mir eine Relaisplatine mit zwei Relais gebaut, die über den RTS/DTR Pin der seriellen Schnittstelle gesteuert werden. Mit setserial /dev/ttyUSB1 0 0 schalte ich z.B. beide ganz einfach ein. Nun möchte ich aber zwei Geräte dran hängen, die von unterschiedlichen Skripten gesteuert werden und unabhängig voneinander an und aus geschaltet werden müssen. Mit "setserial" kann ich ja leider immer nur beide Pins gleichzeitig setzen, so kann es passieren, dass ich aus Versehen das eine Gerät zur falschen Zeit an/aus schalte. Kann man die beiden Pins auch irgendwie unabhängig voneinander de-/aktivieren? Grüße,
beteigeuze
|
theinlein
Anmeldungsdatum: 29. Dezember 2007
Beiträge: 1279
|
Hi, für so serielles Zeug nehme ich immer tcl. Da kann man relativ detailliert zugreifen.
Falls dein Adapter das einzelne Schalten umsetzt, müsste das so gehen: #! /bin/bash
# this is only Comment where the line ends with backslash \
exec tclsh "$0" "$@"
set myDEVICE "/dev/ttyUSB1"
#-----------------------------------------
proc openTTY { dev } {
# oeffnet die Verbindung / serielle Leitung.
# + raw Mode
# + 9600 bps
# + 8 Bit, 1 Stopbit, ohne Parity
# RET: des File-Descriptor
#-----------------------------------------
set cdes [open $dev r+ ]
# 9600 bps, no parity check, 8 data bits, 1 stop bit
# handle everything binary
fconfigure $cdes -encoding binary -translation binary -mode 9600,n,8,1 -handshake rtscts
return $cdes;
}
#-----------------------------------------
proc setRtsDts { fdes rts dts } {
# setzt an der seriellen Schnittstelle
# die Signale RTS und DTS
#-----------------------------------------
set descriptor [ openTTY $fdes ]
puts "setze RTS=$rts und DTS=$dts"
fconfigure $fdes -ttycontrol [list RTS $rts DTS $dts]
return
}
puts "+++ Starte Test"
after 1000
setRtsDts $myDEVICE 0 0
after 4000
setRtsDts $myDEVICE 0 1
after 4000
setRtsDts $myDEVICE 1 1
after 4000
setRtsDts $myDEVICE 1 0
puts "+++ Beende Test" Das Testprogramm schaltet nacheinander (mit Wartezeit) jeweils RTD und DTS (nacheinander 0,0 0,1 1,1 1,0).
Schau mal, was deine Relais so fluppen. Hinweis: Untestet, derzeit keinen Adapter verfügbar.
|
beteigeuze
(Themenstarter)
Anmeldungsdatum: 23. April 2009
Beiträge: 55
|
Hi, leider scheint tcl irgendein Problem zu haben. Beim Ausführen kommt die Fehlermeldung, dass er channel /dev/ttyUSB1 nicht finden kann, obwohl das Gerät existiert und mit setserial ganz normal geschaltet werden kann. | +++ Starte Test
setze RTS=0 und DTS=0
can not find channel named "/dev/ttyUSB1"
while executing
"fconfigure $fdes -ttycontrol [list RTS $rts DTS $dts]"
(procedure "setRtsDts" line 7)
invoked from within
"setRtsDts $myDEVICE 0 0"
(file "./test.sh" line 37)
|
|
theinlein
Anmeldungsdatum: 29. Dezember 2007
Beiträge: 1279
|
Sorry, das musste ja so kommen: ein dummer Fehler: Device nicht geöffnet. #! /bin/bash
# this is only Comment where the line ends with backslash \
exec tclsh "$0" "$@"
set myDEVICE "/dev/ttyUSB1"
#-----------------------------------------
proc openTTY { dev } {
# oeffnet die Verbindung / serielle Leitung.
# + raw Mode
# + 9600 bps
# + 8 Bit, 1 Stopbit, ohne Parity
# RET: des File-Descriptor
#-----------------------------------------
set cdes [open $dev r+ ]
# 9600 bps, no parity check, 8 data bits, 1 stop bit
# handle everything binary
fconfigure $cdes -encoding binary -translation binary -mode 9600,n,8,1 -handshake rtscts
return $cdes;
}
#-----------------------------------------
proc setRtsDts { fdes rts dts } {
# setzt an der seriellen Schnittstelle
# die Signale RTS und DTS
#-----------------------------------------
set descriptor [ openTTY $fdes ]
puts "setze RTS=$rts und DTS=$dts"
fconfigure $fdes -ttycontrol [list RTS $rts DTS $dts]
return
}
puts "+++ Starte Test"
set myDes [openTTY $myDEVICE]
after 1000
setRtsDts $myDes 0 0
after 4000
setRtsDts $myDes 0 1
after 4000
setRtsDts $myDes 1 1
after 4000
setRtsDts $myDes 1 0
puts "+++ Beende Test"
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
beteigeuze schrieb: ... Kann man die beiden Pins auch irgendwie unabhängig voneinander de-/aktivieren?
... im Prinzip ja. (sagt Radio Eriwan) Der übliche Weg wäre, die betreffenden Register auszulesen, und dann die Einstellung, die nicht verändert werden soll, einfach aus der bestehenden Einstellung zu übernehmen. (das wäre auf jeden Fall auf Register-Ebene so) Wie das mit setserial geht, habe ich mir noch nicht angeguckt. Kannst Du mir den genauen setserial- Befehl posten, den Du zum Setzen benutzt, damit ich mal eine Vorlage habe ? track
|
beteigeuze
(Themenstarter)
Anmeldungsdatum: 23. April 2009
Beiträge: 55
|
Hi theinlein, jetzt mecker er irgendwas mit "file5" herum?! | +++ Starte Test
couldn't open "file5": no such file or directory
while executing
"open $dev r+ "
(procedure "openTTY" line 8)
invoked from within
"openTTY $fdes "
(procedure "setRtsDts" line 5)
invoked from within
"setRtsDts $myDes 0 0"
(file "./test.sh" line 39)
|
kann ich dann überhaupt mit "fconfigure $fdes -ttycontrol RTS $rts" auch einen einzelnen Pin ansteuern? Hi track, bisher mache ich das so hier: | setserial /dev/ttyUSB1 0 0 #beide aktivieren
setserial /dev/ttyUSB1 1 1 #beide deaktivieren
setserial /dev/ttyUSB1 1 0 #erster deakt, zweiter aktiv
|
Ich habe auch schon probiert das ganze mit C zu machen, aber sobald ich das Device öffne, schaltet er beide automatisch auf 0 (an) | fd = open("/dev/ttyUSB1", O_RDWR);
|
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
beteigeuze schrieb: | setserial /dev/ttyUSB1 0 0 #beide aktivieren
... usw.
|
Das funktioniert bei meinem realen ttyS - Port so gar nicht ... (aber ich habe auch im man setserial noch nicht gefunden, wie man da was zurücklesen kann) Geht das nur bei USB- Adaptern, oder habe ich eine andere Version als Du ? (bei mir: setserial version 2.17, 27-Jan-2000 ) Wenn alles versagt, sollte immer noch tty_ioctl(4) (→ man tty_ioctl "Modem Control") funktionieren, aber das müsstest Du dann irgendwie wrappen. (sowas hatte ich früher schon mal mit einem Perl-Einzeiler gemacht, das ging ganz bequem, aber das Skript finde ich im Moment nicht mehr) track
|
theinlein
Anmeldungsdatum: 29. Dezember 2007
Beiträge: 1279
|
... ich sehe schon... da ist noch ein 'open' in der Funktion setRtsDts übrig geblieben. Bug-Fix: #! /bin/bash
# this is only Comment where the line ends with backslash \
exec tclsh "$0" "$@"
set myDEVICE "/dev/ttyUSB1"
#-----------------------------------------
proc openTTY { dev } {
# oeffnet die Verbindung / serielle Leitung.
# + raw Mode
# + 9600 bps
# + 8 Bit, 1 Stopbit, ohne Parity
# RET: des File-Descriptor
#-----------------------------------------
set cdes [open $dev r+ ]
# 9600 bps, no parity check, 8 data bits, 1 stop bit
# handle everything binary
fconfigure $cdes -encoding binary -translation binary -mode 9600,n,8,1 -handshake rtscts
return $cdes;
}
#-----------------------------------------
proc setRtsDts { fdes rts dts } {
# setzt an der seriellen Schnittstelle
# die Signale RTS und DTS
#-----------------------------------------
puts "setze RTS=$rts und DTS=$dts"
fconfigure $fdes -ttycontrol [list RTS $rts DTS $dts]
return
}
puts "+++ Starte Test"
set myDes [openTTY $myDEVICE]
after 1000
setRtsDts $myDes 0 0
after 4000
setRtsDts $myDes 0 1
after 4000
setRtsDts $myDes 1 1
after 4000
setRtsDts $myDes 1 0
puts "+++ Beende Test"
|
beteigeuze
(Themenstarter)
Anmeldungsdatum: 23. April 2009
Beiträge: 55
|
hi track, kann auch gar nicht funktionieren 🙄
Ich hab gerade setserial noch mal aus den Paketquellen installiert, weil bei mir gar keine manpage dabei war und jetzt geht es auch nicht mehr. Mir fiel aber gerade ein, dass ich irgendwann mal ein C-Programm gezogen hatte, das nur DTR/RTS setzt und ich glaube, das hab ich unter dem Namen "setserial" abgespeichert und mit der Installation vom richtigen setserial gerade überschrieben 😕 Hi theinlein, ich musste das DTS noch gegen DTR tauschen, aber für DTR scheint es nun zu funktionieren.
RTS wird hingegen eingeschaltet und bleibt es auch. Nicht einmal mit meinem setserial lies es sich wieder umschalten?!
Problem ist hier auch, dass beim Öffnen des Device beide Relais eingeschaltet werden.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Wenn Du sowieso schon mal ein C- Programm hattest, dann könntest Du das doch direkt noch einmal nehmen und die oben von mir zitierte Kernel-Funktion von dort aus aufrufen. Dann brauchst Du gar nicht weiter rätseln, und es tut was Du willst. Du musst das Ding ja nicht wieder setserial nennen ... setdtr geht doch auch. 😉 LG, track
|
theinlein
Anmeldungsdatum: 29. Dezember 2007
Beiträge: 1279
|
Hi, darf ich fragen, ob ich das auch kapiert habe: Das open zieht alle beide nach oben und dann tut sich quasi nichts mehr bis kurz vor Schluss, wo DTR runter geht, RTS aber unbeeinflussbar bleibt? Noch ein Versuch: setze in openTTY bei fconfigure
-handshake none
(statt rtscts) bau vor beenden des Scripts noch einen Wartezeitraum ein
after 4000
|
posti
Anmeldungsdatum: 30. März 2009
Beiträge: 2086
|
Hi Habe jetzt den Thread nicht gelesen, kann mir aber NICHT vorstellen, daß ein Relais direkt von einem Pin an der COM die Außenwelt beeinflussen können soll. Was macht das COM-Port (sofern überhaupt noch vorhanden) beim Booten? Was machen die Relais, wenn der Computer meint, ein Modem ansteuern zu müssen? Lichterorgel, bis 'oh, kein Modem da' erkannt wird? Je nach dem, was an den Relais hängt und/oder die Geräusche der Relais, wären für mich ausreichend, dort einem µC vor zu hängen, Der nur darauf achtet, ob ER angesprochen wird und DANN einen seiner vielen OUT-Pins ein/aus/umschaltet. Dadurch wird es auch äußerst unwahrscheinlich, daß ein Relais unbeabsichtigt schaltet. Dabei wären wir zwar nicht mehr so hardwarenah (einzelne Pins am PC direkt verstellen), würden diese Mehrbytes aber für Fehler-Unanfälligkeit erkaufen. und ... was sind heute zwei/drei Byte, die quasi als 'Adresse' vor dem Befehl auf der seriellen Schnittstelle gesendet werden ... MfG & Abo
|
theinlein
Anmeldungsdatum: 29. Dezember 2007
Beiträge: 1279
|
@posti: das geht schon. Es ist sozusagen eine Lösung, wenn eben nur eine serielle Schnittstelle da ist und nicht viel geschaltet werden soll. Bei den USB-Seriell-Adaptern ist es aber so eine Sache: die sind nicht immer so ganz 100% identisch mit dem Verhalten einer "echten" Seriellen. Es ist eine Lösung, wenn man so etwas schon zu Hause herumliegen hat. Wenn man erst einkaufen muss, dann kauft man besser gleich eine ansteuerbare Relaiskarte (z.B. so eine für Modellbahner) - gibt's günstig.
|
beteigeuze
(Themenstarter)
Anmeldungsdatum: 23. April 2009
Beiträge: 55
|
So, nun bin ich wieder zu Hause und hab noch etwas herumprobiert. Dein Script scheint jetzt zu funktionieren, theinlein. Leider gibt es das gleiche Problem, wie bei dem C-Programm. Sobald die Schnittstelle geöffnet wird, um die Pins zu setzen, führt sie wohl automatisch ein Reset oder sonst was aus, sodass RTS/DTR beide automatisch auf 0 gesetzt werden. Also muss ich wieder beide gleichzeitig setzen ☹
Wenn ich wenigstens vorher die aktuellen Status von DTR/RTS auslesen könnte, wäre es ja kein Problem. Hi Posti, die Relais hängen natürlich nicht direkt an einem Pin, da ist noch ein Transistor dazwischen. Im Prinzip hab ich die Schaltung hier verwendet: http://www.franksteinberg.de/erel.htm
Wenn sich der PC einschaltet, klackern beide Relais halt mal kurz, aber das ist nicht weiter schlimm. An jedem Relais (bzw. zurzeit nur an einem) hängt eine Kamera, die vom PC gesteuert wird.
Ein µC wäre natürlich auch eine tolle Sache, vor allem weil der dann auch erweiterbar ist. Für diese Aufgabe dachte ich aber reichen die beiden Relais, die halt direkt angesteuert werden.
|
theinlein
Anmeldungsdatum: 29. Dezember 2007
Beiträge: 1279
|
Hi, auslesen geht nicht - es sei denn, du machst dir eine Art Brückenstecker: Du überbückst RTS mit CTS und DTR mit DSR. Das müsste gehen, wenn man je CTS bzw. DSR ausliest - das sind ja dann Eingänge. Aber: Das Setzen beim Öffnen ist klar. Die Frage wird sein, ob du deine Releais-Schaltung so anpassen kannst, dass du diesen Zustand als "Freischalt-Synchronimpuls" nutzen kannst?
|