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 bearbeitet

    vielleicht 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 receive
    

    hm??? 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


Anmelden zum Antworten