Hallo. habe eine Frage zum Serial Port unter Windows. Öffne den Port mit m_hCom = CreateFile(m_sComPort, GENERIC_READ | GENERIC_WRITE, 0, // exclusive access NULL, // no security OPEN_EXISTING, 0, // no overlapped I/O NULL); // null template Wenn ich nun daten aus dem Port lesen möchte mache ich es mit bReadRC = ReadFile(m_hCom, &sBuffer, 40, &iBytesRead, NULL); Leider muß ich aber wissen ob Daten da sind oder nicht. D.H ich polle diese Function, was den rechner landsam macht. Gibt es mit dem FileHandle ein Möglichkeit eine Callbackfunktion zu erstellen die aufgerufen wird sobald ein Byte empfangen worden ist? Danke für eure Hilfe BYE.
Schau bei codeguru.com oder codeproject.com da gibts das fertig... und als Tip: Das Polling mußt du in einem Thread machen...
Mit ClearCommError kommst du an das COMSTAT struct, dort im Feld cbInQue findest du die Anzahl der Bytes im Eingangspuffer
Nachtrag: Eine andere Methode wäre, dass du den overlapped Modus aktivierst, dann blockieren die Funktionen nicht mehr, sondern geben sofort zurück. ReadFileEx bietet meines Wissens nach eine Callback Routine, allerdings habe ich damit noch nichts gemacht, so dass ich dir nicht sagen kann, ob sie dir hilft
mit SetCommMask() auf RXEVENT, danach kann dann mit WaitForSingleObject auf ein Zeichen gewartet werden (oder nach einer gewissen Zeit abgebrochen werden [SetCommTimeout]) Gruss
SetCommMask: http://msdn.microsoft.com/library/en-us/devio/base/setcommmask.asp WaitCommEvent: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/waitcommevent.asp
@thomas Dadurch würde sich ja nicht wirklich etwas ändern, da wieder das ganze Programm blockiert wird, bis der Timeout auftritt. Würde nur was zusammen mit non-blockng Funktionen bringen. Hier ist ein guter Link zum Thema: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp
@Tobi, die Methode mit SetCommMask (...) ist schon richtig. Nur soll die sich in einem extra Thread befinden. Im Anhang ein Beispiel, dessen main(...) ganz leicht in eine WinMain(...) und eine Callback-Fensterroutine geändert werden kann. Blackbird
Was ich noch vergaß zu erwähnen: das EV_RXFLAG wird hier (noch) nicht im Monitorthread in der while-Schleife abgefragt. Wird aber genauso ausgewertet wie EV_DSR, EV_CTS, ... Also EV_RXFLAG rein und alle anderen raus - fertig. Blackbird
Ok, mit Thread gehts natürlich, nur hatte halt davon keiner bisher was gesagt ;)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.