Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Timeout bei GET vom COM Port

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Pellkartoffelsalat



Anmeldungsdatum: 11.04.2005
Beiträge: 10
Wohnort: Moormerland

BeitragVerfasst am: 08.04.2011, 11:32    Titel: Timeout bei GET vom COM Port Antworten mit Zitat

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 lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 10.04.2011, 12:02    Titel: Antworten mit Zitat

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 zwinkern
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2514
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 10.04.2011, 15:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 11.04.2011, 13:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Pellkartoffelsalat



Anmeldungsdatum: 11.04.2005
Beiträge: 10
Wohnort: Moormerland

BeitragVerfasst am: 11.04.2011, 19:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 12.04.2011, 13:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Pellkartoffelsalat



Anmeldungsdatum: 11.04.2005
Beiträge: 10
Wohnort: Moormerland

BeitragVerfasst am: 12.04.2011, 16:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 12.04.2011, 18:10    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Pellkartoffelsalat



Anmeldungsdatum: 11.04.2005
Beiträge: 10
Wohnort: Moormerland

BeitragVerfasst am: 12.04.2011, 18:12    Titel: Antworten mit Zitat

Die Antowrt sollte immer im Zeitraum von 80ms anliegen. wenn sie das nicht ist, dann ist nen Fehler im System lächeln
_________________
Ich bin ein Bombenexperte, wenn du mich rennen siehst, renn mir hinterher
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 12.04.2011, 18:13    Titel: Antworten mit Zitat

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 happy
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2514
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 12.04.2011, 18:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 12.04.2011, 19:29    Titel: Antworten mit Zitat

achdukacke... nee, lass mal die finger von threads.

in dem fall willst du vermutlich doch eher dich mit select() oder epoll() anfreunden zwinkern


außerdem: wenn das gerät wirklich nur dann antwortet, wenn du es verlangst, ist das kein problem zwinkern
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Pellkartoffelsalat



Anmeldungsdatum: 11.04.2005
Beiträge: 10
Wohnort: Moormerland

BeitragVerfasst am: 12.04.2011, 21:07    Titel: Antworten mit Zitat

lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz