版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/kangshuaibing/article/details/84631698

由于项目需要,最近在写一个简单的串口通信,基于MFC框架,写完之后特此回顾记录一下学习的过程:

串口通信主体框架
(1) 初始化界面(自动获取全部可用串口)
(2) 打开串口 (读取串口号,初始化串口参数(波特率、校验位、数据位等),若串口已经打开则关闭串口)
(3) 发送数据 (更新控件状态,进入MSComm事件驱动函数,读缓冲区,数据转换,更新编辑框成员函数,更新编辑框内容)
(4) 退出界面 (检测串口是否开启,若开启则关闭串口,再进行退出)

  • 在MFC中建立对话框的基础上,添加两个控件CComBox和Button控件,CComBox负责扫描所有可用串口,Button用于打开和关闭串口,然后右键鼠标,点击插入ActiveX控件,选择控件,出现如控件(电话图标),则表示插入控件成功

  • 给控件添加变量,变量名为m_mscom,之后项目中会出现对应.h和.cpp文件

  • 加Eidit Control控件用于接受消息,绑定变量m_EditReveive,然后添加串口控件事件处理处理程序

点击添加编辑按钮(第一次添加会是添加编辑,再次添加的话会是编辑代码按钮),会出现如下代码:

void CCommTestDlg::OnCommMscomm2()
{
    // TODO: 在此处添加消息处理程序代码

}

添加自动接收代码(项目中通信协议是测试结果自动上传),并直接显示在接收控件中,代码如下:

  1. void CComCommunicateDlg::OnCommMscomm2() //事件驱动
  2. {
  3. if (m_mscom.get_CommEvent() == 2) //事件值为2表示接收缓冲区内有字符
  4. {
  5. char str[1024] = { 0 };
  6. long k;
  7. VARIANT InputData = m_mscom.get_Input(); //读缓冲区
  8. COleSafeArray fs;
  9. fs = InputData; //VARIANT型变量转换为COleSafeArray型变量
  10. for (k = 0; k<fs.GetOneDimSize(); k++)
  11. fs.GetElement(&k, str + k); //转换为BYTE型数组
  12. m_EditReveive += str; // 接收到编辑框里面
  13. //SetTimer(1,10,NULL); //延时10ms
  14. UpdateData(false); //更新到控件
  15. }
  16. }
  • 由于项目比较简单,就将串口参数写死了,若想修改参数可以在源代码里修改,打开/关闭串口代码实现如下:
  1. void CComCommunicateDlg::OnBnClickedButtonOpen() //打开串口按钮
  2. {
  3. CString str, n; //定义字符串
  4. GetDlgItemText(IDC_BUTTON_OPEN, str); //获取给定控件的文本
  5. CWnd *h1;
  6. h1 = GetDlgItem(IDC_BUTTON_OPEN); //指向控件的caption
  7. if (!m_mscom.get_PortOpen())
  8. {
  9. try
  10. {
  11. m_mscom.put_CommPort(num); //选择串口
  12. }
  13. catch (CException* e)
  14. {
  15. m_mscom.put_OutBufferCount(0);
  16. AfxMessageBox(L"打开串口 失败");
  17. return;
  18. }
  19. m_mscom.put_InputMode(1); //设置输入方式为二进制方式
  20. m_mscom.put_Settings(_T("115200,n,8,1")); //设置串口参数,波特率,无奇偶校验,位停止位,位数据位
  21. m_mscom.put_InputLen(1024); //设置当前接收区数据长度为1024
  22. m_mscom.put_RThreshold(1); //接收缓冲区有1个及1个以上字符时,触发OnComm事件
  23. m_mscom.put_RTSEnable(1); //设置RT允许
  24. m_mscom.put_PortOpen(true); //打开串口
  25. if (m_mscom.get_PortOpen())
  26. {
  27. str = _T("关闭串口");
  28. UpdateData(true);
  29. h1->SetWindowText(str); //改变按钮名称为‘’关闭串口”
  30. }
  31. }
  32. else
  33. {
  34. m_mscom.put_PortOpen(false); //关闭串口
  35. if (str != _T("打开串口"))
  36. {
  37. str = _T("打开串口");
  38. UpdateData(true); //将控件的状态传给其关联的变量
  39. h1->SetWindowText(str); //改变按钮名称为打开串口
  40. }
  41. }
  42. }
  • 最后是选择串口下拉框,起初用的比较笨的方法,添加在ComBox添加1-8个串口,然后到设备管理器中查看串口信息,再打开串口。后来改用自动扫描已打开端口号,其功能封装在GetCom()函数里,在初始化的时候运行即可。代码如下
  1. void CComCommunicateDlg::GetCom()
  2. {
  3. //程序启动时获取全部可用串口
  4. HANDLE hCom;
  5. int i, k;
  6. CString str;
  7. BOOL flag;
  8. ((CComboBox *)GetDlgItem(IDC_COMBO1))->ResetContent();
  9. flag = FALSE;
  10. num = 0;
  11. for (i = 1; i <= 16; i++)
  12. {//此程序支持16个串口
  13. str.Format(L"\\\\.\\COM%d", i);
  14. hCom = CreateFile(str, 0, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  15. if (INVALID_HANDLE_VALUE != hCom)
  16. {//能打开该串口,则添加该串口
  17. CloseHandle(hCom);
  18. str = str.Mid(4);
  19. ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString(str);
  20. if (flag == FALSE)
  21. {
  22. flag = TRUE;
  23. num = i;
  24. }
  25. }
  26. }
  27. i = ((CComboBox *)GetDlgItem(IDC_COMBO1))->GetCount();
  28. if (i == 0)
  29. {//若找不到可用串口则禁用“打开串口”功能
  30. ((CComboBox *)GetDlgItem(IDC_COMBO1))->EnableWindow(FALSE);
  31. }
  32. else
  33. {
  34. k = ((CComboBox *)GetDlgItem((IDC_COMBO1)))->GetCount();
  35. ((CComboBox *)GetDlgItem(IDC_COMBO1))->SetCurSel(k - 1);
  36. //mCom.BindCommPort(num);
  37. }
  38. }
  • 最终软件运行页面,串口通信消息的发送暂时没有用到,以后用到了再进行记录

MFC串口通信(二)——使用MSComm控件实现串口通信相关推荐

  1. MFC使用mscomm控件实现plc通信

    废话不多说,直入主题! 我们的mscomm控件实现plc通信,主要分三步走: (一)mscomm控件下载,注册 (1)可以百度搜索下载mscomm控件 (2)如果觉得麻烦可以在我上传的资源处下载,地址 ...

  2. 利用MSCOMM控件通过串口MODEN实现来电显示-c# source code

    利用MSCOMM控件通过串口MODEN实现来电显示-c# source code 注:此代码都已调试通过 处理方式 MSComm控件提供了两种处理通信的方式:一种为事件驱动方式,该方式相当于一般程序设 ...

  3. VS2008下用MFC 的MSComm控件编写串口程序

    可以在:http://download.csdn.net/detail/plutus_lee/4525446 下载详细文档. 首先感谢网络资源吧,作为一个自动化专业出身的,不懂串口实在让我有点无奈,本 ...

  4. Windows串口通信有关的MSComm控件

    问题描述:一般单片机.ARM.FPGA一类的板子基本都会带有RS232串口,因为协议简单,而且成熟,有许多现成的东西可以借鉴使用.在上位机通过串口获取下位机传来的信息或数据,Windows下一般有(1 ...

  5. vc2010串口通信(使用mscomm控件)

    1.下载mscomm控件: (下载地址:http://download.csdn.net/detail/tianhen791/4023983) 2.安装注册控件:下载完成后解压->点击setup ...

  6. 在 Wi ndows,MSComm控件在中文Wi的ndows下的通信问题与处理方法.doc

    MSComm控件在中文Wi的ndows下的通信问题与处理方法 MSComm控件在中文Windows下的通信问题与处理方法 摘 要VB 5.0/6.0的MSComm通信控件提供了一系列标准通信命令的接口 ...

  7. 《MSComm控件小结》

    一:在Visual C++ 6.0集成开发环境下,可以通过三种方法实现串口通信 1)运用MFC函数进行编程实现串口通信 2)运用MSComm控件进行编程实现串口通信 3)运用VC++运行库函数实现串口 ...

  8. VC++ 6.0之MSComm控件安装、使用

    Visual C++为我们提供了一种好用的ActiveX控件Microsoft Communications Control(即MSComm)来支持应用程序对串口的访问,在应用程序中插入MSComm控 ...

  9. MSComm控件的几个疑难问题汇总

    1.VARIANT和SAFEARRAY数据类型是什么鬼? 我们在使用MSComm控件时,在发送与接收数据时都要用到VARIANT数据类型.此外,SAFEARRAY (COLeSafeArray)数据变 ...

