WaitCommEvent Problem: GetLastError() sagt: Überlappender E/A Vorgang wird bearbeitet
-
hi leute!
ich versuche grad WaitCommEvent zum laufen zu bringen....in der MSDN steht folgendes:
- If the function succeeds, the return value is nonzero.
- If the function fails, the return value is zero. To get extended error information, call GetLastError.irgendwie bekomme ich bei WaitCommEvent immer 0 als Returnwert!!?? ich versteh das nicht...
hab GetLastError ausgeben lassen:
Überlappender E/A Vorgang wird bearbeitetvielleicht weiß jemand um rat!? code siehe unten...
mfg nike.
#include <windows.h> #include <stdio.h> void main(void) { HANDLE h_COM; // Handle to COM DCB dcb; // Device Control Block DWORD dw_Ret; // Return Value OVERLAPPED o = {0,0,0,0,NULL}; // Overlapped Structure HANDLE h_Event; // Handle to Event char c_Buffer[100] = {"Hallo"}; // Send/Receive Buffer // Open COM1 in Overlapped I/O Mode h_COM = CreateFile("COM1", // Name GENERIC_READ|GENERIC_WRITE, // Access mode 0, // Share Mode = not shared NULL, // Security OPEN_EXISTING, // Open existing FILE_FLAG_OVERLAPPED, // File settings NULL); // Get the current COM1 settings GetCommState(h_COM, &dcb); // Change the current COM1 settings dcb.BaudRate = CBR_115200; // 115200 bits per second dcb.ByteSize = 8; // 8 bit per byte dcb.Parity = 1; // odd parity dcb.StopBits = 0; // 1 stop bit // Set the new COM1 settings SetCommState(h_COM, &dcb); // Set COM1 Event Mask SetCommMask(h_COM, // Handle to COM EV_RXCHAR); // Set Event if character receive // Create a new event h_Event = CreateEvent(NULL, // Security Attributes FALSE, // Auto Reset FALSE, // Initial State NULL); // Name // Assign event to overlapped structure o.hEvent = h_Event; // Wait for event to happen if(!WaitCommEvent(h_COM, &dw_Ret,&o)) { LPTSTR pMessageBuffer; ::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, ::GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), reinterpret_cast<LPTSTR>(&pMessageBuffer), 0, NULL); std::string errorMessage(pMessageBuffer); cout << errorMessage.c_str() << endl; } // Perform overloapped read operation // ReadFile immediatly returns ReadFile(h_COM, // Handle to COM &c_Buffer, // Buffer to receive 1, // # Bytes to receive &dw_Ret, // Bytes transferred &o); // Overlapped structure // Wait for read operation to be finished GetOverlappedResult(h_COM, // Handle to COM &o, // Overlapped structure &dw_Ret, // Bytes transferred TRUE); // WAIT flag // Close COM1 CloseHandle(h_COM); // Close COM Resource // Close event CloseHandle(h_Event); }
-
Auf welchen Event soll die Funktion denn warten?
Das fehlt noch:
DWORD dwEvtMaskIn = EV_CTS | EV_DSR | EV_BREAK | EV_RING | EV_RXCHAR | EV_RLSD | EV_ERR | EV_RXFLAG | EV_TXEMPTY | SERIAL_EV_PERR | SERIAL_EV_RX80FULL | SERIAL_EV_EVENT1 | SERIAL_EV_EVENT2; SetCommMask (h_COM, dwEvtMaskIn);Nach dem WaitCommEvent() dann:
if (WAIT_OBJECT_0 == WaitForSingleObject (o.hEvent, INFINITE)) { if (dw_Ret & EV_DSR) // mach was ... ...Blackbird
-
hi!
hab ich doch e definiert!!!// Set COM1 Event Mask SetCommMask(h_COM, // Handle to COM EV_RXCHAR); // Set Event if character receivehm??? ich mach doch eigentlich alles richtig!?
cu
-
im winapi.net forum hast du doch schon die antwort bekommen.
-
hm??? ich mach doch eigentlich alles richtig!?
Offenbar nicht, denn sonst würde es ja funktionieren

OK., das SetCommMask() fehlt nicht, aber worauf wartest Du denn mit WaitCommEvent()? Der Returnwert, sagt ja nur, daß eine Aktion ausgeführt wird, nicht dass Fehler vorliegen. Der Buffer dw_Ret (hast vergessen, ihn vor dem Aufruf zu "nullen") enthält den Event, WENN er denn mal eintritt. Solange mußt Du warten (lassen) mit WaitForSingleObject().
Wo ist das Problem?
Blackbird