在单文档
MFC
程序中实现
MSComm
控件串口编程
以前自己曾在基于对话框的MFC程序中实现过如何使用微软提供的MSComm控件对串口进行读写操控编程方面做过的总结,或者说是参考李先勇的书,写过一个用串口接收GPRS数据并对其译码的程序,当时觉得串口编程很简单,所以也就没有多学,随着项目的结束,自己也就放弃了。 几个月之后,突然遇到一个项目需要用到串口编程,但是前期工程都是基于单文档的MFC编程,虽然我具体编程时可以在对话框中实现,但是数据就不能在文档类里直接操作,只能在使用对话框的时候才能操作串口。找来李先勇的书,讲的甚是简单,只说“如果视类不是基于CFormView的,那么······”照着在MainFrm中修改了些数据,但是还是不知道如何操作。后来参考了些网上资料后,整理出如下过程实现用MSComm控件对串口的读写控制编程。
1、 为程序添加MSComm控件资源
在VC6中可以通过打开“Project->Add to Projcet->Components and Controls->Registered Active Controls”菜单项来选择Microsoft Communications Control,Version6.0命令将MSComm控件插入到当前的程序中。 同样在VC7中,通过在工具箱中单击“添加/移除项”在弹出对话框中COM组件中把Microsoft Communications Control,Version6.0项勾上按确定就可以了。 完成以上步骤后,就在工具箱中有了MSComm控件,将其拖到任何一个对话框中就可以实现添加MSComm控间资源的任务。假设我们将其命名为IDC_MSCOMM。
2、 为控件资源创建MSComm的实例对象
由于文档没有初始化函数,所以我选择在View的OnCreate函数中为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、 编写外围程序
串口编程肯定是通讯式的,故肯定还要编写一些发送数据之类的代码函数,以及改变串口参数的函数代码程序。在这里就不多做展开了。 另注:如果程序中需要切换串口的话的,那么先要把打开的串口关闭,然后再打开另外一个串口,如果新打开的串口属性设置与前一个一致,那么打开新串口时就不用再重新设置属性了。 |