MFC 串口编程详细教程 图文并茂
本人之前从未接触MFC编程,由于项目需要,所以上网查阅了相关资料,并实现了上位机串口通信。由于网上的资料还不够详细,本人决定写一个图文并茂的详细教程。因为本人只是初学,如有错误,欢迎指点。
开发环境是:VC 6.0
串口编程方法:32位控件
参考资料:http://leadtheway.iteye.com/blog/705760
第一步:建工程
运行VC 6.0,文件-〉新建,选择MFC AppWizard(exe) ,工程名称:CommTest。确定
进入MFC应用程序向导-步骤1
选择基本对话框,其他的都默认,所以可以直接点击完成。
这样工程就建立完毕。
第二步:控件布局与设置
工程建立后,出现如下对话框:
删除上面的一个静态文本和两个按钮。从控件工具栏拖入两个静态文本,两个编辑框,两个按钮和一个组框。如果没有控件工具栏,可以鼠标右键点击菜单栏空白处,选择控件。布局后的效果:
接下来开始设置显示的文字和ID号。
选中按钮1,右键-〉属性。ID号设为IDC_BtnOpen,标题为打开。用于打开串口
选中按钮2,右键-〉属性。ID号设为IDC_BtnSend,标题为发送。用于发送数据。
选择第一个编辑框,右键-〉属性,更改ID为IDC_EditRxData,用于显示接收的数据。
同理选择第二个编辑框,更改ID为IDC_EditTxData。用于输入待发送的数据。
分别选中静态文本和组框,更改标题,不需要更改ID号。
最终效果如下:
现在先编译运行一次,避免出现错误而影响到后面的操作。
接下来这一步是关键的一步:
在对话框中鼠标右键-〉选中插入ActiveX控件。选择Microsoft Communication Control,ver……(后面的字母没看到)。确定
这时出现了一个电话的控件,右键该控件-〉选择类向导……,出现如下对话框:
先设置每个控件的变量,选择Member Variables,选择IDC_BtnOpen,然后Add Variable。
设置变量名为m_BtnOpen,名称与ID号相似只是为了方便记忆,可随便定义。其他默认。同理添加其他控件的变量,在添加MSCOMM1的变量时,会出现提示,选择“是”。
添加完毕后:
变量添加完毕后选回Message Maps,选择IDC_BtnOpen->BN_CLICKED->Add Function,默认函数名就好了,OK。
同理分别添加IDC_BtnSend->BN_CLICKED函数和IDC_MSCOMM1->OnComm函数。确定。
编译运行,避免有错误。如果出错,详细检查有没有误操作。一般不会出错的。
第三步:添加代码
选择左边信息栏的File View,双击打开CommTestDlg.cpp,在文件尾部可以看到刚刚添加的三个函数。
在OnBtnOpen()函数添加代码:
void CCommTestDlg::OnBtnOpen()
{
// TODO: Add your control notification handler code here
if(m_Comm1.GetPortOpen())
m_Comm1.SetPortOpen(FALSE);
m_Comm1.SetCommPort(1); //选择com1,可根据具体情况更改
m_Comm1.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
m_Comm1.SetOutBufferSize(1024); //设置输入缓冲区的大小,Bytes//
m_Comm1.SetSettings(“9600,n,8,1”); //波特率9600,无校验,8个数据位,1个停止位
m_Comm1.SetInputMode(1); //1:表示以二进制方式检取数据
m_Comm1.SetRThreshold(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_Comm1.SetInputLen(0); //设置当前接收区数据长度为0
if( !m_Comm1.GetPortOpen())
m_Comm1.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox(“cannot open serial port”);
m_Comm1.GetInput();//先预读缓冲区以清除残留数据
UpdateData(false);
}
编译运行。
在OnOnCommMscomm1()函数添加代码:
void CCommTestDlg::OnOnCommMscomm1()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_Comm1.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ 以下你可以根据自己的通信协议加入处理代码
variant_inp=m_Comm1.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format(“%c”,bt); //将字符送入临时变量strtemp存放
m_EditRxData+=strtemp; //加入接收编辑框对应字符串
}
}
//UpdateData(FALSE); //更新编辑框内容
SetDlgItemText(IDC_EditRxData,m_EditRxData);//不使用UpdateData(FALSE);的原因是该函数会
//刷新整个对话框的数据,而SetDlgItemText()
//只更新接收编辑框的数据。
}
现在可以接上串口做测试了。我是用单片机做串口发送,上位机做串口接收。单片机持续发送字符’ D ‘.上位机正常接收:
接着添加发送功能,
void CCommTestDlg::OnBtnSend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //读取编辑框内容
m_Comm1.SetOutput(COleVariant(m_EditTxData));//发送数据
}
发送大写字母N,在单片机用LED显示。‘N’对应的ASCII码的二进制是0100 1110。实物结果如图:
由于晚上灯光不足,拍出来效果不明显。懂单片机的童鞋应该能看明白。
本教程仅仅实现非常简单的串口收发功能。在数据显示,串口参数选择等功能都没实现,问问谷歌度娘都能找到你要的答案。
MFC 串口编程详细教程 图文并茂相关推荐
- C++模板元编程详细教程(之五)
前序文章请看: C++模板元编程详细教程(之一) C++模板元编程详细教程(之二) C++模板元编程详细教程(之三) C++模板元编程详细教程(之四) STL中提供的工具 从这一篇开始,我们将正式介绍 ...
- MFC 串口编程实例
MFC 串口编程实例 VC串口编程从实现方法上一般分为两种,一种使用MSCOMM控件,这种方法比较简单,软件的移植性较低,在这里介绍一种串口封装类的使用方法. 代码 先看代码 CommUtils.cp ...
- 基于MFC串口编程和曲线图绘制(visual studio2008,Teechart绘图控件)的程序总结
前言 今年刚进入公司按经理的要求为底盘测控机写了一个小小的console.这也是第一次教认真的完成整个程序的编写.程序不大,所用技术比较基础也不前卫,属于初级程序员的练手程序(知识的整理和搬运).虽然 ...
- 电脑配置虚拟串口的详细教程
1:网上下载vspd.exe软件,安装模拟串口软件: 2:安装好后会出现下框中的串口: 端口1选择COM10,端口2选择COM11后,点添加端口. 端口1选择COM12,端口2选择COM13后,点添加 ...
- C#编写串口程序(详细教程)
https://wenku.baidu.com/view/8c6822f9a0116c175e0e4823.html
- MFC COMBO-BOX最详细教程
找了好多,这是讲的最清楚的,与大家共享! 转:https://blog.csdn.net/fym0121/article/details/7515862 当你只需从一列对象中选出一个时,使用COMBO ...
- MFC串口调试工具教程
MFC串口调试软件教程 一.测试环境:Windows XP,VC++6.0 二.步骤 Step1:打开VC++6.0集成开发环境,新建基于对话框(Dialog based)的MFCAppWizard( ...
- C——Linux下的串口编程
原 C--Linux下的串口编程 2017年06月06日 19:30:50 C_Aya 阅读数:11537 <span class="tags-box artic-tag-box&qu ...
- 今天用Java开发主机IP扫描神器,零基础Socket编程详细
目录 一.开发背景 二.准备工作 三.远程主机 IP 探测 四.核心算法 1.IP地址转化为十进制数 2.十进制数转化为IP地址 五.主机 IP 扫描神器界面 六.各功能代码及IP扫描演示 1.主机扫 ...
最新文章
- python三国演义人物出场统计_python爬取三国演义文本
- Kotlin on Android 开发环境介绍
- 控制是否展示_非线性控制(四)描述函数法
- Python文件夹与文件的操作
- 在Visual Studio Code里进行Java开发
- HMTL label标签
- Linux学习系列之Linux入门(一)linux安装与入门
- jquery select css样式,css配合jquery美化 select
- 上传图片插件鼠标手cursor:pointer;不生效
- 云计算具有什么平台_如何搭建自己的云计算平台?
- [转帖] Windows 与linux的栈大小问题
- 7-9 主从复制常见问题
- 关于VLAN的几种接口模式
- 堆栈的区别linux C,uClinux堆栈
- SW2016启动界面闪退、激活工具不出现All done! Enjoy!
- 做得好 vs 做得快?
- html做键盘,用html+js+css做一个模拟键盘
- 计算机房通气换气次数,地下制冷机房,水泵房,配电房的排风量按多少换气次数计算...
- OSChina 周三乱弹 ——身为同事就要互相伤害么?
- 使用亚马逊云免费搭建自己的域名
热门文章
- 51nod 1240 莫比乌斯函数
- 区块链世界的“基建”之问——为行业的“黄金十年”做好准备了么?
- JS 去除输入框里面空格、英文字符、换行符
- 电脑d盘不见了怎么恢复?等你来发现!
- LE SMP加密算法设计和实现(python)
- 一文搞懂 checkpoint 全过程
- 2021-08-01-DJ-012 Django 路由的解析方式 path,repath
- Python统计文件字母出现次数(字典形式返回结果)
- 《贵州省大数据发展报告(2016)》白皮书发布
- JavaScript对象——数学对象