|
@@ -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
|
|
|
}
|
|
|
|