Prechádzať zdrojové kódy

修复读超时的错误用法:ReadTotalTimeoutMultiplier一般情况下设置为0,只设置ReadTotalTimeoutConstant和ReadIntervalTimeout即可。

JeffWang 2 rokov pred
rodič
commit
89dcae8dc2

+ 9 - 6
TCLCommand/TCLCommand/Serial.cpp

@@ -46,7 +46,7 @@ LPCOMMTIMEOUTS CBaseSerial::GetTimeouts()
     return IsOpen() && ::GetCommTimeouts(_hCommHandle, &_CO) == TRUE ? &_CO : NULL;
 }
 
-bool CBaseSerial::SetTimeouts(DWORD ReadIntervalTimeout /* = 0 */, DWORD ReadTotalTimeoutMultiplier /* = 10 */, DWORD ReadTotalTimeoutConstant /* = 1500 */, DWORD WriteTotalTimeoutMultiplier /* = 10 */, DWORD WriteTotalTimeoutConstant /* = 1500 */)
+bool CBaseSerial::SetTimeouts(DWORD ReadIntervalTimeout /* = 5 */, DWORD ReadTotalTimeoutMultiplier /* = 0 */, DWORD ReadTotalTimeoutConstant /* = 3000 */, DWORD WriteTotalTimeoutMultiplier /* = 5 */, DWORD WriteTotalTimeoutConstant /* = 1500 */)
 {
     COMMTIMEOUTS CO = {
         ReadIntervalTimeout, 
@@ -418,11 +418,14 @@ bool CBaseSerial::SetupPort()
     if (!::GetCommTimeouts(_hCommHandle, &_CO))
         return false;
 
-    _CO.ReadIntervalTimeout = 5;
-    _CO.ReadTotalTimeoutMultiplier = 10;
-    _CO.ReadTotalTimeoutConstant = 1500;
-    _CO.WriteTotalTimeoutMultiplier = 10;
-    _CO.WriteTotalTimeoutConstant = 1500;
+	_CO.ReadIntervalTimeout = 5;
+	// 设置0,否则读取超时=ReadTotalTimeoutMultiplier*读取的长度+ReadTotalTimeoutConstant;
+	_CO.ReadTotalTimeoutMultiplier = 0;
+	_CO.ReadTotalTimeoutConstant = 3000;
+	// 写可设置此值,写超时=WriteTotalTimeoutMultiplier*写入长度+WriteTotalTimeoutConstant;
+	_CO.WriteTotalTimeoutMultiplier = 5;
+	_CO.WriteTotalTimeoutConstant = 1500;
+
     if (!::SetCommTimeouts(_hCommHandle, &_CO))
         return false;
 

+ 3 - 3
TCLCommand/TCLCommand/Serial.h

@@ -61,9 +61,9 @@ public:
     // 设置超时
     bool SetTimeouts(
         DWORD ReadIntervalTimeout = 5, 
-        DWORD ReadTotalTimeoutMultiplier = 10, 
-        DWORD ReadTotalTimeoutConstant = 1500, 
-        DWORD WriteTotalTimeoutMultiplier = 10, 
+        DWORD ReadTotalTimeoutMultiplier = 0, 
+        DWORD ReadTotalTimeoutConstant = 3000, 
+        DWORD WriteTotalTimeoutMultiplier = 5, 
         DWORD WriteTotalTimeoutConstant = 1500);
     bool SetTimeouts(LPCOMMTIMEOUTS lpCO);
     // 设置串口的I/O缓冲区大小