COM Schnittstelle auslesen
-
ich muss für mein aktuelles Projekt über einen COM Port ein Messgerät auslesen.
dafür habe ich bis jetzt immer die Windows Funktionen createFile(..) und writeFile(..) sowie readFile(..) verwendet.also ZB:
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);Wenn ich das ganze richtig verstanden habe sollte nun in der lpNumberOfBytesRead zu sehen sein wie viele Bytes ausgelesen wurden ....
und nNumberOfBytesToRead sollte die maximale Anzahl der zu lesenden Bytes angeben.Jetzt das Problem:
Wenn ich für nNumberOfBytesToRead einen größeren Wert einsetze als Zeichen im Buffer sind (also theoretiscgh lpNumberOfBytesRead < nNumberOfBytesToRead) dann blockiert die Funktion und gibt gar keinen Wert zurück
-
Wenn du ReadFile ohne die OVERLAPPED-Struktur verwendest, dann blockiert es immer solang, bis nNumberOfBytesToRead Bytes eingelesen wurden. Entweder du liest wenn du das nicht willst, musst du eben immer in kleinen Häppchen einlesen, oder asynchron arbeiten (also mit der OVERLAPPED-Struktur)
-
Vielen Dank schonmal für den Tip!
allerdings muss ich sagen das ich das ganze nicht wirklich hinkriege....
ich schreib jetzt mal rein was ich bis jetzt gemacht hab:der char pointer port weist auf den Namen des Ports also zB "COM1"
int MessCom::create(char* port) { DCB dcb; BOOL fSuccess; hCom = CreateFile( port, GENERIC_READ | GENERIC_WRITE, 0, // must be opened with exclusive-access NULL, // no security attributes OPEN_EXISTING, // must use OPEN_EXISTING FILE_FLAG_OVERLAPPED, // not overlapped I/O NULL // hTemplate must be NULL for comm devices ); if (hCom == INVALID_HANDLE_VALUE) { return 1; } // Build on the current configuration, and skip setting the size // of the input and output buffers with SetupComm. fSuccess = GetCommState(hCom, &dcb); if (!fSuccess) { return 2; } // Fill in DCB: 57,600 bps, 8 data bits, no parity, and 1 stop bit. dcb.BaudRate = CBR_115200; // set the baud rate dcb.ByteSize = 8; // data size, xmit, and rcv dcb.Parity = NOPARITY; // no parity bit dcb.StopBits = ONESTOPBIT; // one stop bit fSuccess = SetCommState(hCom, &dcb); if (!fSuccess) { return 3; } return 0; }Die Read Funktion soll immer 1 Zeichen auslesen bis LF(LF=0x0A;) ausgelesen wird (wird vom Messgerät am Ende jedes Strings angefügt)
int MessCom::read(char* text) { char temp; int i=0; do { ReadFile(hCom,(void*)&temp,1,lbytesRead,NULL); text[i]=temp; i++; }while(temp != LF); text[i-1]=0; return 0; }Das anze Funktioniert eine ganze Zeit auch recht gut ....
allerdings liest irgendwann die ReadFile nix mehr aus. und das Programm läuft nicht weiterwie funktioniert denn das ganze mit dem OVERLAPPED Teil...
Blick das nich so ganz
-
Nimm doch eine fertige Klasse und erfinde nicht das Rad neu. Serielle Kommunikation ist *nicht* trivial. Auch wenn es sich so anhört...
http://www.codeproject.com/system/serial.asp
-
Vielen Dank dafür.

damit gehts ....