《VC60串口通信编程基础及缓冲器电源程序解析.pdf》由会员分享,可在线阅读,更多相关《VC60串口通信编程基础及缓冲器电源程序解析.pdf(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 VC+6.0VC+6.0 串口通信编程基础串口通信编程基础 及缓冲器电源程序解析及缓冲器电源程序解析 目录目录 一、概述一、概述.3 二、开发平台二、开发平台.3 2.1 硬件平台.3 2.2 软件平台.3 2.3 源码.3 三、用三、用 MFC 创建一个空对话框程序创建一个空对话框程序.4 四、关联变量介绍及实例四、关联变量介绍及实例.9 五、串口通信编程的简单实现五、串口通信编程的简单实现.13 5.1 界面及相关控件创建.13 5.2 数据接收和发送编程.19 5.3 程序测试.21 六、缓冲器电源上位机程序简析六、缓冲器电源上位机程序简析.23 6.1 界面初始化编程.24 6.2
2、串口编程(采用 CSERIALPORT类编写).25 6.3 上下位机通讯帧格式.28 6.4 控制按钮编程.29 一、概述一、概述 本文介绍了一种在 VC+6.0 中实现简单串口通信编程的方案,并在此基础上对实验室的旧版缓冲器电源上位机程序进行分析。阅读本文之前最好已经了解 C+及 MFC 的一些基础知识:类与对象的关系及各自定义、构造函数与析构函数、MFC 常用类的分类、MFC 消息定义、消息映射机制等。C+编程已经有很多年了,而且不是纯粹的面向对象编程,有很多不完美的地方。推荐使用 C#编程,在这方面实验室已经有很好的基础。本文简单介绍面向对向编程的一些初级知识。二、开发平台二、开发平台
3、 2.1 2.1 硬件平台硬件平台 USB串口线 RS232 接口 笔记本 已安装 USB串口线驱动 2.2.2 2 软件软件平台平台 操作系统 Windows XP 开发软件 VC+6.0 2.2.3 3 源码源码 串口类CserialPort 包含两部分:SerialPort.h(头文件)SerialPort.cpp(cpp文件)三、三、用用 MFCMFC 创建一个创建一个空空对话框程序对话框程序 步骤一步骤一.打开 VC+6.0 软件,在菜单栏选择【文件】【新建】步骤二步骤二.在弹出的【新建】对话框中单击【工程】选项卡,在该列表框列出的应用程序类型中选择【MFC AppWizard(ex
4、e)】选项 接着输入工程名称并选择保存路径。步骤三步骤三.单击确定之后打开如下所示对话框,选择 步骤四步骤四.单击下一步,打开下面所示对话框,保持默认设置,不做改动 步骤五步骤五.单击下一步,继续打开如下对话框,风格只有 MFC 标准有效,源文件备注指的是产生一个关于源文件描述的文本文件,使用 MFC 类库的方式有两种:共享 dll(动态链接库)和静态链接库,前者是动态调用 MFC 类库,即不包含在生成的可执行程序中,后者是静态调用 MFC 类库,即将 MFC 类一起编译在可执行程序中,方便应用程序移植到别的计算机上运行,这里也保持默认设置。步骤六步骤六.单击下一步,得到下图所示对话框,单击完
5、成按钮则就完成了一个对话框应用程序的创建。步骤七步骤七.新建立的对话框程序,打开工作区的【ClassView】选项卡,得到下图 表示类,粉红色小方块表示类的成员函数,绿色小方块表示成员变量,黄色钥匙表示保护类型(protected)的成员变量或成员函数,该工程中没有私有类型的成员,私有类型成员是在前面加一把锁标明。步骤八步骤八.打开工作区的【FileView】选项卡,得到下图,工作区是工程文件目录 步 骤 九步 骤 九.打 开 工 作 区 的【ResourceView】选 项 卡,双 击 Dialog 中 的IDD_MYDIALOG_DIALOG,即可打开对话框编辑窗体。步骤十步骤十.标准控件
6、工具栏,各控件功能请参考有关资料 自带的串口通信控件 MSComm 并不在工具栏里,需要自行添加,添加路径:菜单栏【工程】【增加到工程】【Components and Controls Gallery】,选择Registered ActiveX Controls 文件夹中的然后添加即可。静态文本框 动态编辑框 按钮 MFC 自带的串口通信控件 四四、关联变量介绍及实例关联变量介绍及实例 关联变量是 C+/MFC 编程中一个重要概念,是进行数据交换的重要途径。下面举一实例来说明关联变量。创建一个新的MFC对话框工程(定名为sample),然后添加 2 个编辑框和一个按钮(窗体自带控件已删除),如
7、下图:注:在控件上右击选择【属性】,可以修改控件的名称及参数。在对话框窗体上添加 2 个静态文本框 IDC_EDIT1 和 IDC_EDIT2 以及一个按钮IDC_BUTTON2。要实现的功能:IDC_EDIT1 为输入框,IDC_EDIT2 为输出显示框,在输入框中输入一个整数,点击按钮实现2,在输出框中得到输入值 2 倍。步骤一步骤一.在编辑界面上右击鼠标,选择【建立类向导】,进入 MFC ClassWizard 窗口,单击【Message Maps】选项卡进入消息添加页面。单击 IDC_EDIT1 IDC_BUTTON2 IDC_EDIT2 步骤二步骤二.单击【Member Variab
8、les】选项卡,进入添加变量页面,如下图,分别为输入框和输出框添加一个 int 型的关联变量关联变量 m_a 和 m_b。注:每个控件可添加多个变量,变量类型可选。添加方法:选择左图大方框内要添加变量的控件对象,然后单击 Add Member Variable 按钮,弹出右图,填入要添加变量的名字,选择类型,单击 OK,然后在左图大方框内的相应控件上就会显示出来。这些变量添加后在代码文件中就会体现,在主代码文件 sampleDlg.cpp 中:控件的数据交换,在本例中体现为关联变量,其代码在虚函数 DoDataExchange中。如上所述在 MFC ClassWizard 中添加的关联变量都可
9、以在 DoDataExchange中找到对应代码。步骤三步骤三.为按钮控件添加消息及消息响应函数。首先介绍常用标准消息的添加方法,如下,进入 MFC ClassWizard 窗口,单击【Message Maps】选项卡进入消息添加页面。如图给按钮 IDC_BUTTON2 添加 BN_CLICKED 消息(即按钮被单击的消息)。对于按钮的单击消息有个更快捷的添加方式:直接在编辑窗体上双击双击该按钮,弹出下面窗口,该窗口为按钮添加一个单击消息,图中 OnButton2 为单击消息的消息响应函数。单击 OK,直接跳到 OnButton2 函数的代码区,此时单击消息及空的消息响应函数添加完毕。1.选择
10、控件或窗体 2.选择相应的消息 3.单击添加 步骤四步骤四.为空的消息响应函数 OnButton2 添加功能代码:这里有 2 行重要代码:UpdateData(TRUE);/关联变量时常用,把框体内容赋给与之相关联的变量 UpdateData(FALSE);/关联变量时常用,把更新后的变量值返回给框体 至此,程序设计完毕,编译运行即可。有时候在某个代码文件上编译时,可能是因为其他文件的全局变量未传递过来,导致错误,此时直接点击【生成】即可,最终再点击【运行】,观察可执行程序的效果。注:生成的可执行程序在该工程的 Release 文件夹或 Debug 文件夹下可以找到。编译 生成 运行 五五、串
11、口通信编程的简单实现、串口通信编程的简单实现 常用串口通讯编程方法:1.利用 VC+6.0 提供的 MSComm 控件编程 2.使用 32 位的 API 通信函数 3.使用 CserialPort 类进行编程 本节将采用第三种方法编写一个简单串口通信程序。所用的 CserialPort 类由Remon Spekreijse 编写,使用时需下载源程序 SerialPort.h 和 SerialPort.cpp。注:本节所有代码均可从网上找到,此处只是对代码进行介绍和实现。5.1 界面及相关控件创建 步骤一步骤一.建立一个新 MFC 对话框工程,命名为 SCPortTest,添加下图所示控件 组合
12、框控件 IDC_COMBO_COMPORT 关联 CComboBox 型变量 m_ctrlComboComPort 编辑框 IDC_EDIT_RECEIVEMSG 关联 CString 型变量 m_strEditReceiveMsg 编辑框 IDC_EDIT_SENDMSG 关联 CString 型变量 m_strEditSendMsg 组合框控件 IDC_COMBO_COMPORT 按钮 ID_OK 编辑框 IDC_EDIT_RECEIVEMSG 编辑框 IDC_EDIT_SENDMSG CComboBox 型变量 m_ctrlComboComPort 的添加:这里选 Control CCo
13、mboBox 型 接收编辑框 IDC_EDIT_RECEIVEMSG 设置问题:在该控件上单击右键,选择【属性】,进入该控件属性设置,设置垂直滚动,如下:添加组合框控件 IDC_COMBO_COMPORT 的几个问题:在该控件上单击右键,选择【属性】,进入该控件属性设置 【样式】选项卡:【数据】选项卡 此处选择“下移”或“下拉列表”按住 Ctrl 和回车键换行 这两个地方 务必选上 下拉框显示问题 步骤二步骤二.添加 CserialPort 类及定义对象 把 SerialPort.cpp 和 SerialPort.h 文件复制到工程目录文件夹内,如下图步骤所示,将 SerialPort.cpp
14、 加入 SerialPort.h 加入 注:VC+6.0 上可能没有 解决方案见下文 点击此处三角,控件的整体框架 显现,如图中所示的虚线框 这个距离要够大,否则下拉的数据无法显示多行 1.单击选择被添加单击选择被添加到的到的文件夹文件夹 2.单击这里执行添加单击这里执行添加 关于无法通过下图所示添加文件的问题:这是由 Visio 及 OFFICE 与 VC+6.0 冲突造成的,解决方案见网上资料。本文 解决此问题后在 VC+6.0 上添加了 2 个按钮:用这两个按钮实现添加和打开。3.选择文件然后确定选择文件然后确定 声明类对象和接口状态变量:首先,在SCPortTestDlg.h文件内添加
15、语句,引入SerialPort类,即添加#include#include SerialPort.h。其次,在类 class CSCPortTestDlg:public CDialog 中声明 SerialPort 类的对象和一个状态变量。本例中为:CSerialPort m_SerialPort BOOL m_bSerialPortOpened 步骤三步骤三.初始化界面及控件显示:在 SCPortTestDlg.cpp 文件的BOOL CSCPortTestDlg:OnInitDialog()函数中添加代码:m_ctrlComboComPort 为组合框控件 IDC_COMBO_COMPORT
16、 关联的变量 GetDlgItem(IDC_BUTTON_OPEN)-EnableWindow();的用法请参考有关资料 程序初始运行显示程序初始运行显示 COM1 串口还未打开,【打开串口】按钮可用,【关闭串口】按钮不可用串口还未打开,【打开串口】按钮可用,【关闭串口】按钮不可用 步骤四步骤四.【打开串口】和【关闭串口】按钮功能的实现 为添加单击消息,消息响应函数 OnButtonOpen(),代码如下:为添加单击消息,消息响应函数 OnButtonClose(),代码如下:5.2 数据接收和发送编程 功能:将接收到的数据放到编辑框 IDC_EDIT_RECEIVEMSG 显示 点击【发送】
17、按钮,将编辑框 IDC_EDIT_SENDMSG 的数据发送出去 步骤一步骤一.窗口接收到串口数据的消息及其消息响应函数 首先,窗口接收到串口数据消息为 WM_COMM_RXCHAR,是在 SerialPort.h 中已经定义好的。其次,命名与之对应的消息处理函数为 OnComm,在 SCPortTestDlg.h 中声明 最后,将消息 WM_COMM_RXCHAR 和处理函数 OnComm 映射到一起,在文件SCPortTestDlg.cpp 中添加映射代码,如下:关于消息及消息响应函数的定义,映射机制的建立,请参考有关资料 步骤二步骤二.消息处理函数 OnComm 的实现,代码如下 步骤三
18、步骤三.数据发送的实现,为按钮【发送】添加单击消息,响应函数如下:步骤四步骤四.为按钮【退出】添加单击消息,响应函数如下:5.3 程序测试 经过上面步骤,程序设计完毕,编译运行。进行测试:步骤一步骤一.将 USB串口线接到笔记本 USB 口上,右击【我的电脑】【管理】【设备管理器】【端口(COM 和 LPT)】,查找激活的 COM 口,本例为 COM8,如下图:步骤二步骤二.在程序下拉列表中选择相应 COM 口,然后点击【打开串口】,如下图,COM8 已打开。在发送编辑框中填入要发送的数据或字符,如本例的“123”步骤三步骤三.将 USB串口线 RS232 接口的 2,3 引脚短接,实现自发自
19、收 单击按钮【发送】,在接收编辑框中出现正确字符,测试成功。六、六、缓冲器电源上位机程序简析缓冲器电源上位机程序简析 下位机将处理后的电压、电流和温度信号经过串口发送到上位机的编辑框显示;点击上位机的按钮会产生相应的控制命令,控制命令经串口发送到下位机,下位机解析命令并驱动硬件。6.1 界面初始化编程 CComboBox 型变量 m_ctrlComboComPort 关联关联 m_ctrlComboComPort.SetCurSel(0);/初始化框体显示 COM1 GetDlgItem(IDC_BUTTON_OPEN)-EnableWindow(!m_bSerialPortOpened);/
20、若串口已被打开,则打开按钮打开按钮不再可用,初始化为可用 GetDlgItem(IDC_BUTTON_CLOSE)-EnableWindow(m_bSerialPortOpened);/若串口未被打开,则关闭按钮关闭按钮不可用,初始化为不可用 CSpinButtonCtrl 型变量m_Spin Int 型变量 m_Spinvalue 关联关联 关联关联 m_Spin.SetRange(0,200);/设置旋转按钮控件的下限和上限 m_Spin.SetBuddy(CWnd*)GetDlgItem(IDC_EDIT2);/将数字电位器旋转按钮控件与 IDC_EDIT2 绑定 IDC_EDIT2 旋
21、转按钮控件 6.2 串口编程(采用 CserialPort 类编写)步骤一步骤一:添加 CserialPort 类的两个文件并定义对象和接口状态变量,同第五节。步骤步骤二二:手动添加串口字符接收消息 WM_COMM_RXCHAR。其消息响应函数为 OnComm。(注:WM_COMM_RXCHAR 无法通过 MFC ClassWizard 添加,但在 SerialPort.h已有定义)步骤步骤三三:在 SerialPortTestDlg.h 中添加 OnComm 函数声明 步骤步骤四四:在 SerialPortTestDlg.cpp 文件中将消息 WM_COMM_RXCHAR 和消息处理函数 O
22、nComm 映射到一起 步骤步骤五五:在 SerialPortTestDlg.cpp 文件中加入 OnComm 函数实体 CEDIT 型变量 m_CtrlRecv 关联关联 CString 型变量m_strEditReceiveMsg 关联关联 步骤步骤六六:按钮【打开串口】的编程 步骤步骤七七:按钮【关闭串口】的编程 CComboBox 型变量 m_ctrlComboComPort 关联关联 6.3 上下位机通讯帧格式 命令格式:AA A B C D E 55 A 取值:01ADC 采集电压电流 INC_DEC 次求平均,并将平均结果通过串口发送到上位机,此时忽略 B C D 的取值 02通
23、过继电器选择输出数字电位器设定的电压值,此 时 B、C、D 分别设定输出电压值的个位、十分位、百分位 B 取值:00 01 02 03 04 05 C 取值:00 01 02 03 04 05 06 07 08 09 D 取值:00 05 03-打开电源 此时忽略 B C D 的取值 04-关闭电源 此时忽略 B C D 的取值 05-切换就地控制模式,默认是就地控制模式,switch=0 06-切换远程控制模式,switch=1 07-切换到手操器控制模式 E 取值:0d命令结束标志 例如:AA 02 00 05 00 0d 55 表示就地模式,数字电位器输出 50 AA 07 00 00
24、00 0d 55 表示手操器控制模式 6.4 控制按钮编程 函数 Str2Hex 功能:将字符串化为十六进制串,再继续转化可放到字符数组中 IDC_BUTTON1 程序程序 程序中将 IDC_BUTTON1 的单击消息响应函数定义为OnButtonMannualSet 此处代码可在网上找到 此处代码可在网上找到 IDC_BUTTON3 单击消息 IDC_BUTTON4 单击消息 IDC_BUTTON6 单击消息 IDC_BUTTON2 单击消息 控件 IDC_SPIN1 和 IDC_EDIT2 绑定在一起 IDC_SPIN1 的消息为 UDN_DELTAPOS 响应函数如下:程序中根据 m_Spinvalue 的值(即 IDC_EDIT2 的显示值),通过串口发送控制帧,调节数字电位器输出