版权声明:本文为博主原创文章,遵循 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. 查看JDK的历史版本
  2. python全局变量有缩进吗_Python全局变量和局部变量的问题 400 请求报错 -问答-阿里云开发者社区-阿里云...
  3. 第八周项目一-数组作数据成员(2)
  4. win10家庭版远程桌面连接出现身份验证错误
  5. Python的输入指令、格式化输出、基本运算符
  6. jbox2d_JBox2D和JavaFX:事件与力量
  7. SAP License:进项税的合理管理缩减成本
  8. Linux下不停止服务,清空nohup.out文件
  9. 如何将iTunes资料安全地备份到外部硬盘驱动器?
  10. python实现语法分析器_python语法分析器
  11. SqlServer2008 不允许保存更改
  12. 10.6 全源(All pairs)负权Johnson算法
  13. 小米node2红外_蓝牙,移动侦测,环境光,小米人体传感器2
  14. 一款不错的Android环形进度条
  15. 纯css绘制简易对话气泡
  16. 自定义函数使用GridSearchCV参数寻优
  17. Linux之4G模块串口通信
  18. 网吧服务器点歌系统,网吧点歌系统(网吧点歌曲软件)
  19. ANTMINER KA3 166T能否颠覆Polkadot未来
  20. Sentinel Dashboard轻松流控

热门文章

  1. 计算机专业知识 2019pdf,2019《大学计算机基础》重点知识总结.pdf
  2. 一种公路场景下基于视觉的车辆检测和计数系统
  3. 大型的支付系统如何对账、风控
  4. 一文搞定十大经典排序算法
  5. 一看就懂的平面设计介绍
  6. 543.二叉树的直径
  7. 使用Logistic Regression进行文本分类
  8. 漫画 | C语言哭了,过年回家,只有我还没对象
  9. SonarQube之采购选型参考
  10. Centos7#基础服务之计划任务服务