kommunikation zwischen Geröt und PC durch rs 232

nabil

Grünschnabel
hallo alle,
ich will daten aus Gerät lesen und dass kann ich mit ReadFile machen aber mein Problem: manchmal schickt mein Geraet nichts und mein Programm bleibt haengen bei ReadFile.Jetzt will ich mein readfile so schreiben dass sie maximum 2 sekunden warten und egal ob ich sie daten bekommen hat oder nichts.Meine frage wie kann ich diese zeitschleife fuer 2 sekunden erzeugen?<Ich habe mir so gedacht:do{
Readfile(............);//programm bleibt hier haengen
}while(2s);
Im voraus Danke Schoen!
 
Hallo,

mit der Schleife wird das nicht klappen, denn wenn dein Programm hängt, dann wird die Schleife nicht durchlaufen.
Laut MSDN wartet ReadFile auf das TimeOut, dessen Zeit in GetCommTimeouts() geholt werden kann bzw. mit SetCommTimeouts() gesetzt werden kann.

Mfg

langer
 
hi wieder!
aber Timeout hab ich auch eingegeben und ich hab es so definiert:

GetCommTimeouts(hFILE,&sTo);

sTo.ReadIntervalTimeout=2000;
sTo.ReadTotalTimeoutConstant=0;
sTo.ReadTotalTimeoutMultiplier=0;
sTo.WriteTotalTimeoutMultiplier=1;
sTo.WriteTotalTimeoutConstant=500;
das heisst wenn es mehr als 2 sekunden verzoegerung passiert ist dann wird ein Fehler gemeldet aus dem Com port.
jetzt will ich eine Bedingung so schreiben in dem werd ich vergleichen mein maxtimeout (2000ms)und mein newtime:
if(maxtimeout<newtime){printf("error");}
aber wie kann ich mein newtime in c berechnen?
ich bin noch anfaenger in C und solche sachen fuer mich sind noch kompliziert
 
Hallo,

wenn dein Beispiel richtig ist, hast du dir den Timeout geholt, die Struktur gefüllt, aber den Timeout nicht gesetzt (SetCommTimeouts()).

Hmm, mit der Bedingung ist das nicht so einfach, wenn ich dein Problem richtig verstanden habe. Wenn die 2 Sekunden um sind, hängt dein Programm noch in der ReadFile-Funktion, richtig? Dann kannst du aber keine andere Funktion nutzen, um etwas zu berechnen. Abhilfe wäre, vor ReadFile einen Timer mit dem Intervall von 2 Sekunden zu starten. Kehrt ReadFile vor Ablauf der Zeit zurück, KillTimer() aufrufen, um ein Auslösen zu verhindern. Bei Auslösen des Timers wird die OnTimer-Funktion angesprungen und du kannst hier die Fehlerbehandlung starten.

Allerdings, wenn du wirklich die Fehlermeldung erhältst, ReadFile() also zurückgekehrt ist, dann kannst mit

Code:
	CTime m_createTime;
	m_createTime = CTime::GetCurrentTime();
bei Starten von ReadFile() die Anfangszeit speichern. Mit
Code:
	CTime destroyTime = CTime::GetCurrentTime();
	CTimeSpan timeSpan = destroyTime - m_createTime;
	int sec = (int)timeSpan.GetTotalSeconds();
	if (sec>2)
                   {
                      printf(..........);
                   }

die Zeit bestimmen.


Mfg

langer
 
Zuletzt bearbeitet:
Zurück