设为首页 加入收藏

TOP

13.6.7 读取串口数据函数的实现
2013-10-07 14:37:37 来源: 作者: 【 】 浏览:48
Tags:13.6.7 读取 串口 数据函数 实现

13.6.7  读取串口数据函数的实现

读串口函数:ReceiveChar()负责读取串口数据,实现如下:

  1. 01  void CMySerial::ReceiveChar(CMySerial* port, COMSTAT comstat)  
  2. 02  {  
  3. 03      BOOL  bRead = TRUE;   
  4. 04      BOOL  bResult = TRUE;  
  5. 05      DWORD dwError = 0;  
  6. 06      DWORD BytesRead = 0;  
  7. 07      unsigned char RXBuff;  
  8. 08      //读取串口数据  
  9. 09      for (;;)   
  10. 10      {   
  11. 11          EnterCriticalSection(&port->m_csCommunicationSync);  
  12. 12          bResult = ClearCommError(port->m_hComm, &dwError, &comstat);  
  13. 13          LeaveCriticalSection(&port->m_csCommunicationSync);  
  14. 14          if (comstat.cbInQue == 0)  
  15. 15          {   //无数据可读  
  16. 16              break;  
  17. 17          }  
  18. 18              //锁定临界资源  
  19. 19          EnterCriticalSection(&port->m_csCommunicationSync);   
  20. 20          if (bRead)  
  21. 21          {  
  22. 22              bResult = ReadFile(port->m_hComm,       //串口句柄   
  23. 23                              &RXBuff,                //存放数据缓冲  
  24. 24                              1,                      //只读1个字节  
  25. 25                              &BytesRead,             //实际读取数据数量  
  26. 26                              &port->m_ov);           //Overlapped结构体  
  27. 27              if (!bResult)   
  28. 28              {   //读取失败  
  29. 29                  switch (dwError = GetLastError())   
  30. 30                  {   //错误代码  
  31. 31                      case ERROR_IO_PENDING:    
  32. 32                          {   //数据尚未读完  
  33. 33                              bRead = FALSE;  
  34. 34                              break;  
  35. 35                          }  
  36. 36                      default:  
  37. 37                          {   //一般错误处理方法  
  38. 38                              port->ProcessErrorMessage("ReadFile()");  
  39. 39                              break;  
  40. 40                          }   
  41. 41                  }  
  42. 42              }  
  43. 43              else  
  44. 44              {   //读取成功  
  45. 45                  bRead = TRUE;  
  46. 46              }  
  47. 47          }  
  48. 48          if (!bRead)  
  49. 49          {   //读取失败处理  
  50. 50              bRead = TRUE;  
  51. 51              bResult = GetOverlappedResult(port->m_hComm,    //串口句柄  
  52. 52                                      &port->m_ov,//Overlapped 结构体53                                      &BytesRead, //读取的字节数  
  53. 54                                      TRUE);      //等待  
  54. 55              if (!bResult)    
  55. 56              {   //错误处理  
  56. 57                  port->ProcessErrorMessage("GetOverlappedResults() in                    ReadFile()");  
  57. 58              }     
  58. 59          }  
  59. 60          LeaveCriticalSection(&port->m_csCommunicationSync);         //释放临界资源  
  60. 61          //向主窗体发送消息  
  61. 62          ::SendMessage((port->m_pParent)->m_hWnd,   
  62. 63                          WM_COMM_RXCHAR, (WPARAM) RXBuff,   
  63. 64                          (LPARAM) port->m_nPortNr);    
  64. 65      }  
  65. 66  } 

【代码解析】

第11~17行判断当前串口缓冲中是否已无数据可读,如是则直接退出循环。第22~26行在串口上读取1个字节的数据,第27行判断是否读取失败,如是,则在第29行判断错误原因,第31行判断是否读取动作尚未完成,如是则退出错误诊断,否则在第38行进行错误提示。如果尚未完成读取过程,则在第51~54行继续等待,直到完成。如果等待失败则在第57行进行错误提示。第62~64行向主窗体发送消息,通知主窗体串口接收到数据,并把刚刚读取的一个字节数据发送给主窗体。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇13.8.1 配置窗体的界面设计 下一篇13.6.5 串口线程监控函数的实现

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: