基于c++的串口通讯

利用vc++中的MSComm控件来进行串口的编程,方便快捷。

具体步骤:
1、在项目中插入MSComm控件
选择Project菜单下Add To Project子菜单中的 Components and Controls选项,在弹出的对话框中双击Registered ActiveX Controls项。选择Microsoft Communications Control,单击Insert按钮将它插入到我们的Project中来,这时在ClassView视窗中就可以看到CMSComm类了,并且在控件工具栏Controls中出现了电话图标。
2、利用ClassWizard定义CMSComm类控制对象
打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1添加控制变量:m_ctrlComm。
3、在CSCommTestDlg::OnInitDialog( )函数中写如串口初始化代码
  1. BOOL CSCommTestDlg::OnInitDialog()  
  2. {  
  3. CDialog::OnInitDialog();  
  4.  
  5. 。。。  
  6.    
  7. if(m_ctrlComm.GetPortOpen())  
  8. m_ctrlComm.SetPortOpen(FALSE);  
  9. m_ctrlComm.SetCommPort(1); //选择com1  
  10. if(!m_ctrlComm.GetPortOpen())  
  11. m_ctrlComm.SetPortOpen(TRUE);//打开串口  
  12. else 
  13. AfxMessageBox("cannot open serial port");  
  14. m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位  
  15. m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据  
  16.  
  17. m_ctrlComm.SetRThreshold(1);  
  18. //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
  19.  
  20. m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0  
  21. m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据  
  22. return TRUE; // return TRUE unless you set the focus to a control  
  23. }
 4、添加串口事件处理函数OnComm( )
将控件拖至页面中,对其添加消息函数,代码如下:
  1. void CHDF_GUIDlg::OnOnCommMscomm1()   
  2. {  
  3.    
  4.     VARIANT variant_inp;  
  5.     COleSafeArray safearray_inp;  
  6.     static rxdata_len = 0;  
  7.     LONG len,k;  
  8.       
  9.     BYTE rxdata[500]; //设置BYTE数组 An 8-bit integerthat is not signed.  
  10.     CString strtemp;  
  11.       
  12.     if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符  
  13.           
  14.     { ////////以下你可以根据自己的通信协议加入处理代码  
  15.           
  16.         variant_inp=m_ctrlComm.GetInput(); //读缓冲区     
  17.         safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量  
  18.         len=safearray_inp.GetOneDimSize(); //得到有效数据长度  
  19.         for(k=0;k<len;k++)  
  20.             safearray_inp.GetElement(&k,rxdata+k+rxdata_len);//转换为BYTE型数组  
  21.         rxdata_len+=len;  
  22.         for(k=rxdata_len-len;k<rxdata_len;k++) //将数组转换为Cstring型变量         
  23.         {         
  24.             strtemp.Format("%.2x",rxdata[k]); //将字符送入临时变量strtemp存放    
  25.             m_strRXData+=strtemp; //加入接收编辑框对应字符串      
  26.         }  
  27.         m_strRXData+="\r\n";      
  28.         UpdateData(FALSE); //更新编辑框内容  
  29.       
  30. //对数据进行处理,如果大于设定字符长度6,则先处理前6个字符再接着处理余下字符
  31.         for(;rxdata_len>=6;)  //只要数据缓冲区数据大于6个字节,则进行一次处理
  32.         {  
  33.             if(0x58==rxdata[0]&&0x58!=rxdata[1]&&0x59==rxdata[5])//为真表示为数据开头  
  34.             {  
  35.                 unsigned char ucdata[4]={rxdata[1],rxdata[2],rxdata[3],rxdata[4]};  
  36.                 for(k=0;k<rxdata_len-6;k++)  
  37.                 {  
  38.                     rxdata[k]=rxdata[k+6];  
  39.                 }  
  40.                 rxdata_len-=6;  
  41.                 ProcessData(ucdata);//对收到的一帧可用数据进行处理,更新各个状态寄存器              }  
  42.             else 
  43.             {  
  44.                 for(k=0;k<rxdata_len-1;k++)  
  45.                 {  
  46.                     rxdata[k]=rxdata[k+1];  
  47.                 }  
  48.                 rxdata_len-=1;  
  49.             }  
  50.         }
  51.     }  

5.发送数据(为发送按钮添加函数)

为发送按钮添加一个单击函数,既BN_CLICKED,打开建立类向导,选中IDC_BUTTON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend( )函数,代码如下:

  1. void CSCommTestDlg::OnButtonManualsend()  
  2. {  
  3. // TODO: Add your control notification handler code here  
  4. UpdateData(TRUE); //读取编辑框内容  
  5. m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据  
  6. }  

6.串口调试

下载运行VSPM虚拟串口v2.65,一切按默认进行,运行后COM3和COM4串口相连。将自己的vc程序改成控制串口COM3。运行串口调试助手v2.2,选择串口COM4,调试串口之间的通信。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章