在单文档MFC程序中实现MSComm控件串口编程

  在单文档MFC程序中实现MSComm控件串口编程

 

以前自己曾在基于对话框的MFC程序中实现过如何使用微软提供的MSComm控件对串口进行读写操控编程方面做过的总结,或者说是参考李先勇的书,写过一个用串口接收GPRS数据并对其译码的程序,当时觉得串口编程很简单,所以也就没有多学,随着项目的结束,自己也就放弃了。

几个月之后,突然遇到一个项目需要用到串口编程,但是前期工程都是基于单文档的MFC编程,虽然我具体编程时可以在对话框中实现,但是数据就不能在文档类里直接操作,只能在使用对话框的时候才能操作串口。找来李先勇的书,讲的甚是简单,只说“如果视类不是基于CFormView的,那么······”照着在MainFrm中修改了些数据,但是还是不知道如何操作。后来参考了些网上资料后,整理出如下过程实现用MSComm控件对串口的读写控制编程。

 

1、  为程序添加MSComm控件资源

 

VC6中可以通过打开“Project->Add to Projcet->Components and Controls->Registered Active Controls”菜单项来选择Microsoft Communications ControlVersion6.0命令将MSComm控件插入到当前的程序中。

同样在VC7中,通过在工具箱中单击“添加/移除项”在弹出对话框中COM组件中把Microsoft Communications ControlVersion6.0项勾上按确定就可以了。

完成以上步骤后,就在工具箱中有了MSComm控件,将其拖到任何一个对话框中就可以实现添加MSComm控间资源的任务。假设我们将其命名为IDC_MSCOMM

 

2、  为控件资源创建MSComm的实例对象

 

由于文档没有初始化函数,所以我选择在ViewOnCreate函数中为IDC_MSCOMM创建实例化对象。具体就是在OnCreate函数中添加以下代码:

if (!m_Comm.Create(NULL,WS_VISIBLE|WS_CHILD,CRect(0,0,0,0),this,IDC_MSCOMM))

       {

              AfxMessageBox("创建串口失败!");

       }

       m_Comm.SetCommPort(m_nCom);//设置Com

       m_Comm.SetInBufferSize(1024);//设置输入缓冲区大小

       m_Comm.SetOutBufferSize(512);//设置输出缓冲区大小

       if (!m_Comm.GetPortOpen())

              m_Comm.SetPortOpen(TRUE);//如果串口没有打开则打开串口

       m_Comm.SetInputMode(1);//设置输入方式为二进制方式

       m_Comm.SetSettings("4800,n,8,1");//设置串口特征如波特率等

       m_Comm.SetRThreshold(1);//当接收一个字符就响应一个OnCom事件

       m_Comm.SetInputLen(0);//

 

3、  为控件资源添加相应的事件处理程序

 

本人在编程时需要串口接收的数据用在文档类中,所以在此步的操作为:右键IDC_MSCOMM添加事件处理程序,在类列表中选择doc类,IDE就会自动为你添加相应的绑定代码和OnComm函数,你只需在该函数中添加具体的你的实现代码就可以了。提供程序如下:

CArcMeasureView* pView =(CArcMeasureView*)((CMainFrame*)

((CArcMeasureApp*)AfxGetApp())->GetMainWnd())->GetActiveView(); //取得视图指针地址

       VARIANT m_input;

       char *str;

       int k,nEvent;

       CString str2,m_RevData;

       nEvent =pView->m_Comm.GetCommEvent();//获得事件类型

       switch(nEvent)

       {

              case 2: //如果接受到字符

                     k = pView->m_Comm.GetInBufferCount();

                     if (k>0)

                     {

                            m_input = pView->m_Comm.GetInput();

                            str = (char*)m_input.parray->pvData;

                            if (*str=='H')

                            {    

·········//处理程序

                            }

                     }

                     break

              ········

       }

当然假如你接收的数据要在View类里处理的话,那么比我以上代码还要简单,直接可以在以上类列表中选择View类即可。并在View类的OnComm函数中添加具体的代码。

 

4、  编写外围程序

 

串口编程肯定是通讯式的,故肯定还要编写一些发送数据之类的代码函数,以及改变串口参数的函数代码程序。在这里就不多做展开了。

另注:如果程序中需要切换串口的话的,那么先要把打开的串口关闭,然后再打开另外一个串口,如果新打开的串口属性设置与前一个一致,那么打开新串口时就不用再重新设置属性了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值