(转)VC串口小程序(用SerialPort类)
×××××××××××××××××××××××××××××××××××××××××××××××××××××
在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类)的更多相关文章
- 微信小程序退款 处理类
<?php /** * 微信小程序退款 处理类参考https://www.cnblogs.com/afei-qwerty/p/7922982.html * */ class WeixinRefu ...
- 微信小程序初探【类微信UI聊天简单实现】
微信小程序最近很火,火到什么程度,只要你一打开微信,就是它的身影,几乎你用的各个APP都可以在微信中找到它的复制版,另外官方自带的跳一跳更是将它推到了空前至高的位置.对比公众号,就我的感觉来说,有以下 ...
- 小程序-列表块/类式ul-li格式(1)
摘要 目前列表能布局出来,但是目前我个人还没解决的问题是:如果每个列表块都有详情页怎么解决呢? 1:我的效果图 2.正常的每个都能点击的html 注:上面的代码确实能够实现我的每个[menu2_vie ...
- 微信小程序 - Util工具类
/utils/utils.js 已经扩展到App对象中,Page方法中直接使用 app.util.method(...) 调用. 1. 扩展String.replaceAll JS默认值提供re ...
- promise封装小程序的请求类(request,清爽易懂)
话不多说直接上代码,清爽易懂: import { config } from '../config.js' const tips = { 1:'抱歉出现了一个错误', 2:'网络错误', 1005:' ...
- promise封装小程序的蓝牙类
// pages/bluetooth/bluetooth.js import { BluetoothMode } from '../../models/bluetooth.js' import {Sy ...
- 一个由印度人编写的VC串口类
http://www.cnblogs.com/lwngreat/p/4098374.html 软件介绍 一个由印度人编写的VC串口类(也是一种VC串口控件),他还配合这个类写了VC 串口通信方面的一些 ...
- 微信小程序工具类
wechat-common-sdk ? 场景:目前工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你独立开发的,用于多个父项目的库. 现在问题来了:你想要把它们当做两个独立的项目,同时又想 ...
- 微信小程序个人/企业开放服务类目一览表
微信小程序个人/企业开放服务类目一览表 微信小程序个人开放服务类目表 服务类目 类目分类一 类目分类二 引导描述 出行与交通 代驾 / / 生活服务 家政.丽人.摄影/扩印.婚庆服务.环保回收/废 ...
随机推荐
- 去死吧!USB转串口!!!
首先,这个题目有两种歧义:1.USB转232串口(严格说就是这种)! 2.USB转USART串口(通常都是这么叫,认为就是这,理论上是错误的,歧义所在)! USB转TTL.USB转232.USB转串口 ...
- Hibernate_day04--课程安排_Hibernate查询方式_对象导航查询_OID查询
Hibernate_day04 上节内容 今天内容 Hibernate查询方式 对象导航查询 OID查询 HQL查询 查询所有 条件查询 排序查询 分页查询 投影查询 聚集函数使用 QBC查询 查询所 ...
- ios开发之 -- 单例类
单例模式是一种软件设计模式,再它的核心结构中指包含一个被称为单例类的特殊类. 通过单例模式可以保证系统中一个类只有一个势力而且该势力易于外界访问,从而方便对势力个数的控制并节约系统资源.如果希望在系统 ...
- Struts2漏洞利用原理及OGNL机制
Struts2漏洞利用原理及OGNL机制研究 概述 在MVC开发框架中,数据会在MVC各个模块中进行流转.而这种流转,也就会面临一些困境,就是由于数据在不同MVC层次中表现出不同的形式和状态而造成 ...
- 170313、poi:采用自定义注解的方式导入、导出excel(这种方式比较好扩展)
步骤一.自定义注解 步骤二.写Excel泛型工具类 步骤三.在需要导出excel的类属相上加上自定义注解,并设置 步骤四.写service,controller 步骤一:自定义注解 import ja ...
- 进击的RecyclerView入门三(要是能拖动就好了)
还是接着上一讲"进击的RecyclerView入门二(来点小装饰?)",在上一讲中我们学到了怎么给不同的Item定制不同的外观,但貌似那个蓝色的框实在太丑了,咱还是把它干了吧. @ ...
- document.selection window.getSelection()
IE9以下支持:document.selection IE9.Firefox.Safari.Chrome和Opera支持:window.getSelection() 屏幕取词 function ge ...
- HDU 5875 Function 大连网络赛 线段树
Function Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total ...
- wampserver环境搭建
一.进入wampserver官网下载:http://www.wampserver.com/ 下载对应电脑相应版本的wamp程序(比如电脑是64位系统的就下载对应的64位的) 二.安装(直接点击exe文 ...
- Genymotion 模拟器的sd卡的位置
今天用genymotion测试一个例子,发现要用sdcard,虽然可以再DDMS的 File Explore 下看到 sdcard目录,也可以看到/mnt/sdcard 目录,但是往他那里传文件,建目 ...