PISerial Windows read fix

This commit is contained in:
2022-12-18 14:23:19 +03:00
parent 886eb06880
commit a98176f513

View File

@@ -830,9 +830,15 @@ void PISerial::applySettings() {
void PISerial::setTimeouts() { void PISerial::setTimeouts() {
#ifdef WINDOWS #ifdef WINDOWS
COMMTIMEOUTS times; COMMTIMEOUTS times;
times.ReadIntervalTimeout = isOptionSet(BlockingRead) ? vtime : MAXDWORD; if (isOptionSet(BlockingRead)) {
times.ReadTotalTimeoutConstant = isOptionSet(BlockingRead) ? 0 : 1; times.ReadIntervalTimeout = MAXDWORD;
times.ReadTotalTimeoutMultiplier = isOptionSet(BlockingRead) ? 0 : MAXDWORD; times.ReadTotalTimeoutConstant = vtime;
times.ReadTotalTimeoutMultiplier = MAXDWORD;
} else {
times.ReadIntervalTimeout = MAXDWORD;
times.ReadTotalTimeoutConstant = 0;
times.ReadTotalTimeoutMultiplier = 0;
}
times.WriteTotalTimeoutConstant = isOptionSet(BlockingWrite) ? 0 : 1; times.WriteTotalTimeoutConstant = isOptionSet(BlockingWrite) ? 0 : 1;
times.WriteTotalTimeoutMultiplier = 0; times.WriteTotalTimeoutMultiplier = 0;
if (SetCommTimeouts(PRIVATE->hCom, &times) == -1) piCoutObj << "Unable to set timeouts for \"" << path() << "\""; if (SetCommTimeouts(PRIVATE->hCom, &times) == -1) piCoutObj << "Unable to set timeouts for \"" << path() << "\"";
@@ -860,25 +866,26 @@ ssize_t PISerial::readDevice(void * read_to, ssize_t max_size) {
#ifdef WINDOWS #ifdef WINDOWS
if (!canRead()) return -1; if (!canRead()) return -1;
if (sending) return -1; if (sending) return -1;
// piCoutObj << "read ..." << PRIVATE->hCom; // piCoutObj << "read ..." << PRIVATE->hCom << max_size;
memset(&(PRIVATE->overlap), 0, sizeof(PRIVATE->overlap)); memset(&(PRIVATE->overlap), 0, sizeof(PRIVATE->overlap));
PRIVATE->overlap.hEvent = PRIVATE->event.getEvent(); PRIVATE->overlap.hEvent = PRIVATE->event.getEvent();
PRIVATE->readed = 0;
ReadFile(PRIVATE->hCom, read_to, max_size, NULL, &(PRIVATE->overlap)); ReadFile(PRIVATE->hCom, read_to, max_size, NULL, &(PRIVATE->overlap));
PRIVATE->readed = 0; DWORD err = GetLastError();
// piCoutObj << "read" << err;
if (err == ERROR_BAD_COMMAND || err == ERROR_ACCESS_DENIED) {
piCoutObj << "read error" << errorString();
stop();
close();
return 0;
}
// piCout << "wait ...";
if (PRIVATE->event.wait()) { if (PRIVATE->event.wait()) {
GetOverlappedResult(PRIVATE->hCom, &(PRIVATE->overlap), &(PRIVATE->readed), FALSE); GetOverlappedResult(PRIVATE->hCom, &(PRIVATE->overlap), &(PRIVATE->readed), FALSE);
} else } else
return -1; return -1;
// piCoutObj << "read done" << PRIVATE->readed; // piCoutObj << "read done" << PRIVATE->readed;
DWORD err = GetLastError(); // piCoutObj << "read" << (PRIVATE->readed) << errorString();
if (err == ERROR_TIMEOUT && PRIVATE->readed == 0) return 0;
if (err == ERROR_BAD_COMMAND || err == ERROR_ACCESS_DENIED) {
piCoutObj << "read error" << (PRIVATE->readed) << errorString();
stop();
close();
return 0;
}
// piCoutObj << "read" << (PRIVATE->readed) << errorString();
return PRIVATE->readed; return PRIVATE->readed;
#else #else
if (!canRead()) return -1; if (!canRead()) return -1;