最新文章

  1. mysql修改表中某个字段的默认值
  2. 关于meta name=viewport content=width=device-width, initial-scale=1.0, maximum-scale=1.0, user-sc..
  3. scws sphinx mysql_Sphinx+Scws 搭建千万级准实时搜索应用场景详解
  4. load data详解
  5. netty系列之:Event、Handler和Pipeline
  6. unity, 内置shader下载地址
  7. Java面试题:Java垃圾收集有哪些算法,AQS组件总结
  8. (转) 数字加密货币全球资源汇总
  9. codeblocks下载安装教程
  10. 直方图与直方图均衡化
  11. totolinkn200up怎么设置_TOTOLINK N600R V2路由器设置教程(图文)
  12. android wps 流程图,WPS绘制流程图的简单操作
  13. 数据预测模型_如何根据已有数据得出预测模型?线性回归公式来帮你!
  14. android 原生控件,抽离Android原生控件的方法
  15. 【Java练习】2022个人所得税计算
  16. 单词串联记忆 - 故事 - Party上浪漫的事后传
  17. im即时通讯开发之后台应用保活、消息推送的噩梦
  18. Tina R329 swupdate OTA升级步骤
  19. PVE7.21安装流程
  20. 谷歌有超清实时卫星地图吗?答案是没有

热门文章

  1. jsp 中div居中_JSP如何设置居中
  2. Eclipse开发工具介绍
  3. Cannot read properties of undefined (reading ‘parentNode‘)
  4. 曾经的Borland英杰
  5. arch linux grub引导修复
  6. mysql的数据是存到本地_读取股票数据存储到本地MySQL数据库(二)
  7. 架构师送书福利与季度总结
  8. 聚焦百度年会美女刘冬——IT听听看特别版
  9. JavaScript删除元素removeChild
  10. 我在拓展训练中得到的感悟