作者: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换掉,只要名字改成一样即可。