利用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( )函数中写如串口初始化代码
- BOOL CSCommTestDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- 。。。
- if(m_ctrlComm.GetPortOpen())
- m_ctrlComm.SetPortOpen(FALSE);
- m_ctrlComm.SetCommPort(1); //选择com1
- if(!m_ctrlComm.GetPortOpen())
- m_ctrlComm.SetPortOpen(TRUE);//打开串口
- else
- AfxMessageBox("cannot open serial port");
- m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位
- m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据
- m_ctrlComm.SetRThreshold(1);
- //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
- m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
- m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
- return TRUE; // return TRUE unless you set the focus to a control
- }
4、添加串口事件处理函数OnComm( )
将控件拖至页面中,对其添加消息函数,代码如下:
- void CHDF_GUIDlg::OnOnCommMscomm1()
- {
- VARIANT variant_inp;
- COleSafeArray safearray_inp;
- static rxdata_len = 0;
- LONG len,k;
- BYTE rxdata[500]; //设置BYTE数组 An 8-bit integerthat is not signed.
- CString strtemp;
- if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
- { ////////以下你可以根据自己的通信协议加入处理代码
- variant_inp=m_ctrlComm.GetInput(); //读缓冲区
- safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
- len=safearray_inp.GetOneDimSize(); //得到有效数据长度
- for(k=0;k<len;k++)
- safearray_inp.GetElement(&k,rxdata+k+rxdata_len);//转换为BYTE型数组
- rxdata_len+=len;
- for(k=rxdata_len-len;k<rxdata_len;k++) //将数组转换为Cstring型变量
- {
- strtemp.Format("%.2x",rxdata[k]); //将字符送入临时变量strtemp存放
- m_strRXData+=strtemp; //加入接收编辑框对应字符串
- }
- m_strRXData+="\r\n";
- UpdateData(FALSE); //更新编辑框内容
- //对数据进行处理,如果大于设定字符长度6,则先处理前6个字符再接着处理余下字符
- for(;rxdata_len>=6;) //只要数据缓冲区数据大于6个字节,则进行一次处理
- {
- if(0x58==rxdata[0]&&0x58!=rxdata[1]&&0x59==rxdata[5])//为真表示为数据开头
- {
- unsigned char ucdata[4]={rxdata[1],rxdata[2],rxdata[3],rxdata[4]};
- for(k=0;k<rxdata_len-6;k++)
- {
- rxdata[k]=rxdata[k+6];
- }
- rxdata_len-=6;
- ProcessData(ucdata);//对收到的一帧可用数据进行处理,更新各个状态寄存器 }
- else
- {
- for(k=0;k<rxdata_len-1;k++)
- {
- rxdata[k]=rxdata[k+1];
- }
- rxdata_len-=1;
- }
- }
- }
- }
5.发送数据(为发送按钮添加函数)
为发送按钮添加一个单击函数,既BN_CLICKED,打开建立类向导,选中IDC_BUTTON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend( )函数,代码如下:
- void CSCommTestDlg::OnButtonManualsend()
- {
- // TODO: Add your control notification handler code here
- UpdateData(TRUE); //读取编辑框内容
- m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据
- }
6.串口调试
下载运行VSPM虚拟串口v2.65,一切按默认进行,运行后COM3和COM4串口相连。将自己的vc程序改成控制串口COM3。运行串口调试助手v2.2,选择串口COM4,调试串口之间的通信。