Probleme mit der seriellen Schnittstelle oder Events



  • Hi,

    Ich hab da mal echt nen Problem mit dem Auslesen einer seriellen Schnittstelle. Hier mal der Code:

    OVERLAPPED overlapped;
    	overlapped.Internal = 0;
    	overlapped.InternalHigh = 0;
    	overlapped.Offset = 0;
    	overlapped.OffsetHigh = 0;
    	overlapped.Pointer = 0;
    	memset(&overlapped,0,sizeof(overlapped));
    	overlapped.hEvent = CreateEvent(
    	NULL,   // no security attributes 
    	TRUE,  // auto reset event 
    	FALSE,  // not signaled 
    	NULL    // no name 
    	);
    	for(;;)
    	{
    		DWORD con = WaitCommEvent( m_CommData->hBarcodeScannerPort[ port], //Handle to the CommunicationDevice
    			&dwEvtMask,&overlapped); // wait for data - but this
                                                  // will return immediately because
                                                     // it is overlapped
    		con = GetLastError();	//IO-Pending
    
    		ClearCommError(m_CommData->hBarcodeScannerPort[ port], &dwError, &comState); 
    		con = WaitForSingleObject(overlapped.hEvent, INFINITE);
    		switch( con)
    		{
    		case WAIT_OBJECT_0:
    			//...
    			ResetEvent( overlapped.hEvent);
    			break;
    		}
    }
    

    So, das ganze funzt beim ersten mal einwandfrei. Die WaitForSingleObject-Methode wartet solange, bis Daten auf der Schnittstelle ankommen.
    Wird die for-Schleife allerdings beim 2.Mal durchlaufen, wartet die WaitForSingleObject-Methode nicht mehr auf Daten, sondern läuft einfach weiter.

    Woran kann das liegen? Das Event hab ich doch wieder zurückgesetzt?
    Hab ich da nen ganz dummen Fehler drin?

    Gruss
    Frosch



  • Liest du den buffer auch irgnedwo aus?



  • Frosch schrieb:

    TRUE, // auto reset event

    Das Flag heißt bManualReset.



  • CMatt schrieb:

    Liest du den buffer auch irgnedwo aus?

    Ja, das ist da wo die Punkte stehen 😉

    if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
      		{	
    
       	         do
    			{
    				// immer nur ein Byte lesen
    				DWORD dwLength = 1;
    				ReadFile( m_CommData->hBarcodeScannerPort[port], empfbl,
    		                    dwLength, &dwLength, &overlapped) ;
    				int iLen = 	dwLength;
     				for(int i=0; i<iLen; i++)
    				{
    					barcode[j] = empfbl[i];
    					j++;
    				}
    			}
    			while ( j < 10) ;
    


  • MFK schrieb:

    Frosch schrieb:

    TRUE, // auto reset event

    Das Flag heißt bManualReset.

    Ja, muss aber trotzdem TRUE sein 😉



  • Moin,

    so, habs mehr oder weniger rausgefunden. Poste es mal für den den es interessiert. Und vielleicht kann mir ja auch jmd dieses Phänomen erklären? 😉

    Also, die WaitForSingleObject-Methode wartet irgendwie nur jedes 2. Mal. Warum auch immer? 😕
    Naja, von daher muss man halt noch ein bool dazwischen setzen, dann läufts. 😃

    Nice Day noch,
    Frosch


Anmelden zum Antworten