×××××××××××××××××××××××××××××××××××××××××××××××××××××

在MFC里面实现串口通讯有很多方式:

方案一:使用微软公司提供的 串口类,SerialPort。这是官方的东西   有最大的灵活性和可靠性。  我的主攻选择为这个。

微软资源地址:https://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport(v=vs.110).aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-1

方案二:MSComm控件  。使用这种控件 就可以了。。。 不过MFC没有自带,需要添加。

方案三:API函数进行串口编程。  这种方式  也很好  就是难道较大。

×××

有个哥们整理了这些资料:http://www.vc-rs232.com/   我看了下  还是蛮好的。。

××××××××××××××××××××××××××××××××××××××××××××××××××××

先建立一个基于对话框的小程序,做好界面有串口号,打开串口按钮,关闭串口按钮,发送按钮,接收数据区和发送数据区。

然后给串口号即组合框添加变量 CComboBox m_ctrlComPort;

给接收数据编辑框添加关联变量 CString m_strRxMsg;

给发送数据编辑框添加关联变量 CString m_strTxMsg;

然后将SerialPort类的头文件和C++文件复制到工程中区,然后将它们添加到工程中去,将SerialPort的头文件包含到对话框中文件中去。

在对话框头文件中定义一个布尔变量,用来表示标志串口是否打开,再定义一个对象用来调用SerialPort类中的函数。

源码 BOOL m_bPortOpen;  //定义一个布尔变量标志串口是否打开;

CSerialPort m_SerialPort;  //定义一个串口类的对象。

然后开始编辑代码,在SerialPort类中有多个串口事件可以响应,在一般串口编程中,只需要处理WM_COMM_RXCHAR消息就可以了,该类所有的消息处理都需要人工添加消息处理函数。

将处理函数名字定义为OnComm()。首先向对话框头文件中添加串口字符接收消息WM_COMM_RXCHAR(串口接收缓冲区中有一个字符)的消息响应声明:

// Generated message map functions
 //{{AFX_MSG(CSmSerialPortDlg)
 afx_msg LONG OnComm(WPARAM ch,LPARAM port);   //串口字符接收消息(WM_ONCOMM_RXCHAR)(串口接收缓冲区内有一个字符)的响应函数

然后再向对话框CPP文件中添加WM_ONCOMM_RXCHAR的消息映射

BEGIN_MESSAGE_MAP(CSmSerialPortDlg, CDialog)
 //{{AFX_MSG_MAP(CSmSerialPortDlg)
 ON_MESSAGE(WM_COMM_RXCHAR, OnComm)  //消息映射

接着,在对话框CPP文件中加入函数OnComm()的实现

//字符接收消息响应函数
LONG CSmSerialPortDlg::OnComm(WPARAM ch,LPARAM port)
{
 m_strRxMsg+=ch; //将接收到的字符存入编辑框对应的变量中
 UpdateData(FALSE);  //将接收到的字符显示在接受编辑框中
 return 0;
}

每当串口接收缓冲区中有一个字符时,就会产生一个WM_ONCOMM_RXCHAR消息,触发OnComm()函数,这时就可以在函数中进行数据处理,所以这个消息就是整个程序的发动机。

在CSmSerialPortDlg::OnInitDialog()初始化函数中将串口默认设置为COM1; m_ctrlComPort.SetCurSel(0); //初始选择串口1

添加

GetDlgItem(IDC_BUTTON_OPENPORT)->EnableWindow(!m_bPortOpen);
 GetDlgItem(IDC_BUTTON_CLOSEPORT)->EnableWindow(m_bPortOpen);

使能打开串口或关闭串口按钮。

添加打开串口,关闭串口和发送按钮的消息响应处理函数如下:

void CSmSerialPortDlg::OnButtonCloseport()   //关闭串口按钮消息响应函数
{
 // TODO: Add your control notification handler code here
  
 m_bPortOpen=FALSE;

GetDlgItem(IDC_BUTTON_OPENPORT)->EnableWindow(!m_bPortOpen);
 GetDlgItem(IDC_BUTTON_CLOSEPORT)->EnableWindow(m_bPortOpen);
}

void CSmSerialPortDlg::OnButtonOpenport()  //打开串口按钮消息响应函数
{
 // TODO: Add your control notification handler code here
 
 int nPort=m_ctrlComPort.GetCurSel()+1;   //得到串口号
 if(m_SerialPort.InitPort(this,nPort,9600,'N',8,1,EV_RXFLAG | EV_RXCHAR,512))
 {
  m_SerialPort.StartMonitoring();  //启动串口通信检测线程函数
  m_bPortOpen=TRUE;
 }
 else
 {
  AfxMessageBox("没有发现此串口或者被占用");
  m_bPortOpen=FALSE;
 }
 GetDlgItem(IDC_BUTTON_OPENPORT)->EnableWindow(!m_bPortOpen);
 GetDlgItem(IDC_BUTTON_CLOSEPORT)->EnableWindow(m_bPortOpen);
}

