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.
Lesezeichen