}
}
-bool CSerialSocket::SetTimeouts(serial_socket_t socket, int* iError, DWORD iTimeout)
+bool SetTimeouts(serial_socket_t socket, int* iError, bool bBlocking)
{
if (socket == INVALID_HANDLE_VALUE)
return false;
- if (iTimeout == m_iCurrentTimeout)
- return true;
-
COMMTIMEOUTS cto;
if (!GetCommTimeouts(socket, &cto))
{
return false;
}
- cto.ReadIntervalTimeout = 0;
- cto.ReadTotalTimeoutConstant = iTimeout;
- cto.ReadTotalTimeoutMultiplier = 0;
+ if (bBlocking)
+ {
+ cto.ReadIntervalTimeout = 0;
+ cto.ReadTotalTimeoutConstant = 0;
+ cto.ReadTotalTimeoutMultiplier = 0;
+ }
+ else
+ {
+ cto.ReadIntervalTimeout = MAXDWORD;
+ cto.ReadTotalTimeoutConstant = 0;
+ cto.ReadTotalTimeoutMultiplier = 0;
+ }
if (!SetCommTimeouts(socket, &cto))
{
return false;
}
- m_iCurrentTimeout = iTimeout;
return true;
}
ssize_t CSerialSocket::Read(void* data, size_t len, uint64_t iTimeoutMs /* = 0 */)
{
- if (IsOpen())
- {
- DWORD iTimeout((DWORD)iTimeoutMs);
- if (iTimeout != iTimeoutMs)
- return -1;
-
- int iError(0);
- if (!SetTimeouts(m_socket, &iError, iTimeout))
- return -1;
-
- return SerialSocketRead(m_socket, &m_iError, data, len, iTimeoutMs);
- }
-
- return -1;
+ return IsOpen() ? SerialSocketRead(m_socket, &m_iError, data, len, iTimeoutMs) : -1;
}
bool CSerialSocket::Open(uint64_t iTimeoutMs /* = 0 */)
return false;
}
- if (!SetTimeouts(m_socket, &m_iError, MAXDWORD))
+ if (!SetTimeouts(m_socket, &m_iError, false))
{
m_strError = "unable to set timeouts";
FormatWindowsError(GetLastError(), m_strError);