Selaa lähdekoodia

变更记录监听的数据清除方式。

sat23 4 vuotta sitten
vanhempi
commit
c336808e68

+ 5 - 0
SerialWatch/SerialWatch/SerialWatch.cpp

@@ -128,6 +128,7 @@ SERIALWATCH_API bool RTK_USBUpgrade(BYTE byKey)
 			SendCommand(_T("reboot\r"), 1);	
 			if ( WatchWord(_T("Terminated"), 100) ) {
 				ClearBuffer();
+				DWORD dwTickCount = GetTickCount();
 				while ( TRUE ) {
 					// 连续发送150次按键;
 					SendCommand((LPCTSTR)&byKey, 150);
@@ -150,6 +151,10 @@ SERIALWATCH_API bool RTK_USBUpgrade(BYTE byKey)
 							break;
 						}
 					}
+
+					// 超过1分钟,退出;
+					if ( GetTickCount() - dwTickCount > 60000 )
+						break;
 				}
 			}				
 		}

+ 55 - 22
SerialWatch/SerialWatch/SynSerial.cpp

@@ -386,11 +386,65 @@ void CSynSerial::EndofThread()
 	m_hEvent = NULL;
 }
 
+void CSynSerial::SwapBuffers(TCHAR *szValue, DWORD dwRealRead)
+{
+#if 0 // 过于复杂的逻辑处理
+	int nLeft = 0;
+	bool bFist = true;	// 是否填充完整过;
+	int nIndex = 0;
+
+	if ( s_nCurPos + dwRealRead <= BUFFER_LEN ) {
+		memcpy_s(&s_byBuffer[s_nCurPos], BUFFER_LEN-s_nCurPos, szValue, dwRealRead);
+		s_nCurPos += dwRealRead;
+	} else {
+		nLeft = dwRealRead - (nIndex = BUFFER_LEN - s_nCurPos);
+		
+		// 先将尾部填充;
+		memcpy_s(&s_byBuffer[s_nCurPos], BUFFER_LEN-s_nCurPos, szValue, BUFFER_LEN-s_nCurPos);
+
+		// 剩余是否大于缓冲区;
+		while ( nLeft > BUFFER_LEN ) {
+			// 先复制尾部;
+			nIndex += BUFFER_LEN;
+			memcpy_s(s_byBuffer, BUFFER_LEN, &szValue[nIndex], BUFFER_LEN);
+			nLeft -= BUFFER_LEN;
+		}
+
+		s_nCurPos = nLeft;
+		// 处理最后剩余的数据;
+		if ( nLeft != 0 ) {
+			memcpy_s(s_byBuffer, nLeft, &szValue[nIndex], nLeft);
+		}
+	}
+	m_strbuffer.append(szValue, dwRealRead);
+
+	// 超过10倍才清空;
+	if ( m_strbuffer.size() > BUFFER_LEN*3) {
+		m_strbuffer.resize(0);
+		m_strbuffer.clear();
+		// 如果遇到\0开头,显示空字符,但实现有内容;
+		m_strbuffer.append((char*)&s_byBuffer[s_nCurPos], BUFFER_LEN - s_nCurPos);
+		m_strbuffer.append((char*)s_byBuffer, s_nCurPos);
+	}
+#else
+	if ( m_strbuffer.length() > BUFFER_LEN * 10 ) {
+		int nIndex = 0;
+		m_strbuffer = m_strbuffer.substr(BUFFER_LEN * 9);
+		if ( (nIndex = m_strbuffer.find_first_of('\r')) != std::string::npos )
+			m_strbuffer = m_strbuffer.substr(nIndex+1);
+	}
+	
+	m_strbuffer.append(szValue, dwRealRead);
+#endif
+
+	printf("内容:%s\n", m_strbuffer.c_str());
+}
 
 DWORD CSynSerial::ThreadWatch(LPVOID lpVoid)
 {
 	int nLeft = 0;
 	bool bFist = true;	// 是否填充完整过;
+	int nIndex = 0;
 	DWORD dwRealRead;
 	TCHAR szValue[1024] = {0};
 	CSynSerial *pthat = (CSynSerial*)lpVoid;
@@ -405,30 +459,9 @@ DWORD CSynSerial::ThreadWatch(LPVOID lpVoid)
 			OutputDebugString(_T("\n"));
 
 #if 1
-			if ( (s_nCurPos + dwRealRead) > BUFFER_LEN ) {
-				// 先复制尾部;
-				nLeft = dwRealRead - (BUFFER_LEN-s_nCurPos);
-				memcpy_s(&s_byBuffer[s_nCurPos], BUFFER_LEN-s_nCurPos, szValue, BUFFER_LEN-s_nCurPos);
-				s_nCurPos = 0;
-				memcpy_s(s_byBuffer, nLeft, &szValue[nLeft], nLeft);
-				s_nCurPos = nLeft;
-				bFist = false;
-			} else {
-				memcpy_s(&s_byBuffer[s_nCurPos], BUFFER_LEN-s_nCurPos, szValue, dwRealRead);
-				s_nCurPos += dwRealRead;
-			}
-
-			pthat->m_strbuffer.clear();
-			if ( !bFist )
-				pthat->m_strbuffer.append((char*)&s_byBuffer[s_nCurPos], BUFFER_LEN - s_nCurPos);
-			pthat->m_strbuffer.append((char*)s_byBuffer, s_nCurPos);
-
-			printf("内容:%s\n", pthat->m_strbuffer.c_str());
+			pthat->SwapBuffers(szValue, dwRealRead);			
 #else // 这里如果不及时清除,内存越来越大;
 			pthat->m_strbuffer.append(szValue, dwRealRead);
-#endif
-#ifdef _DEBUG
-			printf(_T("buffer=%s\n"), pthat->m_strbuffer.c_str());
 #endif
 		}
 

+ 3 - 1
SerialWatch/SerialWatch/SynSerial.h

@@ -19,7 +19,7 @@
 #ifndef __SYN_SERIAL__
 #define __SYN_SERIAL__
 
-#define BUFFER_LEN 1000/*8912*/
+#define BUFFER_LEN 3000
 
 #include "CritSection.h"
 
@@ -51,6 +51,8 @@ private:
 	static int s_nCurPos;
 	static byte s_byBuffer[BUFFER_LEN];
 	static ThreadSection s_csClearBuffer;
+
+	void SwapBuffers(TCHAR *szValue, DWORD dwRealRead);
 public:
 	inline BOOL IsOpen() const {
 		return (m_hSerialPort == NULL || m_hSerialPort == INVALID_HANDLE_VALUE) ? FALSE : TRUE;