COM Port DTR Status abfragen
-
Hallo,
ich möchte gerne den Status der DTR Line eines COM Ports abfragen.
Ich habe bereits das Handle des COM Ports (hPort).Mein erster Ansatz war:
bool IsDTREnabled() { // Get communication configuration COMMCONFIG commConfig = {0}; DWORD dwSize = sizeof(commConfig); commConfig.dwSize = dwSize; if (GetCommConfig(hPort, &commConfig, &dwSize) != 0) return (commConfig.dcb.fDtrControl == DTR_CONTROL_ENABLE); else return false; }Jedoch liefert dieser Code nur, was in den Einstellungen zu Beginn per SetCommConfig() gesetzt wurde, also nicht den aktuellen Zustand.
Ich kann ohne Probleme DTR Setzen per EscapeCommFunction(), also hPort dürfte auch gültig sein.Es muss gehen, den Status abzufragen, da das unter VB6 mit der MS COMM Active-X DLL ebenfalls ging. Aber wie?
MfG
-
So, der zweite Versuch funkioniert leider auch nicht:
bool IsDTREnabled() { DCB dcb = {0}; dcb.DCBlength = sizeof(dcb); if (GetCommState(hPort, &dcb) != 0) return (dcb.fDtrControl == DTR_CONTROL_ENABLE); // liefert false, obwohl DTR aktiv ist else return false; }
-
Könnte es vielleicht per DeviceIoControl funktionieren?
-
http://www.codeproject.com/KB/system/serial.aspx
Benutze diese Klasse (im Link)... dort gibts eine Funktion dafür.
Simon
-
Diese Klasse habe ich mir bereits angesehen.
Aber sie enthält keine Funktion zur Abfrage des DTR Status. (Falls ich mich täusche bitte korrigieren!)Es muss mit der WinAPI Möglich sein, da das ActiveX Control von VB6 auch nichts anderes benutzt..
-
Merk dir doch einfach was du zuletzt gesetzt hast

-
//ntddser.h #define IOCTL_SERIAL_GET_DTRRTS 0x1B0078 #define IOCTL_SERIAL_GET_MODEMSTATUS 0x1B0068 // m_ModemStatus #define SERIAL_DTR_STATE (0x00000001) #define SERIAL_RTS_STATE (0x00000002) #define SERIAL_CTS_STATE (0x00000010) #define SERIAL_DSR_STATE (0x00000020) #define SERIAL_RI_STATE (0x00000040) #define SERIAL_DCD_STATE (0x00000080) DWORD dtrrts; DeviceIoControl(m_hComPort, IOCTL_SERIAL_GET_DTRRTS, NULL,0, &dtrrts,4, &bytesReturned, 0); DeviceIoControl(m_hComPort, IOCTL_SERIAL_GET_MODEMSTATUS, NULL,0, &m_ModemStatus,4, &bytesReturned, 0); m_ModemStatus = (m_ModemStatus & 0xFFFFFFF0) | (dtrrts & 0x0F);
-
@geeky:
Das habe ich bisher gemacht, aber das ist eine suboptimale Lösung, da nicht wirklich der "Hardwarezustand" ausgegeben wird.@sapero:
Perfekt! Das funktioniert einwandfrei! Ich dachte, man kann IOCTL_SERIAL_GET_DTRRTS nur einsetzen, wenn man einen Treiber schreibt, da diese Konstante nur im Windows Driver Kit enthalten ist, aber es funktioniert
Sehe ich das richtig, dass sämtliche Comm Funktionen wie EscapeCommFunction, GetCommModemStatus etc. alle nur Wrapper für Aufrufe von DeviceIoControl sind?
Kann es sich lohnen statt der o.g. Funktionen direkt DeviceIoControl zu verwenden? (Meine Anwendung ist extrem zeitkritisch)MfG