如何使用MScomm控件

来源:互联网 发布:mysql自动备份数据库 编辑:程序博客网 时间:2024/05/16 00:56

作者:flydream0

转自:http://blog.csdn.net/flydream0/article/details/8029590


1:如果添加MSComm控件?

见:http://blog.csdn.net/flydream0/article/details/8002012

 

2:为对话框添加MSComm控件成员变量

右击MSComm控件,然后选择Add Variable...

 

3:为对话框添加OnComm事件

右击MSComm控件,然后选择Add Event Handle..

 

4:打开/关闭串口.

[cpp] view plaincopy
  1. void Ctbox_debug_viewDlg::OnBnClickedBtOpen()  
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.   
  5.     if(m_mscomm.get_PortOpen())  
  6.     {  
  7.         m_mscomm.put_PortOpen(FALSE);  
  8.         GetDlgItem(IDC_BT_OPEN)->SetWindowText(_T("打开"));  
  9.         ShowInfo(_T("关闭串口成功!"));  
  10.         m_OpenStatus =false;  
  11.         return;  
  12.     }  
  13.     UpdateData(TRUE);  
  14.     m_OpenStatus =true;  
  15.     //当前端口号  
  16.     m_mscomm.put_CommPort(m_Port+1);//端口号  
  17.     m_mscomm.put_InBufferSize(1024);//接收缓冲区   
  18.     m_mscomm.put_OutBufferSize(1024);//发送缓冲区   
  19.   
  20.     m_mscomm.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取     
  21.     m_mscomm.put_InputMode(1);//以二进制方式读写数据     
  22.     m_mscomm.put_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件     
  23.        
  24.        
  25.   
  26.     //波特率  
  27.     DWORD baudrate;  
  28.     switch(m_CombolBaudrate.GetCurSel())  
  29.     {  
  30.     case 0:  
  31.         baudrate =115200;  
  32.         break;  
  33.     case 1:  
  34.         baudrate =9600;  
  35.         break;  
  36.     default:  
  37.         ASSERT(FALSE);  
  38.         break;  
  39.     }  
  40.     CString setting;  
  41.     setting.Format(_T("%d,n,8,1"),baudrate);  
  42.     m_mscomm.put_Settings(setting/*_T("115200,n,8,1")*/);//波特率,无校验,8个数据位,1个停止1位  
  43.        
  44.     m_mscomm.put_PortOpen(TRUE);//打开串口    
  45.     GetDlgItem(IDC_BT_OPEN)->SetWindowText(_T("关闭"));  
  46.     ShowInfo(_T("打开串口成功!"));  
  47.    
  48. }  

5:接收串口数据

[cpp] view plaincopy
  1. void Ctbox_debug_viewDlg::OnCommMscomm1()  
  2. {  
  3.     // TODO: Add your message handler code here  
  4.     short curEvent =m_mscomm.get_CommEvent();  
  5.     switch(curEvent)  
  6.     {  
  7.     case CMscomm1::comEvReceive:  
  8.         EvReceiveHandle();  
  9.         break;  
  10.     }  
  11.       
  12. }  
[cpp] view plaincopy
  1. void Ctbox_debug_viewDlg::EvReceiveHandle(void)  
  2. {  
  3.     static unsigned int cnt=0;    
  4.     VARIANT variant_inp;    
  5.     COleSafeArray safearray_inp;    
  6.     long len,k;    
  7.     /*unsigned intdata[1024]={0};*/    
  8.     BYTE rxdata[1024];//设置BYTE数组  
  9.     CString strtemp;   
  10.   
  11.     cnt++;    
  12.     variant_inp= m_mscomm.get_Input();//读取缓冲区     
  13.     safearray_inp= variant_inp;//变量转换     
  14.     len= safearray_inp.GetOneDimSize();//得到有效的数据长度     
  15.       
  16.     for (k=0;k<len;k++)    
  17.     {    
  18.         safearray_inp.GetElement(&k,rxdata+k);    
  19.     }    
  20.     /*char c_char; */   
  21.     for (k=0;k<len;k++)    
  22.     {    
  23.         strtemp.Format(_T("%c"),*(rxdata+k));  
  24.         m_RecveString +=strtemp;   
  25.         if(*(rxdata+k) =='\n')  
  26.         {  
  27.             ShowInfoByFilter(m_RecveString);  
  28.             m_RecveString ="";  
  29.         }  
  30.     }  
  31. }  

6:发送串口数据

[cpp] view plaincopy
  1. void Ctbox_debug_viewDlg::OnBnClickedBtSend()  
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     if(m_OpenStatus ==false)  
  5.     {  
  6.         AfxMessageBox(_T("请先打开串口"));  
  7.         return;  
  8.     }  
  9.     UpdateData(TRUE);  
  10.     if(m_SendString.IsEmpty())  
  11.         return;  
  12.     if(m_AutoAddLF)  
  13.     {  
  14.         m_SendString +="\r\n";  
  15.     }  
  16.     m_mscomm.put_Output(COleVariant(m_SendString));  
  17.     ShowInfo(m_SendString);  
  18. }  



原创粉丝点击