加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C++串口编程实例(三)

(2012-09-01 10:52:05)
标签:

串口

默认值

奇偶校验

通信类

通信协议

杂谈

分类: CPP编程
  1.        
  2.     if (m_hComm == INVALID_HANDLE_VALUE)  
  3.     {  
  4.         LeaveCriticalSection(&m_csCommunicationSync);  
  5.         return false;  
  6.     }  
  7.  
  8.        
  9.     LeaveCriticalSection(&m_csCommunicationSync);  
  10.  
  11.     return true;  
  12. }  
  13.  
  14. bool CSerialPort::OpenListenThread()  
  15. {  
  16.        
  17.     if (m_hListenThread != INVALID_HANDLE_VALUE)  
  18.     {  
  19.            
  20.         return false;  
  21.     }  
  22.  
  23.     s_bExit false;  
  24.        
  25.     UINT threadId;  
  26.        
  27.     m_hListenThread (HANDLE)_beginthreadex(NULL, 0, ListenThread, this0, &threadId);  
  28.     if (!m_hListenThread)  
  29.     {  
  30.         return false;  
  31.     }  
  32.        
  33.     if (!SetThreadPriority(m_hListenThread, THREAD_PRIORITY_ABOVE_NORMAL))  
  34.     {  
  35.         return false;  
  36.     }  
  37.  
  38.     return true;  
  39. }  
  40.  
  41. bool CSerialPort::CloseListenTread()  
  42.     
  43.     if (m_hListenThread != INVALID_HANDLE_VALUE)  
  44.     {  
  45.            
  46.         s_bExit true;  
  47.  
  48.            
  49.         Sleep(10);  
  50.  
  51.            
  52.         CloseHandle( m_hListenThread );  
  53.         m_hListenThread INVALID_HANDLE_VALUE;  
  54.     }  
  55.     return true;  
  56. }  
  57.  
  58. UINT CSerialPort::GetBytesInCOM()  
  59. {  
  60.     DWORD dwError 0;     
  61.     COMSTAT  comstat;      
  62.     memset(&comstat, 0, sizeof(COMSTAT));  
  63.  
  64.     UINT BytesInQue 0;  
  65.        
  66.     if ClearCommError(m_hComm, &dwError, &comstat) )  
  67.     {  
  68.         BytesInQue comstat.cbInQue;    
  69.     }  
  70.  
  71.     return BytesInQue;  
  72. }  
  73.  
  74. UINT WINAPI CSerialPort::ListenThread( voidpParam )  
  75. {  
  76.        
  77.     CSerialPort *pSerialPort reinterpret_cast<CSerialPort*>(pParam);  
  78.  
  79.     // 线程循环,轮询方式读取串口数据  
  80.     while (!pSerialPort->s_bExit)   
  81.     {  
  82.         UINT BytesInQue pSerialPort->GetBytesInCOM();  
  83.            
  84.         if BytesInQue == )  
  85.         {  
  86.             Sleep(SLEEP_TIME_INTERVAL);  
  87.             continue;  
  88.         }  
  89.  
  90.          
  91.         char cRecved 0x00;  
  92.         do 
  93.         {  
  94.             cRecved 0x00;  
  95.             if(pSerialPort->ReadChar(cRecved) == true)  
  96.             {  
  97.                 std::cout << cRecved   
  98.                 continue;  
  99.             }  
  100.         }while(--BytesInQue);  
  101.      
  102.     return 0;  
  103. }  
  104.  
  105. bool CSerialPort::ReadChar( char &cRecved )  
  106. {  
  107.     BOOL  bResult     TRUE;  
  108.     DWORD BytesRead   0;  
  109.     if(m_hComm == INVALID_HANDLE_VALUE)  
  110.     {  
  111.         return false;  
  112.     }  
  113.  
  114.        
  115.     EnterCriticalSection(&m_csCommunicationSync);  
  116.  
  117.        
  118.     bResult ReadFile(m_hComm, &cRecved, 1, &BytesRead, NULL);  
  119.     if ((!bResult))  
  120.       
  121.            
  122.         DWORD dwError GetLastError();  
  123.  
  124.            
  125.         PurgeComm(m_hComm, PURGE_RXCLEAR PURGE_RXABORT);  
  126.         LeaveCriticalSection(&m_csCommunicationSync);  
  127.  
  128.         return false;  
  129.     }  
  130.  
  131.        
  132.     LeaveCriticalSection(&m_csCommunicationSync);  
  133.  
  134.     return (BytesRead == 1);  
  135. }  
  136.  
  137. bool CSerialPort::WriteData( unsigned charpData, unsigned int length )  
  138. {  
  139.     BOOL   bResult     TRUE;  
  140.     DWORD  BytesToSend 0;  
  141.     if(m_hComm == INVALID_HANDLE_VALUE)  
  142.     {  
  143.         return false;  
  144.     }  
  145.  
  146.        
  147.     EnterCriticalSection(&m_csCommunicationSync);  
  148.  
  149.        
  150.     bResult WriteFile(m_hComm, pData, length, &BytesToSend, NULL);  
  151.     if (!bResult)    
  152.     {  
  153.         DWORD dwError GetLastError();  
  154.            
  155.         PurgeComm(m_hComm, PURGE_RXCLEAR PURGE_RXABORT);  
  156.         LeaveCriticalSection(&m_csCommunicationSync);  
  157.  
  158.         return false;  
  159.     }  
  160.  
  161.        
  162.     LeaveCriticalSection(&m_csCommunicationSync);  
  163.  
  164.     return true;  
  165. }

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有