B
Pin 9 ist RI (Ring Indicator).
Dein Prog sollte einen Thread haben, der nur den COM-Port bedient.
Grobe Stuktur des Threads:
- // Vergleichs-Maske setzen für SetCommMask, die bestimmt, welche Ereignisse auftreten können
DWORD dwEvtMask = EV_CTS | EV_DSR | EV_BREAK | EV_RING | EV_RXCHAR | EV_RLSD | EV_ERR | EV_RXFLAG | EV_TXEMPTY;
- DWORD dwEvtMaskIn = 0; // Eingabe-Maske, in die WaitCommEvent aktuelle Werte schreibt
- // Com Port öffnen (hCom)
- SetCommMask (hCom, dwEvtMask); // setzen der Maske
- // Create an event object for use in WaitCommEvent in OVERLAPPED struct o
- jetzt in einer Schleife (solange der Thread leben soll):
{
- WaitCommEvent (hCom, &dwEvtMaskIn, &o); // EventMask "scharf machen"
- if (WAIT_OBJECT_0 == WaitForSingleObject (o.hEvent, INFINITE)) // warten bis Event
- Zeit holen (mit QueryPerformanceCounter)
- jetzt das Ereignis bestimmen, welches den Event ausgelöst hatte:
if (dwEvtMaskIn & EV_RXCHAR)
{
//irgendwas tun
}
if (dwEvtMaskIn & EV_CTS)
{
//irgendwas tun
}
...
}
- aufräumen
Besser wäre es, in der Schleife nur die Ziet zu holen und mit PostThreadMessage das Ereignis einem anderen Thread/Process zusenden. Der prüft dann, welches Ereignis es war (if (dwEvtMaskIn & EV_xxx)) und bearbeitet/verteilt es weiter.
Das Senden von Pegelwechseln an DTR und RTS kann von einem anderen Thread/process aus erfolgen, jedoch mit den gleichen "Daten" des bereits geöffneten COM-Ports.
Willst Du Dir wirklich die Arbeit machen? Zielt die Formulierung in Deiner Praktikums-Aufgabe nicht auf eine einfachere Lösung?
Lernen tut man 'ne Menge, wenn man den (scheinbar) schwereren Weg geht.
Hier mal ein Auszug aus einer Log-Datei, die so eine Abfrage der COM-Pins macht:
Start: Mo, den 16.12.2002 um 10:59 Uhr 24,243 Sek.
CTS : 5 µs
CTS : 1075378 µs
CTS : 1792208 µs
CTS : 2509189 µs
CTS : 3226400 µs
CTS : 3584650 µs
DSR : 4301660 µs
DSR : 5036223 µs
DSR : 5747337 µs
DSR : 6105858 µs
BREAK : 7907542 µs
ERR : 7907542 µs
RXCHAR : 7950211 µs
RXFLAG : 7950211 µs
BREAK : 9699923 µs
ERR : 9699923 µs
RXCHAR : 9742593 µs
RXFLAG : 9742593 µs
DSR : 14350686 µs
CTS : 16143116 µs
DSR : 17218389 µs
DSR : 19369181 µs
BREAK : 20812452 µs
ERR : 20812452 µs
RXCHAR : 20855122 µs
RXFLAG : 20855122 µs
BREAK : 26189531 µs
ERR : 26189531 µs
RXCHAR : 26232201 µs
RXFLAG : 26232201 µs
DSR : 60234785 µs
DSR : 60951672 µs
DSR : 61668771 µs
BREAK : 63111945 µs
ERR : 63111945 µs
RXCHAR : 63154622 µs
RXFLAG : 63154622 µs
BREAK : 64904262 µs
Blackbird