Witam, mam problem odnosnie sprawdzania statusu portu COM. Otwieram go z flaga FILE_FLAG_OVERLAPPED, odczyt oraz zapis dzialaja, ustawiam maske na uchwyt, jednak program krzywo sprawdza status. Sama funkcja ponizej:
DWORD GetStatusCOM(DWORD dPort) {
std::list<Port>::iterator itr;
for(itr = Ports.begin(); itr != Ports.end(); ++itr) {
if(itr->dPort == dPort) {
DWORD dwRes;
DWORD dwCommEvent = 0;
DWORD dwOvRes;
BOOL fWaitingOnStat;
OVERLAPPED osStatus = {0};
osStatus.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (osStatus.hEvent == NULL) {
CloseHandle(osStatus.hEvent);
return -1;
}
if (!WaitCommEvent(itr->hCom, &dwCommEvent, &osStatus)) {
if (GetLastError() == ERROR_IO_PENDING) {
fWaitingOnStat = TRUE;
} else {
CancelIo(itr->hCom);
}
}
if (fWaitingOnStat) {
dwRes = WaitForSingleObject(osStatus.hEvent, itr->dWait);
switch(dwRes) {
case WAIT_OBJECT_0:
if (!GetOverlappedResult(itr->hCom, &osStatus, &dwOvRes, FALSE)) {
printf("ten blad nie powinien sie pojawic\n");
CloseHandle(osStatus.hEvent);
return GetLastError();
} else {
CloseHandle(osStatus.hEvent);
return dwCommEvent;
}
case WAIT_TIMEOUT:
CloseHandle(osStatus.hEvent);
return -97;
default:
CloseHandle(osStatus.hEvent);
return -1;
}
}
}
}
return -2;
}
Gdy wywolam write do portu i sprawdze status, wszystko jest OK, status zwraca dobry wynik.
Gdy wywolam pobieranie statusu np. dwa razy pod rzad dostaje niestety timeouty. Co wiecej Kobminacja:
write, getstatus, getstatus, write, getstatus daje mi wynik: dobry status, timeout, timeout.
Gdy funkcja sprawdzajaca status jest w osobnym watku, rowniez wystepuja te same objawy.