SerialBuffer.cpp
上传用户:chineseart
上传日期:2022-06-24
资源大小:52k
文件大小:5k
源码类别:

串口编程

开发平台:

Visual C++

  1. // SerialBuffer.cpp: implementation of the CSerialBuffer class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "SerialBuffer.h"
  6. #include "SerialCommHelper.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. USE_DEBUGDUMP
  13. //////////////////////////////////////////////////////////////////////
  14. // Construction/Destruction
  15. //////////////////////////////////////////////////////////////////////
  16. CSerialBuffer::CSerialBuffer()
  17. {
  18. Init();
  19. }
  20. void CSerialBuffer::Init()
  21. {
  22. ::InitializeCriticalSection ( &m_csLock );
  23. m_abLockAlways = true;
  24.   m_iCurPos = 0;
  25. m_alBytesUnRead = 0;
  26. m_szInternalBuffer.erase ();
  27. }
  28. CSerialBuffer::~CSerialBuffer()
  29. {
  30. ::DeleteCriticalSection ( &m_csLock );
  31. }
  32. void CSerialBuffer::AddData( char ch )
  33. {
  34. ATLTRACE6 (_T("CSerialBuffer : (tid:%d) AddData(char) called "), GetCurrentThreadId ());
  35. m_szInternalBuffer += ch;
  36. m_alBytesUnRead += 1;
  37. }
  38. void CSerialBuffer::AddData( std::string& szData,int iLen ) 
  39. {
  40. ATLTRACE6 (_T("CSerialBuffer : (tid:%d) AddData(%s,%d) called "), GetCurrentThreadId (),szData.c_str (),iLen);
  41. m_szInternalBuffer.append ( szData.c_str () ,iLen);
  42. m_alBytesUnRead += iLen;
  43. }
  44. void CSerialBuffer::AddData( char *strData,int iLen ) 
  45. {
  46. ATLTRACE6 (_T("CSerialBuffer : (tid:%d) AddData(char*,%d) called "), GetCurrentThreadId (),iLen);
  47. ASSERT ( strData != NULL );
  48. m_szInternalBuffer.append ( strData,iLen);
  49. m_alBytesUnRead += iLen;
  50. }
  51. void CSerialBuffer::AddData( std::string &szData ) 
  52. {
  53. ATLTRACE6 (_T("CSerialBuffer : (tid:%d) AddData(%s) called "), GetCurrentThreadId (),szData.c_str () );
  54. m_szInternalBuffer +=  szData;
  55. m_alBytesUnRead += szData.size ();
  56. }
  57. void CSerialBuffer::Flush()
  58. {
  59. LockBuffer();
  60. m_szInternalBuffer.erase ();
  61. m_alBytesUnRead = 0;
  62. m_iCurPos  = 0;
  63. UnLockBuffer();
  64. }
  65. long  CSerialBuffer::Read_N( std::string &szData,long  alCount ,HANDLE & hEventToReset)
  66. {
  67. ATLTRACE6 (_T("CSerialBuffer : (tid:%d) Read_N() called "), GetCurrentThreadId ());
  68. ASSERT ( hEventToReset != INVALID_HANDLE_VALUE ) ;
  69. LockBuffer();
  70. long alTempCount = min( alCount ,  m_alBytesUnRead) ;
  71. long alActualSize = GetSize();
  72.    
  73. szData.append (m_szInternalBuffer,m_iCurPos ,alTempCount);
  74. m_iCurPos +=  alTempCount ;
  75. m_alBytesUnRead -= alTempCount;
  76. if (m_alBytesUnRead == 0 )
  77. {
  78. ClearAndReset ( hEventToReset );
  79. }
  80.  
  81. UnLockBuffer();
  82. ATLTRACE6 (_T("CSerialBuffer : (tid:%d) Read_N returned %d bytes (data:%s)  "), GetCurrentThreadId (),alTempCount,((szData)).c_str());
  83. return alTempCount;
  84. }
  85. bool CSerialBuffer::Read_Available( std::string &szData,HANDLE & hEventToReset)
  86. {
  87. ATLTRACE6 (_T("CSerialBuffer : (tid:%d) Read_Upto called "), GetCurrentThreadId ());
  88. LockBuffer();
  89.   szData += m_szInternalBuffer ;
  90. ClearAndReset ( hEventToReset );
  91. UnLockBuffer();
  92.   ATLTRACE6 (_T("CSerialBuffer : (tid:%d) Read_Available returned (data:%s)  "), GetCurrentThreadId (),((szData)).c_str());
  93. return ( szData.size () > 0 );
  94. }
  95. void CSerialBuffer::ClearAndReset(HANDLE& hEventToReset)
  96. {
  97. m_szInternalBuffer.erase();
  98. m_alBytesUnRead = 0;
  99. m_iCurPos = 0;
  100. ::ResetEvent ( hEventToReset );
  101. }
  102. bool CSerialBuffer::Read_Upto( std::string &szData,char chTerm,long  &alBytesRead ,HANDLE & hEventToReset)
  103. {
  104. return Read_Upto_FIX(szData,chTerm,alBytesRead ,hEventToReset);
  105. ATLTRACE6 (_T("CSerialBuffer : (tid:%d) Read_Upto called "), GetCurrentThreadId ());
  106. LockBuffer();
  107.    
  108. alBytesRead = 0 ;
  109. bool abFound = false;
  110. if ( m_alBytesUnRead > 0 ) 
  111. {//if there are some bytes un-read...
  112. int iActualSize = GetSize ();
  113. for ( int i = m_iCurPos ; i < iActualSize; ++i )
  114. {
  115. alBytesRead++;
  116. szData .append ( m_szInternalBuffer,i,1);
  117. m_alBytesUnRead -= 1;
  118. if ( m_szInternalBuffer[i] ==  chTerm) 
  119. {
  120. abFound = true;
  121. break;
  122. }
  123. }
  124. if ( m_alBytesUnRead == 0 ) 
  125. {
  126. ClearAndReset ( hEventToReset );
  127. }
  128. else 
  129. //if we are here it means that there is still some data in the local buffer and
  130. //we have already found what we want... maybe this is ok but we want to catch this
  131. //scenario --- fix is in TCP/ip SocketBuffer.
  132. ASSERT(0); 
  133. }
  134. UnLockBuffer();
  135.   ATLTRACE6 (_T("CSerialBuffer : (tid:%d) Read_Upto returned %d bytes (data:%s)  "), GetCurrentThreadId (),alBytesRead,((szData)).c_str());
  136. return abFound;
  137. }
  138. bool CSerialBuffer::Read_Upto_FIX( std::string &szData,char chTerm,long  &alBytesRead ,HANDLE & hEventToReset)
  139. {
  140. ATLTRACE6 (_T("CSerialBuffer : (tid:%d) Read_Upto called "), GetCurrentThreadId ());
  141. LockBuffer();
  142. alBytesRead = 0 ;
  143.    
  144.   bool abFound = false;
  145. if ( m_alBytesUnRead > 0 ) 
  146. {//if there are some bytes un-read...
  147. int iActualSize = GetSize ();
  148.   int iIncrementPos = 0;
  149. for ( int i = m_iCurPos ; i < iActualSize; ++i )
  150. {
  151. //szData .append ( m_szInternalBuffer,i,1);
  152. szData+=m_szInternalBuffer[i];
  153. m_alBytesUnRead -= 1;
  154. if ( m_szInternalBuffer[i] ==  chTerm) 
  155. {
  156. iIncrementPos++;
  157. abFound = true;
  158. break;
  159. }
  160. iIncrementPos++;
  161. }
  162. m_iCurPos += iIncrementPos;
  163. if ( m_alBytesUnRead == 0 ) 
  164. {
  165. ClearAndReset ( hEventToReset );
  166. }
  167. }
  168. UnLockBuffer();
  169. return abFound;
  170. }