ReadFile liefert Error 1421



  • Hi Leute!

    ich habe einen COM-Port geöffnet, und sende erfolgreich Daten an einen 2.Rechner.
    Aber rückwärts scheints nicht so einfach funktionieren.

    Ich habe eine Time-Prozedur TimerProc, in der ich mit ReadFile("COM1",...)
    versuche regelmässig eingehende Zeichen abzufragen.

    Mit GetLastError bekomme ich aber immer nur die Fehler-Meldungen 1421.
    Wieso???

    Meine Referencen sagen mir nur folgendes über diesen Error:

    1421 Control ID not found. ERROR_CONTROL_ID_NOT_FOUND

    mehr findet man nicht einmal im Google über dieses Dilemma.
    Vielleicht kan jemand von euch mir weiterhelfen.

    Hier mein Codeausschnitt:

    int rs232_receivechar(void)
    {
    	unsigned char buffer;
    
    	ReadFile(rs232_handle,&buffer,1,&rs232_totalreadbytes, &rs232_ol);
    	return GetLastError();	
    	/*
    	if (rs232_totalreadbytes==1)
    	{
    		return (buffer & 0xFF);
    	}
    	else 
    	{	
    		return -1;
    	}*/
    
    }
    

    Ist natürlich temporär.
    int i = rs232_receivechar(); liefert mir dann 0 und hi und da 1421.

    Wenn das return GetLastError() auskommentiert wird und stattdessen das auskommetierte if-Statement aktiviert wird, ist das Ergebnis immer -1.

    Dass heisst, dass er vielleicht sogar den COM-Port geöffnet hat, aber nichts empfängt??

    danke im vorraus

    Merlin



  • Raschin schrieb:

    Mit GetLastError bekomme ich aber immer nur die Fehler-Meldungen 1421.

    Du rufst GetLastError immer auf. Der Wert ist aber erst dann von Bedeutung, wenn ReadFile mit FALSE zurückkomt. Wenn ReadFile mit TRUE zurückkomt, ist alles glatt gegangen. Der Wert von GetLastError kann dann alles enthalten, nur eben nichts sinnvolles.



  • Du rufst GetLastError immer auf. Der Wert ist aber erst dann von Bedeutung, wenn ReadFile mit FALSE zurückkomt. Wenn ReadFile mit TRUE zurückkomt, ist alles glatt gegangen. Der Wert von GetLastError kann dann alles enthalten, nur eben nichts sinnvolles.

    Das ist mir schon klar. Aber GetLastError gibt eh 0 zurück, wenn alles passt, oder etwa nicht??

    Und ausserdem hab ichs genauso schon so probiert:

    if(!ReadFile(rs232_handle,&buffer,1,&rs232_totalreadbytes, &rs232_ol))
    return GetLastError();
    else return 0;

    Wieder dasselbe.

    Und ausserdem hab ich ja gesagt, dass das nur TEMPORÄR ist !!!
    Also eigentlich gehört dass auskommentierte wieder entkommentiert und stattdessen dieses eine return ausgekommentiert.

    Wie gesagt, immer Error 1421.



  • Raschin schrieb:

    Das ist mir schon klar. Aber GetLastError gibt eh 0 zurück, wenn alles passt, oder etwa nicht??

    Ich habe doch gerade gesagt, daß GetLastError nicht notwendigerweise 0 zurückgibt, wenn alles passt. Die Funktion gibt einen Fehlercode zurück. Wenn alles passt, ist dieser Wert nicht definiert. Aber was rede ich, Dir ist das ja klar ...

    Und ausserdem hab ichs genauso schon so probiert:

    if(!ReadFile(rs232_handle,&buffer,1,&rs232_totalreadbytes, &rs232_ol))
    return GetLastError();
    else return 0;

    So sieht das schon richtiger aus, darüber können wir schon eher verhandeln. Allerdings zeigst Du nicht, wie Du rs232_ol initialisiert hast.

    Aber woher soll ich denn bitte wissen, daß Du das schon so probiert hast? Hattest Du das auch irgendwo geschrieben, daß Du es temporär mal richtig gemacht hast?



  • Tschuldigung für meine schlechte Ausdrucksweise, natürlich hast du das nicht wissen können und mit dem GetLastError hab ich mich anscheinend geiirt bzw deine Antwort nicht sogleich richtig verstanden. 🙂

    initialisiert habe ich dass ganze mit

    i=rs232_init(&rs232settings);
    				if (i) 
    				{
    					MessageBox(hWnd,"COM PORT ERROR","COM PORT ERROR",MB_OK|MB_ICONSTOP);
    				}
    				else
    					rs232_open();
    

    rs232_init() schaut so aus:

    int rs232_init(t_rs232settings *settings)
    {
    
    	rs232_settings.baudrate = settings->baudrate;
    	rs232_settings.comport = settings->comport;
    	rs232_settings.databits = settings->databits;
    	rs232_settings.parity = settings->parity;
    	rs232_settings.stopbits = settings->stopbits;
    	rs232_settings.timeout = settings->timeout;
    
    	rs232_handle = CreateFile( rs232_settings.comport, GENERIC_READ | GENERIC_WRITE,
                      0,                    // exclusive access
                      NULL,                 // no security attrs
                      OPEN_EXISTING,
                      FILE_ATTRIBUTE_NORMAL,
    				  NULL );
    
    	if (rs232_handle == INVALID_HANDLE_VALUE)
    	{
    		return 1;
    	}
    	else
    	{
    
    		GetCommTimeouts(rs232_handle, &rs232_cto);
    		GetCommState(rs232_handle, &rs232_dcb);
    
    		memset(&rs232_ol,0,sizeof(rs232_ol));
    
    		switch (rs232_settings.baudrate)
    		{
    			case  9600: rs232_dcb.BaudRate = CBR_9600;
    			break;
    			case 19200: rs232_dcb.BaudRate = CBR_19200;
    			break;
    			case 38400: rs232_dcb.BaudRate = CBR_38400;
    			break;
    			case 57600: rs232_dcb.BaudRate = CBR_57600;
    			break;
    			default:
    				rs232_dcb.BaudRate = CBR_19200;
    		}
    
    		switch (rs232_settings.parity)
    		{
    			case 0: rs232_dcb.Parity = NOPARITY;
    			break;
    			case 1: rs232_dcb.Parity = EVENPARITY;
    			break;
    			case 2: rs232_dcb.Parity= ODDPARITY;
    			break;
    			default:
    				rs232_dcb.Parity = NOPARITY;
    		}
    
    		switch (rs232_settings.stopbits)
    		{
    			case 1: rs232_dcb.StopBits = ONESTOPBIT;
    			break;
    			case 2: rs232_dcb.StopBits = TWOSTOPBITS;
    			break;
    			default:
    				rs232_dcb.StopBits = ONESTOPBIT;
    		}
    
    		rs232_dcb.fDtrControl = DTR_CONTROL_DISABLE;
    		rs232_dcb.fRtsControl = RTS_CONTROL_DISABLE;
    
    		rs232_dcb.fOutxCtsFlow = FALSE;      // CTS output flow control 
    		rs232_dcb.fOutxDsrFlow = FALSE;      // DSR output flow control 
    		rs232_dcb.fDtrControl= FALSE;       // DTR flow control type 
    		rs232_dcb.fDsrSensitivity= FALSE;   // DSR sensitivity 
    		rs232_dcb.fTXContinueOnXoff= FALSE; // XOFF continues Tx 
    		rs232_dcb.fOutX = FALSE;
    		rs232_dcb.fInX = FALSE;
    		rs232_dcb.fBinary = TRUE;
    		rs232_dcb.ByteSize = 8;
    
    		rs232_cto.ReadTotalTimeoutConstant = rs232_settings.timeout; //rs232_settings.timeout;
    		rs232_cto.ReadTotalTimeoutMultiplier = MAXDWORD ; 
    		rs232_cto.ReadIntervalTimeout = MAXDWORD ;
    		rs232_cto.WriteTotalTimeoutConstant = 10000;
    		rs232_cto.WriteTotalTimeoutMultiplier = 1;
    
    		SetCommTimeouts(rs232_handle, &rs232_cto);
    		SetCommState(rs232_handle, &rs232_dcb);
    
    		ClearCommError(rs232_handle,&rs232_error,&rs232_comstat);
    
    		if (rs232_comstat.cbInQue>0)
    		{
    			ReadFile(rs232_handle,rs232_combuf,rs232_comstat.cbInQue,&rs232_totalreadbytes, &rs232_ol);
    			rs232_statusmessage();
    		}
    
    		CancelIo(rs232_handle);
    		CloseHandle(rs232_handle);
    
    		return 0;
    	}
    
    }
    

    rs232_open() shcaut folgendermassen aus:

    int rs232_open()
    {
    	int result;
    
    	memset(&rs232_ol,0,sizeof(rs232_ol));
    
    	rs232_handle = CreateFile( rs232_settings.comport, GENERIC_READ | GENERIC_WRITE,
                      0,                    // exclusive access
                      NULL,                 // no security attrs
                      OPEN_EXISTING,
                      FILE_ATTRIBUTE_NORMAL, // overlapped I/O
    				  NULL );
    
    	if (rs232_handle == INVALID_HANDLE_VALUE)
    	{
    		return 1;
    	}
    	else
    	{
    		result = SetCommTimeouts(rs232_handle, &rs232_cto);
    		if (result==0)
    			return 2;
    
    		result = SetCommState(rs232_handle, &rs232_dcb);
    		if (result==0)
    			return 3;
    
    		result = ClearCommError(rs232_handle,&rs232_error,&rs232_comstat);
    		if (result==0)
    			return 4;
    
    		result = SetupComm(rs232_handle,1024,1024);
    		if (result==0)
    			return 5;
    
    		result = PurgeComm(rs232_handle,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
    		if (result==0)
    			return 6;	
    
    	}
    	return 0;
    
    }
    


  • Setze doch mal testweise den letzten Parameter von ReadFile auf NULL. Der Port wird ja schliesslich auch nicht overlapped geöffnet (auch wenn der Kommentar etwas anderes vermuten lässt).


Anmelden zum Antworten