Ho un dispositivo che scrive sulla com1

Mi collego alla porta e resto in ascolto, ma a volte (senza modificare codice o parametri di input) ho un errore di sistema (err 995 per la precisione) in corrispondenza delle chiamate

GetCommState
SetCommTimeouts

ma molto più spesso sulla ReadFile.
Posto un po di codice che magari si capisce meglio

codice:
int main (void)
{
	HANDLE serial;
	BOOL read;
	DCB dcb;
	COMMTIMEOUTS timeouts;
	FILE * outfile;

	int readen,i,evtmask;
	char byte;
	char buffer[MAX_BUFFER];
	char * my_string;

	serial = CreateFile("COM1",
                        GENERIC_READ | GENERIC_WRITE,
                        0,
                        NULL,
                        OPEN_EXISTING,
                        0,
                        0);

	if(serial ==INVALID_HANDLE_VALUE) {
	  
		printf("Porta non aperta\n");
		exit(1);

    } else {
		
		printf("Porta aperta\n");
	}

	
	
	memset(&dcb,0,sizeof(DCB));
	dcb.DCBlength = sizeof(DCB);


        
	if ( !(GetCommState(serial,&dcb)) ) \\ <===== Problema numero 1
	{
		printf("Impossibile rilevare lo stato dcb (errno %d)\n",GetLastError());
		CloseHandle(serial);
		exit(1);
	}
Questa era la prima porzione, in cui ho indicato il punto in cui a volte ottengo l'errore.

codice:
	

	dcb.BaudRate = CBR_4800;
	dcb.Parity = NOPARITY;
	dcb.StopBits = ONESTOPBIT;
	dcb.ByteSize = 8;
	
	if(!SetCommState(serial,&dcb)) {

		puts("Impossibile impostare dcb\n");
		exit(1);

	} else {
		
		puts("dcb configurato\n");
	  
	}
	
		
	timeouts.ReadIntervalTimeout  = 1000; 
	timeouts.ReadTotalTimeoutConstant   = 200;
	timeouts.ReadTotalTimeoutMultiplier = 200;
	timeouts.WriteTotalTimeoutConstant = 500;
	timeouts.WriteTotalTimeoutMultiplier = 200;

	
	if ( !SetCommTimeouts(serial,&timeouts) ) \\ <===== Problema numero 2
	{
		
		printf("Configurazione timeouts seriale fallita (errno %d)\n",GetLastError());
		CloseHandle(serial);
		exit(1);
	  
	}

	
	outfile = fopen("outfile.txt","w");
	if (!outfile) {
		printf("cannot open outfile\n");
		CloseHandle(serial);
		exit(1);
	}
Questa era la seconda parte.

codice:
	for (i=0,evtmask=0;;)
	{
		
		read = ReadFile (serial,
						 &byte,
						 1,
						 &readen,
						 NULL); // <===== Problema più frequente.

		
		if (readen == 1) {

			
			fprintf(outfile,"%c",byte); 
			
			printf("%c",byte);
			
			if (byte=='$') i=0;
			// gestire buffer overflow
			buffer[i++] = byte;

			if (byte==0x0A) 
			{
				my_string = (char*) malloc( (i)*sizeof(char) );
				strncpy(my_string,buffer,i);
				StringDiagnostic (my_string,i);
				
				free(my_string);
			}




		} else {
			
			if (!read)	printf("Errore lettura byte (%d)\n",GetLastError());
			WaitCommEvent(serial, &evtmask, NULL);
		}
	}
	
	
	
	fclose(outfile);
	CloseHandle(serial);
	


}

Questo è il codice.
Per completezza, l'errore 995 di win32 si porta dietro questo messaggio:
"The I/O operation has been aborted because of either a thread exit or an application request."

Io presumo di avere qualche problema con la configurazione della seriale e/o dei timeouts, ma chiedo aiuto ai più esperti di me (primo codice che scrivo su comunicazione seriale rs232).
Quello di cui sono sicuro sono i quattro parametri del DCB che compilo esplicitamente.

Grazie dell'attenzione