Forum: PC-Programmierung Serial Port unter Windows


von atmel (Gast)


Lesenswert?

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.

von Hubert (Gast)


Lesenswert?

Schau bei codeguru.com oder codeproject.com da gibts das fertig...
und als Tip: Das Polling mußt du in einem Thread machen...

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

Mit ClearCommError kommst du an das COMSTAT struct, dort im Feld cbInQue
findest du die Anzahl der Bytes im Eingangspuffer

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

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

von Thomas S. (tstuetz)


Lesenswert?

mit SetCommMask() auf RXEVENT, danach kann dann mit WaitForSingleObject
auf ein Zeichen gewartet werden (oder nach einer gewissen Zeit
abgebrochen werden [SetCommTimeout])

Gruss

von Sascha (Gast)


Lesenswert?


von Tobi H. (tobi-) Benutzerseite


Lesenswert?

@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

von Blackbird (Gast)


Angehängte Dateien:

Lesenswert?

@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

von Blackbird (Gast)


Lesenswert?

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

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.