cts und dsr signal auslesen (rs232) in winxp
-
Hallo Leute, ich habe eine Lichtschranke, dessen Signal ich über MAX232 auf die Handshakeleitung CTS weiterleite. Die Impulse sind über das Terminal zusehen. Jetzt will ich diese selber weiterverarbeiten, indem ich diese Zählen will im Rechner. Folgendes Programm habe ich geschrieben, das irgendwie nicht funktioniert. Wisst ihr was ich falsch mache?
#include <windows.h> #include <iostream> using namespace std; int main() { HANDLE hCom; int count=0; hCom = CreateFile (TEXT("COM1"), GENERIC_READ | GENERIC_WRITE, 0, // must be opened with exclusive-access NULL, // no security attributes OPEN_EXISTING, // must use OPEN_EXISTING 0, // non overlapped I/O NULL // hTemplate must be NULL for comm devices ); if (hCom == INVALID_HANDLE_VALUE) { int error = GetLastError (); cout<<"Serial port could not be opened."<<endl; if (error == 2) { cout<<"The specified port does not exist."<<endl; } else if (error == 5) { cout<<"The specified port is already in use."<<endl; } else { cout<<"Windows error occurred."<<endl; } hCom = 0; return 1; } DWORD dptr = 0; if(GetCommModemStatus (hCom, &dptr)) if (dptr & MS_CTS_ON) count++; CloseHandle(hCom); return 0;
-
Hi,
ich versuche da einige Tipps zu geben.Grundsätzliches: Eine Kommunikation über serielle Schnittstelle fehlerfrei zu programmieren ist nicht sooo problemlos wie man an Anfang meint, insbesondere auch wenn es um unerwartete Situationen (z.B. Leitung abgezogen) oder um Timeouts geht.
Deshalb gibt es bereits fertige und funktionierende Klassen wie z.B. CSerial auf codeproject oder codeguru (wird auch hier im Forum öfters empfohlen).Nun zu Deinem speziellen Problem:
Du möchtest eigentlich nur den Zustand von der Leitung CTS abfragen, also keine übliche serielle Daten über RxD und TxD.
In diesem Fall kann man es selbst "zu Fuß" programmieren, da überschaubar.
Auf jeden Fall empfehle ich Dir, nach dem (erfolgreichen) Öffnen des COM-Ports unbedingt die Struktur DCB mit allen Daten aufzufüllen und mit SetCommState() zu initialisieren. Selbst dann, wenn Dich nur diese eine Leitung CTS interessiert!Nun, ich setze mal voraus, daß die Variable hCom immer gültig ist (da nur als lokale Variable innerhalb von main() definiert). Das ist aus Deinem Listing nicht ganz klar erkennbar, da das Ende von main(), d.h. die zugehörige geschlossene Klammer nicht sichtbar ist.
Die eigentliche Abfrage der Portleitung CTS mit GetCommModemStatus() ist korrekt.
Wie prüfst Du eigentlich ob Dein Programm läuft oder nicht?
HTH,
MartinP.S.: Bitte verwende gleich den eindeutigeren Namen TEXT("\\\.\\COM1") für CreateFile(), siehe auch MSDN: KB115831 "Specify serial ports larger than COM9" http://support.microsoft.com/kb/115831