Hier ist ein funktionierender Code zum Empfangen und Senden von zeichen über die serielle Schnittstelle. Die einzelnen Code-Teile (Initialisieren, Empfangen, Senden und Schließen) sind je nach Programm/Aufgabenstelleung in einem anderen Kontext zu verwenden.
Das Proggi hier ist nur ein Beispiel, wie man das macht.

Code:
// DOS32-Programm zum Senden/Empfangen von Bytes über COM2 (9600-8N1)
// Alle empfangenen Bytes werden zurückgesendet.
// OS: W95, W98, W98SE, WinME, WinNT, Win2000, WinXP
// Note: Keine Fehlerbehandlung implementiert!
#include <windows.h>
#include <stdio.h>

#define COM_BUFFER_SIZE 16       // Read- und Write-Buffer-Size
#define BD_RATE         CBR_9600 // 9600 Baud


int main (void)
{
	DCB           dcb;    
	DWORD         iBytesWritten;
	BOOL          bRet      = true;
	DWORD         dwRead    = 0;
	DWORD         dwSetMask = EV_RXCHAR | EV_ERR; 
	DWORD         dwEvtMask; 
	OVERLAPPED    o;
	COMMTIMEOUTS  ct;
	unsigned char InString[COM_BUFFER_SIZE + 1];

	memset (&o, 0, sizeof (OVERLAPPED)); // Struktur mit 0en füllen
	o.hEvent = CreateEvent (NULL, FALSE, FALSE, NULL); // einen Event setzten

	HANDLE hCom = CreateFile ("COM2", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, &o);                     
	
	dcb.DCBlength = sizeof(DCB);  // Laenge des Blockes MUSS gesetzt sein!
	GetCommState (hCom, &dcb);    // COM-Einstellungen holen und aendern
	dcb.BaudRate  = BD_RATE;      // Baudrate
	dcb.ByteSize  = 8;            // Datenbits
	dcb.Parity    = NOPARITY;     // Parität
	dcb.StopBits  = ONESTOPBIT;   // Stopbits
	SetCommState (hCom, &dcb);    // COM-Einstellungen speichern
	
	GetCommTimeouts (hCom, &ct);
	// Warte-Zeit [ms] vom Beginn eines Bytes bis zum Beginn des nächsten Bytes 
	ct.ReadIntervalTimeout         = 1000 / BD_RATE * (dcb.ByteSize + 
		                                                 (dcb.Parity == NOPARITY ? 0 : 1) + 
																										 (dcb.StopBits == ONESTOPBIT ? 1 : 2)) * 2;
	ct.ReadTotalTimeoutMultiplier  = 0;  // [ms] wird mit Read-Buffer-Size multipliziert
	ct.ReadTotalTimeoutConstant    = 50; // wird an ReadTotalTimeoutMultiplier angehängt
	ct.WriteTotalTimeoutMultiplier = 0;
	ct.WriteTotalTimeoutConstant   = 0;
	SetCommTimeouts (hCom, &ct);

	// Zwischenspeicher des serial-Drivers einstellen (für read und write):
	SetupComm (hCom, COM_BUFFER_SIZE, COM_BUFFER_SIZE);

	SetCommMask (hCom, dwSetMask); // Empfangssignale definieren

	do  // in Endlos-Schleife auf Empfangssignale warten:
	{
		WaitCommEvent (hCom, &dwEvtMask, &o); // Event mit Empfangssignalen verknüpfen

		if (WAIT_OBJECT_0 == WaitForSingleObject (o.hEvent, INFINITE)) // warten bis Event
		{
			if (dwEvtMask & EV_RXCHAR) // Zeichen an RxD empfangen:
			{
				bRet = ReadFile (hCom, &InString, sizeof (InString), &dwRead, NULL);

				if (!bRet)
				{ // Fehlerausgabe:
					LPVOID lpMsgBuf;
					FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | 
													FORMAT_MESSAGE_FROM_SYSTEM | 
													FORMAT_MESSAGE_IGNORE_INSERTS,
													NULL, GetLastError(),
													MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
													(LPTSTR) &lpMsgBuf, 0, NULL);
					MessageBox (NULL, (LPCTSTR)lpMsgBuf, "Error: ReadFile", 
											MB_OK | MB_ICONINFORMATION);
					LocalFree (lpMsgBuf);
				}
				else
				{ // Ausgabe (oder Verarbeitung) der empfangenen Bytes:
					InString[dwRead] = '\0';
					printf (TEXT("\r\n\tRxD (%d Byte(s)): %s"), dwRead, InString);
					WriteFile (hCom, &InString, dwRead, &iBytesWritten, &o); // Senden eines Bytes
				}
			}

			if (dwEvtMask & EV_ERR) 
			{
				MessageBox (NULL, "Error empfangen", "Error: ReadFile", MB_OK);
				break; // Schleifen-Abbruch
			}
		}
	}
	while (1);

	CloseHandle (hCom);     // COM schließen
	CloseHandle (o.hEvent); // Event-Handle zurückgeben

	return (0);
}
Viel Spaß beim proggen.


Blackbird