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);
Lesezeichen