So ich schreibe zur Zeit an einer eigenen Ausgabe Software für LCDs die mir unter anderem die Informationen von iTunes und so weiter ausgibt. Jetzt habe ich jedoch ein Problem.
Und zwar würde ich von der Software alle 3-5sec. mal abfragen lassen ob auch wirklich ein IO-Warrior vorhanden ist.
Ich wollte das erst über den IOWKITOPENDEVICE machen jedoch habe ich damit das Problem, wenn mir jemand den IO-Warrior absteckt. Und der Befehl erneut ausgeführt wird bekomme ich ein Handle zurück und eben keine 0 somit kann ich nicht mit Sicherheit sagen dass der IO Warrior da ist oder nicht.
Gibt es denn elegantere Lösungen für dieses Phänomen.
Mit closedevice hab ich es schon probiert dies verhindert jedoch nur ein abschmieren meines Programms beim Beenden.
Kann dass sein dass zum Schluss des Programmes auf jeden Fall ein CloseDevice erfolgen muss?
Mit freundlichen Grüßen
Daniel
Hmm ich glaub auf der ersten Seite im Forum steht was ich brauch ich probiere das mal bin ja mal gespannt!
Wohl doch nicht. Naja kann schon sein aber die Funktion UNLOADIOWKITAPI ist ja nicht bestandteil der iow.bas bzw. der IOW.dll sondern scheint ein Programmiersprachenbezogener Befehl zu sein. Deswegen hoffe ich nun doch auf eure Hilfe.
IOW24 - VisualBasic --> IOW vorhanden oder nicht
Moderator: Guido Körber
- Christoph Jung
- Posts: 673
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Direkt überprüfen, ob ein IOWarrior noch angesteckt ist könnte man mittels der Seriennummer oder ähnlichem. Wenn dort ein ungültiger Wert zurückgeliefert wird könnte man anhand dessen das Programm Beenden oder Anhalten.
Eine andere Lösung wäre mit Timeout zu arbeiten. Wenn ein Schreibbefehl schief gehen sollte, könnte man nach eine vorher eingestellten Wartezeit das Programm Beenden.
Ein CloseDevice beim beenden des Programmes wäre auf jedenfall ratsam. Schließlich benötigt man den IOWarrior dann nicht mehr und die meißten Betriebssysteme reagieren allergisch auf "Geister".
Frage zum Schluss:
Welches API wird denn verwendet?
Eine andere Lösung wäre mit Timeout zu arbeiten. Wenn ein Schreibbefehl schief gehen sollte, könnte man nach eine vorher eingestellten Wartezeit das Programm Beenden.
Ein CloseDevice beim beenden des Programmes wäre auf jedenfall ratsam. Schließlich benötigt man den IOWarrior dann nicht mehr und die meißten Betriebssysteme reagieren allergisch auf "Geister".
Frage zum Schluss:
Welches API wird denn verwendet?
Software developer
die 1.5.0.0 Version verwende ich zurzeit.
Hmm also sollte ich mich vom Handle wegbewegen und wenn ich mal einmal den warrior mit nem Handle erkannt hab einfach überprüfen ob die SN bei jedem durchlauf stimmt ... da bei abgesteckten Warrior wohl nichts gutes zurückkommt?
Hab ich das richtig verstanden
Hmm also sollte ich mich vom Handle wegbewegen und wenn ich mal einmal den warrior mit nem Handle erkannt hab einfach überprüfen ob die SN bei jedem durchlauf stimmt ... da bei abgesteckten Warrior wohl nichts gutes zurückkommt?
Hab ich das richtig verstanden
- Christoph Jung
- Posts: 673
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Ja so habe ich das gemeint. Ich bin mir zwar nicht 100% sicher ob das immer funktioniert (oder überhaupt) aber ein versuch ist das sicher wert.
Ansonsten könnte man noch probieren immer ein bestimmtes Register vom LCD auszulesen, wo man weiß was drin stehehn MUSS. Wenn dann ein abweichender Wert auftaucht kann man sagen, dass der IOWarrior abgesteckt wurde oder eine andere Fehlfunktion vorliegt.
Ansonsten könnte man noch probieren immer ein bestimmtes Register vom LCD auszulesen, wo man weiß was drin stehehn MUSS. Wenn dann ein abweichender Wert auftaucht kann man sagen, dass der IOWarrior abgesteckt wurde oder eine andere Fehlfunktion vorliegt.
Software developer
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
Mit der Seriennummer funktioniert es nicht, denn die wird in der DLL gecached. Die Schreibbefehle mit Timeout versehen (1 Sekunde reicht da voellig) und wenn der Timeout auftritt IowKitCloseDevice aufrufen. Danach kann man entweder das Programm beenden oder wieder bei IowKitOpenDevice anfangen.
Das Aus- und Einstecken wurde beim API mit Absicht weggelassen, da zu viele Gelegenheitsprogrammierer mit den Anforderungen nicht zurecht kommen und USB-Geraete sowieso nicht an- und abstecken. Es ist auch vertrackt und benoetigt zumindest Callback-Funktionen.
Das Aus- und Einstecken wurde beim API mit Absicht weggelassen, da zu viele Gelegenheitsprogrammierer mit den Anforderungen nicht zurecht kommen und USB-Geraete sowieso nicht an- und abstecken. Es ist auch vertrackt und benoetigt zumindest Callback-Funktionen.
Ok nun das macht das manche um einiges klarer.
Das mit der Seriennummer habe ich auch ausprobiert aber es ist wie Robert sagt und wenn man die Doku liest wird mir auch klar wieso, denn das steht da auch drin.
Des mit WriteTimeout wäre jetz das nächste gewesen, aber danke für die Bestätigung dass das funktionieren wird.
Edit:
So habe nun das Problem gelöst. Ich lasse einen ReadImmediate über einen Timeout ins leere laufen falls er nichts lesen kann. Den ReadImmediate habe ich deshalb verwendet weil er nicht wie die anderen Readbefehle in die DLL Schlange schaut und liest sondern man durch ihn laut Beschreibun den absolut aktuellen Zustand der Pins bekommt. Dieser ist natürlich egal. Denn mich interessiert nur die NULL oder 1 die zurück kommt.
Gegen die Write Variante hab ich mich entschieden, da das ja sonst unter Umständen mein Programm beeinflusst. Denn wird alle 3 sec. etwas in den Warrior geschrieben dürfte das meiner Meinung nach darin resultieren das die Daten ans LCD verfälscht werden.
Kann mir jemand sagen ob dem so ist? Oder ist es so dass bei aktivierter Specialmode Funktion in diesem Fall LCD die betreffenden Ports "gesperrt" sind und dass was ich per Write übergebe sowieso nichts an den ports beeinflusst?
Noch eine Frage bleiben mir wenn ich beide Specialmodes am IOW24 sprich LCD und IR aktiviert habe noch I/O Ports übrig oder wars dass dann schon?
Sollte jemand interesse an meinem Modul haben dass übergibt ob ein IOWarrior vorhanden ist oder nicht dann kann er mir eine Private Nachricht zukommen lassen
Das mit der Seriennummer habe ich auch ausprobiert aber es ist wie Robert sagt und wenn man die Doku liest wird mir auch klar wieso, denn das steht da auch drin.
Des mit WriteTimeout wäre jetz das nächste gewesen, aber danke für die Bestätigung dass das funktionieren wird.
Edit:
So habe nun das Problem gelöst. Ich lasse einen ReadImmediate über einen Timeout ins leere laufen falls er nichts lesen kann. Den ReadImmediate habe ich deshalb verwendet weil er nicht wie die anderen Readbefehle in die DLL Schlange schaut und liest sondern man durch ihn laut Beschreibun den absolut aktuellen Zustand der Pins bekommt. Dieser ist natürlich egal. Denn mich interessiert nur die NULL oder 1 die zurück kommt.
Gegen die Write Variante hab ich mich entschieden, da das ja sonst unter Umständen mein Programm beeinflusst. Denn wird alle 3 sec. etwas in den Warrior geschrieben dürfte das meiner Meinung nach darin resultieren das die Daten ans LCD verfälscht werden.
Kann mir jemand sagen ob dem so ist? Oder ist es so dass bei aktivierter Specialmode Funktion in diesem Fall LCD die betreffenden Ports "gesperrt" sind und dass was ich per Write übergebe sowieso nichts an den ports beeinflusst?
Noch eine Frage bleiben mir wenn ich beide Specialmodes am IOW24 sprich LCD und IR aktiviert habe noch I/O Ports übrig oder wars dass dann schon?
Sollte jemand interesse an meinem Modul haben dass übergibt ob ein IOWarrior vorhanden ist oder nicht dann kann er mir eine Private Nachricht zukommen lassen