www.mikrocontroller.net

Forum: PC-Programmierung Serial Port unter Windows


Autor: atmel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hubert (Gast)
Datum:

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

Autor: Tobi H. (tobi-) Benutzerseite
Datum:

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

Autor: Tobi H. (tobi-) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Stütz (tstuetz)
Datum:

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

Gruss

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Tobi H. (tobi-) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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=...

Autor: Blackbird (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Blackbird (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tobi H. (tobi-) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, mit Thread gehts natürlich, nur hatte halt davon keiner bisher was
gesagt ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.