PISerial Windows read fix
This commit is contained in:
@@ -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, ×) == -1) piCoutObj << "Unable to set timeouts for \"" << path() << "\"";
|
if (SetCommTimeouts(PRIVATE->hCom, ×) == -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user