综述:之前没有进行过MFC的使用,今天就来进行一个简单的MFC入门:串口通信。相信大家都用过串口调试工具,今天我们就来自己写一写。
一、建立MFC程序
建立一个MFC应用程序
选择基于对话框,其他默认。
二、界面设置
界面设置如下:
在这里我用了2个Group Box当框架,修改caption就可以直接改显示的标题,然后在这2个Group Box里面添加了Edit Control,vertical Scroll 设置滚动框。2个下拉框Combo Box,上面可以加一个Static Text进行说明,后面还有4个Button最后就是最重要的一个控件MSComm控件。可以右键插入ActiveX控件。
三、MSComm控件
这个控件Microsoft Communications Control,version 6.0(SP6),如果没有的话就手动安装。
http://xiazai.zol.com.cn/detail/47/468794.shtml
https://www.ocxme.com/files/mscomm32_ocx
mscomm32.ocx在这个网站上能够下载。下完解压后就是MSCOMM32.OCX,把它放在C:\Windows\system32目录。这个文件下就有cmd.exe,直接右键管理员权限打开cmd窗口,输入指令regsvr32 MSCOMM32.OCX即可,然后会弹出注册成功。
网上有些教程还有一步是修改注册表,不过我发现regsvr32命令已经修改了注册表,无需手动修改。
四、参数以及代码设计
首先肯定是添加变量的,可以直接点Edit Control,然后右键添加变量,当然也可以直接写。
CString e_editReceive;
CString e_editSend;
CComboBox e_combo1;
CComboBox e_combo2;
CMscomm1 e_mscomm1;
我是这样定义的。然后就是实现我需要的这4个功能:打开串口,发送数据,清除数据,退出。双击button跳转之后就可以直接写代码。
打开串口代码如下:
void CsortDlg::OnBnClickedButtonOpen() //打开串口
{
// TODO: 在此添加控件通知处理程序代码
CString str,str1,n;
GetDlgItemText(IDC_BUTTON_Open,str);
CWnd *h1;
h1 = GetDlgItem(IDC_BUTTON_Open); //指向控件的caption
if(!e_mscomm1.get_PortOpen())
{
e_combo2.GetLBText(e_combo1.GetCurSel(),str1); //取得所选字符串放在str1里面
str1 = str1+','+'n'+','+'8'+','+'1'; //
e_mscomm1.put_CommPort(e_combo1.GetCurSel()+1); //选择串口
e_mscomm1.put_InputMode(1); //二进制
e_mscomm1.put_Settings(str1); //参数“波特率,n,8,1”
e_mscomm1.put_InputLen(1024); //设置并返回Input属性从接收缓冲区读取的1024个字符
e_mscomm1.put_RThreshold(1); //接收缓冲区收到一个字符就会使得CMSComm控件产生OnComm消息
e_mscomm1.put_RTSEnable(1); //确定RTS是否有效,请示允许发送数据
e_mscomm1.put_PortOpen(true);
if(e_mscomm1.get_PortOpen())
{
str = _T("关闭串口");
UpdateData(true);
h1->SetWindowText(str);
}
else
{
e_mscomm1.put_PortOpen(false);
if(str != _T("打开串口"))
{
str = _T("打开串口");
UpdateData(true);
h1->SetWindowText(str);
}
}
}
}
发送数据代码如下:
void CsortDlg::OnBnClickedButtonSend()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
e_mscomm1.put_Output(COleVariant(e_editSend));
}
清除数据代码如下:
void CsortDlg::OnBnClickedButtonClear()
{
// TODO: 在此添加控件通知处理程序代码
e_editReceive = _T("");
UpdateData(false);
}
退出代码如下:
void CsortDlg::OnBnClickedButtonQuit()
{
// TODO: 在此添加控件通知处理程序代码
if(e_mscomm1.get_PortOpen())
e_mscomm1.put_PortOpen(false);
CDialogEx:OnCancel();
}
在前面BOOL CsortDlg::OnInitDialog()的初始化里面添加额外的代码:
//串口选择组合框
CString str;
int i;
for(i=0;i<15;i++)
{
str.Format(_T("com %d"),i+1);
e_combo1.InsertString(i,str);
}
e_combo1.SetCurSel(0);
//波特率选择组合框
CString str1[]={_T("300"),_T("600"),_T("1200"),_T("2400"),_T("4800"),_T("9600"),
_T("19200"),_T("38400"),_T("43000"),_T("56000"),_T("57600"),_T("115200")};
for(int i=0;i<12;i++)
{
int judge_tf = e_combo2.AddString(str1[i]);
if((judge_tf == CB_ERR) || (judge_tf == CB_ERRSPACE))
MessageBox(_T("build baud error!"));
}
e_combo2.SetCurSel(5);
这就是2个下拉框的初始化。最后就是MSComm控件,右键添加事件处理程序。
void CsortDlg::OnCommMscomm1()
{
// TODO: 在此处添加消息处理程序代码
if(e_mscomm1.get_CommEvent()==2)
{
char str[1024]={0};
long k;
VARIANT InputData=e_mscomm1.get_Input();
COleSafeArray fs;
fs = InputData;
for(k=0;k<fs.GetOneDimSize();k++)
fs.GetElement(&k,str+k);
e_editReceive+=str;
UpdateData(false);
}
}
一个基本的串口通信就写好了。