首先,在 vs2008 环境下创建 MFC 运用程序

设置项目名称为 ComTest(这个地方随意命名,根据个人习惯),点击确定后,点击下一步
出现如下界面
选择“基于对话框”模式然后直接点击完成即可(其他选项按默认方式),点击完成后出现如下界面
解决资源管理器中自动给你生成好代码目录(可点击菜单栏“视图”选项打开解决方案资源管理器),如下图所示

我们再次回到对话框编辑窗口,删除自动生产的控件(静态文本控件、确定和取消按钮控件),并在工具箱里添加两个button按钮和编辑框,之后的界面如下图所示:
然后把最重要的串口通信控件加入到工具箱中,因为默认的工具箱是不带 MS 串口通信控件的。添加方法如下:在工具箱界面点击鼠标右键出现如下界面:
然后点击选择项出现如下界面,然后选择“COM 组件”

找到并选中该项

最后点击确定键,就成功添加 MS 串口通讯控件了,工具箱中就会出现串口控件图标了

我们吧串口控件添加到对话框里,位置随意,运行的时候是看不见的,所以最终界面是这样子的




下面开始添加变量,首先为IDC_MSCOMM1添加控制变量:m_ctrlComm,在串口通信图标上右键点击选择添加变量,如图:


完成就可以了,控件ID和类别是可以选的,下面为按钮和编辑框添加变量时选不同的就行了。
两个编辑框,一个用于接收显示数据ID设置为IDC_EDIT_RXDATA(在控件属性框里设置),另一个用于输入发送数据,ID设置为IDC_EDIT_TXDATA,两岸按钮,一个用于发送数据,将其ID设为IDC_BUTTON_MANUALSEND,另一个用于清空接收的编辑框,ID默认就行,不再赘述。

 接着添加变量,为IDC_EDIT_RXDATA添加CString变量m_strRXData, 为IDC_EDIT_TXDATA添加CString变量m_strTXData。说 明: m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。方法同上面添加串口控制变量一样,选择控件ID和类型即可,如图:


添加串口事件消息处理函数OnComm()
回到对话框编辑界面,鼠标左键点击串口控件按钮,然后在对应的属性栏,点击闪电按钮(控件事件)

添加串口事件消息处理函数,并将函数名改为OnComm,在上图中所示位置改就行。
我们在OnComm()函数加入相 应的处理代码就能实现自已想要的功能了。请你在函数中加入如下代码:

void CSCommDlg::OnComm()
{
// TODO: 在此处添加消息处理程序代码
VARIANT variant_inp;     
COleSafeArray safearray_inp;     
LONG len,k;    
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.     
CString strtemp;     
if(m_ctrlComm.get_CommEvent()==2) //事件值为2表示接收缓冲区内有字符     
{            
 ////////以下你可以根据自己的通信协议加入处理代码 
        variant_inp=m_ctrlComm.get_Input(); //读缓冲区  
        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_strRXData+=strtemp; //加入接收编辑框对应字符串      
       }
   }     
   UpdateData(FALSE); //更新编辑框内容 
}


打开串口和设置串口参数 
你可以在你需要的时候打开串口,例如在程序中做一个开始按钮,在该按钮的处理函数中打开串口。现在我们在主对话框的CSCommTestDlg::OnInitDialog()打开串口,找到//
TODO: Add extra initialization here,并在下面加入如下代码:  

// TODO: 在此添加额外的初始化代码
m_ctrlComm.put_CommPort(5);
//选择串口号5(笔记本没有串口,用的虚拟串口,可以使用软件vspd创建)
m_ctrlComm.put_PortOpen(TRUE);
//打开串口
m_ctrlComm.put_RThreshold(2);
//收到两个字节引发OnComm事件
m_ctrlComm.put_InputMode(1);
//输入模式选为二进制
m_ctrlComm.put_Settings(_T("9600,n,8,1"));
//设置串口参数,波特率,无奇偶校验,位停止位,位数据位
m_ctrlComm.put_InputMode(1);  // 以二进制方式检取数据 
m_ctrlComm.put_RThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件 
m_ctrlComm.put_InputLen(0); //设置当前接收区数据长度为0 
m_ctrlComm.get_Input();//先预读缓冲区以清除残留数据  

发送数据
先为发送按钮添加一个单击消息即BN_CLICKED处理函数,方法和串口事件控制函数的添加方法一样(只不过是在实践中的OnBnClickedButtonManualsend里添加),不再赘述,在函数中添加如下代码:

// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);  //读取编辑框内容
m_ctrlComm.put_Output(COleVariant(m_strTXData)); //发送数据

运行程序,在发送编辑框中随意输入点什么,单击发送按钮,这时候在另一端的串口调试助手(或别的调试工具)接收框里就会有数据出现啦。

最后那个“清除接收框”的按钮还没有用到,为它添加点击触发时间,在函数里添加如下代码即可:
void CSCommDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
m_strRXData="";
UpdateData(FALSE);
}
这样简单的串口通信就基本完成了。

VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程的更多相关文章

  1. VS2015编写的MFC上位机,波特率可调,可动态显示曲线,可显示三维

    VS2015编写的MFC上位机,波特率可调,可动态显示曲线,可显示三维 2016年01月14日 11:40:28 博博有个大大大的Dream 阅读数:9375   版权声明:本文为博主原创文章,未经博 ...

  2. VS中基于对话框的MFC利用换肤改变边框颜色及格式

    第一版本: http://ishare.iask.sina.com.cn/f/13836420.html?from=like 2. http://www.cnblogs.com/phinecos/ar ...

  3. 基于对话框的MFC应用程序基本结构

    新建一个基于对话框的MFC应用程序,假设命名为 Test:则该应用程序在刚创建的时候,有4个非常重要的文件和3个类: 4个非常重要的文件 1.Test.h 2.Test.cpp (应用程序类头文件) ...

  4. 如何在VS2010的VC++ 基于对话框的MFC程序中添加菜单

    方法1:亲测 成功  转载自https://social.msdn.microsoft.com/Forums/vstudio/zh-CN/48338f6b-e5d9-4c0c-8b17-05ca3ef ...

  5. C#上位机串口控制12864显示

    实现的效果 上面是用Proteus仿真的,,对了如果自己想用proteus仿真需要安装下面这个软件 再看一下实物显示效果 先做上位机部分........... 为了程序一启动就把电脑上能用的串口号显示 ...

  6. ROS常用库(二) Serial库(单片机和上位机串口通讯)

    比如我们做了个单片机,在win里面用串口调试助手接收和下发数据,那么在ubuntu里用ros怎么实现?换个说法,怎么实现上位机和下位机的通讯? 首先,用python自带的库就可以实现这个功能. 安装p ...

  7. 14-ESP8266 SDK开发基础入门篇--上位机串口控制 Wi-Fi输出PWM的占空比,调节LED亮度,8266程序编写

    https://www.cnblogs.com/yangfengwu/p/11102026.html 首先规定下协议  ,CRC16就不加了哈,最后我会附上CRC16的计算程序,大家有兴趣自己加上 上 ...

  8. 13-ESP8266 SDK开发基础入门篇--上位机串口控制 Wi-Fi输出PWM的占空比,IEEE754规约

    https://www.cnblogs.com/yangfengwu/p/11100552.html 这节做个上位机控制Wi-Fi引脚输出的PWM占空比信号,灯的亮度就可以用上位机控制了 大家可以自己 ...

  9. 【安富莱专题教程第4期】SEGGER的J-Scope波形上位机软件,HSS模式简单易用,无需额外资源,也不需要写目标板代码

    说明:1.在实际项目中,很多时候,我们需要将传感器或者ADC的数值以波形的形式显示.通常的解决办法是用串口上位机,USB接口上位机或者MDK的逻辑分析仪功能,使用这三种方式都比较繁琐.本期专题为大家讲 ...

随机推荐

  1. Android -- 关闭AsyncTask(异步任务)

    前面说了如何操作AsyncTask,这篇我们来说一下如何关闭AsyncTask. 有人就问了:为什么要关闭AsyncTask呢?很简单,AsyncTask 是在后台执行耗时操作(获取数据),当你离开当 ...

  2. Enterprise Architect 学习 之 用例图

    用例模型 用例模型用来记录系统的需求,它提供系统与用户及其他参与者的一种通信手段. 执行者 用例图显示了系统和系统外实体之间的交互.这些实体被引用为执行者.执行者代表角色,可以包括:用户,外部硬件和其 ...

  3. android基础(五)网络数据解析方法

    在网络上传输数据时最常用的方法有两种:XML和JSON,下面就对这两种类型的数据解析进行讲解. 一.XML数据解析 在Android中,常见的XML解析器分别为SAX解析器.DOM解析器和PULL解析 ...

  4. web兼容行探究1:IE 6 select节点显示在绝对布局之上的解决方法

    解决方式就是在绝对布局的元素下放置一个一样大小的iframe元素,这样iframe可以将select盖住,同时解决了问题. 源码如下: <!-- IE6BUG select在絕對定位的元素之上顯 ...

  5. hdu1000,hdu1001,hdu1002,hdu1003

    hdu1000 仅仅是为了纪念 #include <cstdio> int main() { int a,b; while (scanf("%d%d",&a,& ...

  6. JavaScript数据属性与访问器属性

    ES5中对象的属性可以分为‘数据属性’和‘访问器属性’两种. 数据属性一般用于存储数据数值,访问器属性对应的是set/get操作,不能直接存储数据值. 数据属性特性:value.writable.en ...

  7. java 消息机制 ActiveMQ入门实例

    1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 我下载的时候是 ActiveMQ 5.14.0 Release版 2.运行ActiveMQ 解压缩ap ...

  8. [.NET] 自己实现任务池(模仿线程池)

    线程池虽然好用,但限制也不少: (1)总觉得默认的 MaxThread 小了一点,每次使用都要手工调大= = (2)任务不能等待完成 (3)任务一旦加入不能取消,甚至不知道是正在排队/正在执行/执行完 ...

  9. 1.3 PROGRAM DEVELOPMENT ENVIRONMENT

    1.3 PROGRAM DEVELOPMENT ENVIRONMENT 1.4 WIN32 EXECUTEABLE FILE FORMAT We should also know that compl ...

  10. Flex box弹性布局 及 响应式前端设计的优化

    Flex box弹性布局 Flex box是CSS3新添加的一种模型属性,它的出现有力的打破了我们常常使用的浮动布局.实现垂直等高.水平均分.按比例划分,可以实现许多我们之前做不到的自适应布局.如果你 ...