|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Pellkartoffelsalat
Anmeldungsdatum: 11.04.2005 Beiträge: 10 Wohnort: Moormerland
|
Verfasst am: 08.04.2011, 12:32 Titel: Timeout bei GET vom COM Port |
|
|
Hallo, ist es möglich einen TIMEOUT beim Abrufen des COM Ports einzustellen?
Das Ganze dient dazu, eine Relais Karte anzusprechen, die Rückmeldung gibt, solange nix daneben läuft.
Bin für jede Hilfe Dankbar
Pelle
Code: | dim as ubyte a(3)
dim as ubyte b(3)
dim as string port
input "Port=";port
start:
print Open COM ("COM"+port+": 19200, N, 8, 1,CS0,DS0" As #1)
print "start"
input "Kommando=";a(0)
input "Adresse =";a(1)
input "Relais =";a(2)
a(3)=a(0) xor a(1) xor a(2)
put #1,,a()
sleep 80
get #1,,b()
print b(1)
close
goto start
|
_________________ Ich bin ein Bombenexperte, wenn du mich rennen siehst, renn mir hinterher |
|
Nach oben |
|
|
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 10.04.2011, 13:02 Titel: |
|
|
ich nehme an, get #1 blockiert, bis daten ankommen.
du müsstest dich irgendwie davon informieren lassen, ob auf #1 genügend daten anliegen oder nicht
in der C/C++-welt macht select() bzw poll() oder epoll() damit.
diese können auch ein timeout empfangen
die erhalten ein set von dateideskriptoren, welche sie auf änderungen überwachen. entweder wenn mindestens einer geändert wurde oder wenn das timeout abgelaufen ist, kehren sie zurück (bis dahin blockieren sie, ähnlich wie ein sleep). dann kannst du prüfen, ob bei einer deiner dateien daten vorliegen (diese funktionen ändern das set, das du ihnen übergibst). wenn nicht -> timeout -> relaiskarte spinnt
ich weiß allerdings weder, ob fb dafür eigene funktionen hat, noch, ob du diese funktionen in fb verwenden kannst
aber das wäre vielleicht ein guter ansatz zum suchen _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2514 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 10.04.2011, 16:04 Titel: |
|
|
Bereits in QB vorhanden: LOC(), um nachzuschauen, ob empfangene Zeichen vorhanden sind oder nicht. Gibt es in FB ebenfalls:
http://www.freebasic.net/wiki/wikka.php?wakka=KeyPgLoc
=> gibt dort sogar an, wieviele Zeichen bereit liegen -> daher einfach nie mehr GET-Zeichenabrufe machen, als von LOC() zurückgemeldet, dann sollte Dein Programm auch nicht mehr blockieren. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 11.04.2011, 14:50 Titel: |
|
|
das ist dann aber eklig, weil du dann pollen musst
beim polling hast du halt die wahl zwischen zwei übeln:
entweder du pollst oft, was eine größere cpu-last zur folge hat und vor allem verhindert, dass die cpu sich schlafen legen kann -> höherer stromverbrauch
oder aber du pollst selten (mehrere sekunden bis minuten abstand), dann hast du halt ein irrsinniges lag (sprich, zwischen "daten kommen an" und "daten werden angezeigt" liegt viel zeit). _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
|
Pellkartoffelsalat
Anmeldungsdatum: 11.04.2005 Beiträge: 10 Wohnort: Moormerland
|
Verfasst am: 11.04.2011, 20:57 Titel: |
|
|
ich weiss ja aber wann daten kommen, also sobald ich sende + 8ms Sek später kommen 4 byte zurück danach ist ruhe
also brauch ich ja nur ne gewisse zeit drauf achten und danach brauch ich nix mehr machen bis ich wieder sende.
oder versteh ich dich jetzt falsch?
Flo hat Folgendes geschrieben: | das ist dann aber eklig, weil du dann pollen musst
beim polling hast du halt die wahl zwischen zwei übeln:
entweder du pollst oft, was eine größere cpu-last zur folge hat und vor allem verhindert, dass die cpu sich schlafen legen kann -> höherer stromverbrauch
oder aber du pollst selten (mehrere sekunden bis minuten abstand), dann hast du halt ein irrsinniges lag (sprich, zwischen "daten kommen an" und "daten werden angezeigt" liegt viel zeit). |
_________________ Ich bin ein Bombenexperte, wenn du mich rennen siehst, renn mir hinterher |
|
Nach oben |
|
|
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 12.04.2011, 14:29 Titel: |
|
|
entweder das, oder ich verstehe dein problem nicht so ganz
ich hab dein problem so verstanden:
du sendest, wartest ein wenig und dann GETest du die antwort. du möchtest aber, dass dein programm darauf reagieren kann, wenn nach einer gewissen zeit immernoch keine antwort gekommen ist, und z.B. ne fehlermeldung ausgeben
in dem fall brauchst du entweder LOC (was mit polling zu tun hat ->pöhze) oder select(), poll() oder epoll() (nicht vom namen irritieren lassen: poll() und epoll() pollen NICHT, sondern helfen dir, ebenso wie select(), das pollen zu vermeiden) _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
|
Pellkartoffelsalat
Anmeldungsdatum: 11.04.2005 Beiträge: 10 Wohnort: Moormerland
|
Verfasst am: 12.04.2011, 17:55 Titel: |
|
|
Du hast mich richtig verstanden.
Nur ich weiss nicht wie ich poll anwenden soll
Alle Versuche haben jetzt damit geendet das FreeBasic nicht wusste was poll ist.
Magst mir nen Code Beispiel geben? _________________ Ich bin ein Bombenexperte, wenn du mich rennen siehst, renn mir hinterher |
|
Nach oben |
|
|
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 12.04.2011, 19:10 Titel: |
|
|
nuja, das ist ja eben das problem: poll(), epoll() und select() sind befehle einer C-library. das heißt, du brauchst gewrappte header (das geht, aber frag mich nicht wie; die anderen könnten das wissen). und, was mir grade noch aufgefallen ist, das könnte schwierigkeiten mit windows geben, weil windows (wie so oft) nicht kompatibel, in dem fall zu POSIX ist.
in deinem fall könnte die LOC() methode angemessener sein, da du nicht dauernd, sondern nur einige sec nach abschicken eines kommandos pollen musst. es ist zwar immernoch unsauber, aber der aufwand für select() dürfte vmtl zu groß sein _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
|
Pellkartoffelsalat
Anmeldungsdatum: 11.04.2005 Beiträge: 10 Wohnort: Moormerland
|
Verfasst am: 12.04.2011, 19:12 Titel: |
|
|
Die Antowrt sollte immer im Zeitraum von 80ms anliegen. wenn sie das nicht ist, dann ist nen Fehler im System _________________ Ich bin ein Bombenexperte, wenn du mich rennen siehst, renn mir hinterher |
|
Nach oben |
|
|
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 12.04.2011, 19:13 Titel: |
|
|
in dem fall:
senden, 100msec warten, loc() prüfen.
wenn was da ist: alles ok
wenn nicht: 1 sec oder so warten
wenn immer noch nix da ist: fehler
wiegesagt: schön ist anders, das ist die einzige vertretbare möglichkeit _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2514 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 12.04.2011, 19:34 Titel: |
|
|
Flo hat Folgendes geschrieben: | in dem fall:
senden, 100msec warten, loc() prüfen. |
Entspricht im Prinzip dann dem Vorgehen wie unter
http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/EreignisSchleife.html
beschrieben, ausser dass Du noch ein SLEEP für diese z.B. Zehntelssekunde hineinnimmst, womit das sog. aktive Warten weitgehend eliminiert wird. Eignet sich logischerweise von der Echtzeitfähigkeit nur für Vorgänge, wo ein kürzerer Delay nichts ausmacht und ferner dank Fehlersicherung sichergestellt ist, dass wenn während einer solchen Poll-Wartepause die Gegenstation gerade ein grösserer zusammenhängender Datenblock sendet, kein Puffer überläuft.
Einfach zur Überlegung: Ein 16x50-UART hat meines Wissens nur 16 Bytes Kommunikationspuffer, bei 115'200 bps kann deshalb eine Zehntelssekunde bereits eine kleine Ewigkeit darstellen! Allerdings kann als Gegenmassnahme ein Hardware-Handshake verwendet werden, bei welchem ein Kommunikationspartner gezielt mit "Warte bitte mit Senden!" angehalten werden kann.
Alternativer Weg sonst (testen!): Für die Bedienung der RS-232-Schnittstelle ein separater Thread starten, der dann bedenkenlos in einem GET-Aufruf "hängen" darf. Setzt dann einfach passende Synchronisation mit Mutexe/Semaphoren zum Haupttread voraus, damit der Haupttread die Daten vom RS-232-Thread "abholen" kann. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 12.04.2011, 20:29 Titel: |
|
|
achdukacke... nee, lass mal die finger von threads.
in dem fall willst du vermutlich doch eher dich mit select() oder epoll() anfreunden
außerdem: wenn das gerät wirklich nur dann antwortet, wenn du es verlangst, ist das kein problem _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
|
Pellkartoffelsalat
Anmeldungsdatum: 11.04.2005 Beiträge: 10 Wohnort: Moormerland
|
Verfasst am: 12.04.2011, 22:07 Titel: |
|
|
Jip, es antwortet nur auf anfrage und der sleep befehl ist jetzt erst mal nur im test programm eingebaut worden.
ich bin schon für alle gegebenen antworten dankbar und kann mir helfen.
mein programm kann mir jetzt nen fehler melden und hängt nicht mehr weil´s wartet.
besten dank an alle _________________ Ich bin ein Bombenexperte, wenn du mich rennen siehst, renn mir hinterher |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|