基于MFC-MSComm控件的PC与单片机串口通信编程

来源:互联网 发布:阿里钱盾软件 编辑:程序博客网 时间:2024/05/01 10:44

作者:uedsr542   来源:51hei 

 

使用工具Visual C++ 6.0,9针RS232串口线一条,P0口带上拉的LED的51最小系统版。

打开软件,新建——>MFC AppWizard[exe]再填写工程名和路径——>基于对话框(不需要太好看,对话框足矣)——>确定。

点击浏览下一页

最右边是可以添加的控件,但是我们可以看到没有MSCOMM控件,因为对于搞高级软件的程序员来说一般用不到的,所以串口不是默认控件,需要添加。

工程——>增加到工程——>Components and Controls会弹出一个叫做Components and Controls Gallery的对话框,打开Registered ActiveX Controls文件夹会看到很多可以添加的控件,找到Microsoft Communications Comtrol,version 6.0选项,单击Insert——>确定。跳出Confirm Classes对话框,这个不需要修改,直接点OK就好了,然后就可以看到控件已经加到空间框里了。

点击浏览下一页

这个电话状的就是MSComm控件,你可以右击这个图标点属性修改ID,当然也可以用默认的。再把编辑框和按钮等等拖到界面上,生成的就是最后界面的样子,所以可以随意搞(下图是我做的界面)

点击浏览下一页

再在对话框的头文件集中的×××Dlg.h(×××是你的文件名)的最开头添加mscomm头文件#include "mscomm.h"(如下图)

点击浏览下一页

然后找到对话框 类的定义代码中加入CMSComm类变量声明

class CxxxDlg.h : public CDialog

{

...

protected:

    CMSComm myComm;//(你也可以用其他的)

}

如下图

点击浏览下一页

接着在xxxDlg.cpp中所有函数外面添加全局变量(注意是全局),当然也可以不添加。

 

因为我做的比较简单,所以对于串口的选择并没有设置,直接是com1,,9600bps,0(无校验),8(位),1(停止位)当然这个都在程序中写入。并在点开exe文件之后就设置好了。这个只需在初始化函数CxxxDlg :: OnInitDialog()中写入以下程序即可。

DWORD style=WS_VISIBLE|WS_CHILD;
if(!myComm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1))
{
   AfxMessageBox("创建MSComm控件失败!");
   return -1;
}
else//创建成功则执行初始化及打开串口操作
{
   myComm.SetCommPort(1);//指定串口号
   myComm.SetSettings("9600,N,8,1");//通信参数设置
   myComm.SetInBufferSize(1024);//指定接收缓冲区大小
   myComm.SetInBufferCount(0);//清空接收缓冲区
   myComm.SetInputMode(1);//设置数据获取方式
   myComm.SetInputLen(0);//设置每次读取长度,0为全部读取
   myComm.SetRThreshold(2);//设置接收OnComm事件字符门限值在收到2字节时候触发事件
   myComm.SetPortOpen(1);//打开串口
}

这样就创建串口了,接下里就处理按键、显示和处理收发数据的事情了。

其做法和做普通的MFC一样就不赘述了,我介绍一下一些用到的MSComm控件的一些函数属性。

 

输入(串口接收)函数VARIANT GetInput();

例子:VARIANT int1;

   int1 = myComm.GetInput();

即可接收来自串口的数据,但是注意变量,想要显示就要转化。

 

输出(串口发送)函数void SetOutput(const VARIANT&newValue);

例子:CSting aa;

   aa="at";

   myComm.SetOutput(COleVariant(aa));

即可将数据写入输出缓冲区,COleVariant(aa)是将CString 转换为VARIANT类型数据。

 

关于串口事件CommEvent的属性就像单片机中的中断一样。只要串口有事件发生,就会去响应,当然必须设置响应的条件和方式。下图是事件发生时返回到CommEvent的值

点击浏览下一页

如果要添加处理方式就在xxxDlg.app中的void CxxxDlg :: OnOnCommMscomm1()

{

...

}

这个函数中添加。

 

最重要的是不要忘记使用完串口之后要关闭它。在界面按Ctrl+W弹出MFC ClassWizard类向导对话框

点击Object IDs列表中的xxxDlg再点Messages列表框中的WM_CLOSE单击Add Function单击Edit Code

就会跳到void CxxxDlg :: OnClose()函数在里面添加

if(myComm.GetPortOpen())
   myComm.SetPortOpen(0);
CDialog::OnClose();

即可。

这样一个串口通信的基本流程就做完了。当然如果你不喜欢MFC这三个正方体组成的图标你可以改,最简单的方法是找一张图转成ico格式的,将工程文件夹里res文件夹下的默认ico换掉,只要名字改成一样即可。

原创粉丝点击