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






(aber keine Ahnung von Events - für Controller ist die Interrupt-Programmierung und die UART-Schnittstelle eigentlich so simpel zu programmieren
Zitieren

Lesezeichen