Ich möchte damit für meine Home-Automatisierung einen ganzen Schwung Inputs
und ein paar Outputs realisieren, die bislang noch via Parallelport-Karte
angeschlossen sind.
Basierend auf dem Testprogramm habe ich mir ein kleines C-Programm geschrieben,
das mittels einer Endlosschleife und via ReadNonBlocking
für jede Input-Port-Änderung eine Zeile ausgibt.
Ich bin dabei über ein Problem mit EMIs auf dem USB-Port gestolpert,
welches hier im Forum auch schon mal beschrieben wurde
(viewtopic.php?f=2&t=1746).
Bei mir passiert öfters ein:
Code: Select all
... port 1 disabled by hub (EMI?), re-enabling...
... USB disconnect, device number 2
... iowarrior 2-1:1.0: I/O-Warror #0 now disconnected
... iowarrior 2-1:1.1: I/O-Warror #1 now disconnected
... [...]
... iowarrior 2-1:1.0: IOWarrior product=0x1503, serial=000016F7 interface=0 now attached to iowarrior0
... iowarrior 2-1:1.1: IOWarrior product=0x1503, serial=000016F7 interface=1 now attached to iowarrior1
wer den EMI auslöst (eine Gembird SIS-PM, eine via USB steuerbare
schaltbare Steckdosenleiste, beim Ausschalten einer Steckdose).
Durch Umstecken auf einen anderen Port kann ich diese EMIs von "oft"
auf "selten" reduzieren.
Das Problem ist, dass mein kleines Programm nichts davon mitbekommt, dass
der IOWarrior disconnected und neu verbunden wurde.
Es liest munter weiter, bekommt aber keine Input-Port-Änderungen mehr mit.
Ich vermute, dass es immer noch die alten, gar nicht mehr gültigen
USB-Devices offen hat und dort lauscht.
Das Programm läuft einfach weiter
und verhält sich ganz normal - ich kann überhaupt nicht erkennen,
dass es schon lange nicht mehr mit dem IOWarrior verbunden ist.
Erst, wenn ich das Programm stoppe und neu starte, verbindet er sich mit
den neuen Devices und liest dann wieder die Input-Änderungen.
Das Verhalten macht diese Lösung für Überwachungsaufgaben praktisch
unnutzbar. Selbst, wenn ich die Quelle für die vielen EMIs abstelle,
kann ich doch nie ausschließen, dass so ein Ereignis (ein Disconnect und Reconnect) irgendwann mal
passiert. Und ab da bekomme ich dann keine Änderungen mehr mitgeteilt.
Meine Frage ist jetzt: Gibt es eine Möglichkeit, diesen Disconnect
im Programm zu erkennen? Dann könnte ich ja die Devices schließen
und neu öffnen. Anahnd der errno konnte ich nix erkennen.
Meine einzige Lösung bislang war, in der Endlosschleife nicht nur das
Read zu machen, sondern jedes mal das Device auf und hinterher wieder zu.
Aber das sieht für mich "selten-C-Pogrammierer" irgendwie nach einer
ineffektiven Holzhammer-Methode aus...
Das Problem müsste doch eigentlich weit verbreitet sein und die Lösung
damit ganz naheliegend?!
Wenn es hilft, kann ich gerne noch weitere Details beisteuern!