void CSmSerialPortDlg::OnButtonSend() 
{
 // TODO: Add your control notification handler code here
 if(!m_bPortOpen)
 return ;      //检测串口是否打开
 UpdateData(TRUE);     //读入编辑框的数据
 m_SerialPort.WriteToPort((LPCTSTR)m_strTxMsg);  //发送数据
}
好了,这时此小串口程序就基本上完成了。

(转)VC串口小程序(用SerialPort类)的更多相关文章

  1. 微信小程序退款 处理类

    <?php /** * 微信小程序退款 处理类参考https://www.cnblogs.com/afei-qwerty/p/7922982.html * */ class WeixinRefu ...

  2. 微信小程序初探【类微信UI聊天简单实现】

    微信小程序最近很火,火到什么程度,只要你一打开微信,就是它的身影,几乎你用的各个APP都可以在微信中找到它的复制版,另外官方自带的跳一跳更是将它推到了空前至高的位置.对比公众号,就我的感觉来说,有以下 ...

  3. 小程序-列表块/类式ul-li格式(1)

    摘要 目前列表能布局出来,但是目前我个人还没解决的问题是:如果每个列表块都有详情页怎么解决呢? 1:我的效果图 2.正常的每个都能点击的html 注:上面的代码确实能够实现我的每个[menu2_vie ...

  4. 微信小程序 - Util工具类

    /utils/utils.js   已经扩展到App对象中,Page方法中直接使用  app.util.method(...) 调用. 1. 扩展String.replaceAll JS默认值提供re ...

  5. promise封装小程序的请求类(request,清爽易懂)

    话不多说直接上代码,清爽易懂: import { config } from '../config.js' const tips = { 1:'抱歉出现了一个错误', 2:'网络错误', 1005:' ...

  6. promise封装小程序的蓝牙类

    // pages/bluetooth/bluetooth.js import { BluetoothMode } from '../../models/bluetooth.js' import {Sy ...

  7. 一个由印度人编写的VC串口类

    http://www.cnblogs.com/lwngreat/p/4098374.html 软件介绍 一个由印度人编写的VC串口类(也是一种VC串口控件),他还配合这个类写了VC 串口通信方面的一些 ...

  8. 微信小程序工具类

    wechat-common-sdk ? 场景:目前工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你独立开发的,用于多个父项目的库. 现在问题来了:你想要把它们当做两个独立的项目,同时又想 ...

  9. 微信小程序个人/企业开放服务类目一览表

    微信小程序个人/企业开放服务类目一览表   微信小程序个人开放服务类目表 服务类目 类目分类一 类目分类二 引导描述 出行与交通 代驾 / / 生活服务 家政.丽人.摄影/扩印.婚庆服务.环保回收/废 ...

随机推荐

  1. 遍历一个Set的方法只有一个:迭代器(interator)

    Set-HashSet实现类: 遍历一个Set的方法只有一个:迭代器(interator). HashSet中元素是无序的(这个无序指的是数据的添加顺序和后来的排列顺序不同),而且元素不可重复. 在O ...

  2. 用iis虚拟目录和windows共享目录上传文件到远程

    现在有这样一个需求,有主机A和主机B.主机A上发布了一个网站,现在往主机A上上传文件默认是存在主机A上的, 如何把文件传到主机B上呢? 第一步在主机A和主机B上都创建同一个帐号admin,密码admi ...

  3. hdu 3085(双向bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3085 思路:双向广搜,每次从M出发,搜三步,从G出发,搜一步,然后就是判断是否走到对方已经走过的格子, ...

  4. HttpServletRequest和HttpServletResponse简介

    http://blog.csdn.net/tong_xinglong/article/details/12972819

  5. windows性能监视器的使用

    https://blog.csdn.net/ab7434588/article/details/53023799 一般在客户端通过LoadRunner对服务器进行压力测试,都需要实时监控服务器端的系统 ...

  6. Struts2_day01--Struts2的核心配置文件_常量配置_分模块开发_Action编写方式

    Struts2的核心配置文件 1 名称和位置固定的 2 在配置文件中主要三个标签 package.action.result,标签里面的属性 标签package 1 类似于代码包,区别不同的actio ...

  7. 自己制作一个链表用来存储列表信息,并查找当前id信息,找上一条信息,下一条信息(信息浏览的时候方便使用)

    偶然看到某些网站在新闻详情中 ,往往是需要根据当前信息id获取到上一条信息和下一条信息的,而通常我们的做法是先获取当前信息,再获取上一条信息,再获取下一条信息,就需要发送三次查询才能够得到这些信息,一 ...

  8. ORACLE WITH AS 用法,创建临时表

    语法: with tempName as (select ....) select ... –针对一个别名with tmp as (select * from tb_name) –针对多个别名with ...

  9. Python全栈day14-15-16-17(函数)

    一,数学定义的函数 函数的定义:给定一个数集A,对A施加对应法则f,记作f(A),得到另一数集B,也就是B=f(A).那么这个关系式就叫函数关系式,简称函数.函数概念含有三个要素:定义域A.值域C和对 ...

  10. 在虚拟机中的搭建Web服务器(CentOS)

    1.制作本地yum源 相关可查看:http://www.cnblogs.com/xiaomingzaixian/p/8424290.html 2.安装JDK 上传上传jdk-7u45-linux-x6 ...