Das hab ich mir aus einem alten Artikel gerettet, schau mal, vielleicht hilft es dir

8-Bit,
ohne Parity,
ohne Flußkontrolle (3 Draht)
Ich verwende übrigens das MS VisualC++. Bei diesen Calls ist aber nix davon zu sehen, da es die üblichen Standard-Calls sind.
Keine Klassen, kein nix.



Windows-Interface
Code:
Open
Get Handle 
char	cName[]="\\\\.\\COM1";  
HANDLE	hFile;

    hFile= CreateFile(cName,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

    if(hFile==INVALID_HANDLE_VALUE)    // Das war nix, eventuell anderes "COM" versuchen

Das Handle "hFile" wird nun für alle Calls angegeben, wie halt bei Windows üblich. 

Set State 
Mit diesem Handle kann (muß) man die Eigenschaften festlegen. Ich sag's ehrlich, mit den Time-Out Argumenten hab' ich nicht weiter 'rumprobiert, mir war nur wichtig, daß es funktioniert. Das letzte Mal hab ich noch "*.SYS" Treiber für das Steinzeit-DOS geschrieben. Also eventuell bitte um Nachsicht. 

COMMTIMEOUTS	sTo;
DCB		sDcb;

	memset(&sDcb,0,sizeof(sDcb));
	sDcb.DCBlength          = sizeof(sDcb);
	sDcb.BaudRate     	= Baud;            // 9600 oder eine andere Baudrate
	sDcb.fParity      	= FALSE;
	sDcb.fBinary      	= TRUE;
	sDcb.Parity       	= NOPARITY;
	sDcb.StopBits     	= ONESTOPBIT;
	sDcb.fOutxCtsFlow 	= FALSE;
	sDcb.fOutxDsrFlow 	= FALSE; 
	sDcb.fDtrControl	= DTR_CONTROL_ENABLE;
	sDcb.fRtsControl	= RTS_CONTROL_ENABLE;
	sDcb.fDsrSensitivity    = FALSE;
	sDcb.fAbortOnError	= FALSE;
	sDcb.ByteSize     	= 8;
	
	if(SetCommState(hFile,&sDcb)) 
 	{
	  sTo.ReadIntervalTimeout	   = MAXDWORD; 		// 0 ms Read-Timeout
	  sTo.ReadTotalTimeoutMultiplier   = 0; 
	  sTo.ReadTotalTimeoutConstant     = 0; 
	  sTo.WriteTotalTimeoutMultiplier  = 1;			// 1*2 ms Write Timeout
	  sTo.WriteTotalTimeoutConstant    = 2;
  	  if(SetCommTimeouts((HANDLE)hFile,&sTo))
		return 1;  // O.K. return
        }
      	CloseHandle(hFile);
        return 0;          // Im Fehlerfall
}
Read
Fragen, ob Daten da sind 
COMSTAT	sComStat;
DWORD	dwErrorFlags = 0;

	ClearCommError(hFile, &dwErrorFlags, &sComStat);

        sComStat.cbInQue;     // Die Anzahl der Bytes im Buffer
Daten abholen 
DWORD	dwCount;
	ReadFile(hFile, Buffer, Max, &dwCount, 0);
Buffer ein Bereich für die Daten 
Max die Anzahl der gewünschten Bytes 
dwCount die Anzahl der tatsächlich bekommenen Bytes 
Write
	WriteFile(hFile, Buffer, Count, &dwCount, 0);
Buffer die zu sendenden Daten 
Max die Anzahl der Bytes 
dwCount die Anzahl der tatsächlich gesendeten Bytes 
Close
     	CloseHandle(hFile);