VC++串口编程Word文档格式.docx
《VC++串口编程Word文档格式.docx》由会员分享,可在线阅读,更多相关《VC++串口编程Word文档格式.docx(25页珍藏版)》请在冰点文库上搜索。
![VC++串口编程Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/8/8f975f06-fabf-492d-a2aa-c0bda2198580/8f975f06-fabf-492d-a2aa-c0bda21985801.gif)
其中最常用的串行通信接口标准是RS-232-C。
这些符号的具体含义是,RS(Recommendedstandard)表示推荐标准,232表示标识号,C表示RS-232的修改版本。
6、常用数据校验方法
常用的串口数据校验方法有奇偶校验和CRC校验等两种。
其中,奇偶校验就是在传送数据位的最后一位传送1位奇偶校验位,可以是奇校验,也可以是偶校验。
奇校验就是所有传送的数据位(包含字符的各数位和校验位)中,1的个数为奇数。
偶校验就是所有传送的数据位(包含字符的各数位和校验位)中,1的个数为偶数。
奇偶校验能够检测出数据传输过程中的部分误码(1为误码能检测出来,但2位及2位以上的误码不能检测出来),但是奇偶校验不能用于纠错,在发现错误后,所能做的补救措施就是重发数据。
CRC校验的全称是循环冗余码校验,英文全称为CyclicalRedundancyCheck,简称CRC。
CRC校验是用除法和余数的原理来做错误检测。
在实际应用中,串口发送端在发送数据前,先计算出数据的CRC值,然后将CRC值一并发送给接收端,接收端在收到数据后,重新计算CRC值,然后将该值与接收到的CRC值进行比较,若不相等则说明数据通信有误。
CRC校验具有自动纠错能力。
7、两个设备之间进行串口通信的流程示意图
二、用VC进行串口编程的方法和流程
在VC中进行串口编程的方法主要有3种,分别是应用MSComm控件进行串口编程、应用串口类库进行串口编程(如CSerialPort类)和应用WindowsAPI进行串口编程。
在VC中进行串口编程的一般流程如下:
(1)、设置串口参数,主要包括串口号、波特率、数据位、停止位和奇偶校验。
(2)、打开串口,根据设置的串口参数打开串口设备。
(3)、读取数据,读取串口数据,并对数据进行业务逻辑处理。
(4)、写入数据,根据业务逻辑需要向串口写入数据。
(5)、关闭串口,使用完串口设备后,需要关闭串口,释放资源。
三、MSComm控件串口编程
MSComm控件是微软公司提供给用户的一个用于串口通信的ActiveX控件,该控件的全称是MicrosoftCommunicationControl。
(1)、新建一个基于对话框的MFC工程MSCom。
(2)、单击【Project/AddtoProject/ComponentsandControls】菜单项,在弹出的对话框中,打开【RegisteredActiveXControls】文件夹,选中【MicrosoftCommunicationsControl,version6.0】,单击【Insert】按钮插入MSComm控件。
(3)、设计对话框IDD_MSCOM_DIALOG如下:
该对话框各控件信息如下:
控件
控件ID
控件属性
相关变量
COM:
文本后的组合框(ComboBox)控件
IDC_COMBO_COM
Type属性为DropList,
取消Sort属性
CString类型的m_strComNo
BPS:
文本后的组合框控件
IDC_COMBO_BPS
CString类型的m_strBps
DB:
IDC_COMBO_DB
CString类型的m_strDataBit
SB:
IDC_COMBO_SB
CString类型的m_strStopBit
CB:
IDC_COMBO_CB
CString类型的m_strCheckBit
Open按钮
IDC_OPEN
默认
无
Send按钮
IDC_SEND
Close按钮
IDC_CLOSEPORT
Quit按钮
IDOK
Send成组框(GroupBox)中的编辑框
IDC_EDIT_SEND
CString类型的m_strSendData
Recv成组框中的编辑框
IDC_EDIT_RECV
设置属性为Multiline、AutoHScroll、AutoVScroll和Read-only
CString类型的m_strRecvData
MSComm控件
IDC_MSCOMM1
CMSComm控件类型的m_ctrMSCom
注意:
为组合框添加CString类型的变量时,Type属性不能是DropList,可先将组合框的Type属性设为Dropdown,添加CString类型的变量后,再设置为DropList。
(4)、在CMSComDlg类的OnInitDialog函数中添加如下代码,初始化控件:
CComboBox*pComboBox=NULL;
//定义组合框控件指针变量
pComboBox=(CComboBox*)GetDlgItem(IDC_COMBO_COM);
//获得控件句柄
//为组合框添加COM1到COM10的选项
pComboBox->
AddString("
COM1"
);
//添加列表项COM1
COM2"
COM3"
COM4"
COM5"
COM6"
COM7"
COM8"
COM9"
COM10"
SetCurSel(0);
//设置初始列表项为COM1
//初始化波特率控件
pComboBox=(CComboBox*)GetDlgItem(IDC_COMBO_BPS);
2400"
//添加列表项2400
4800"
9600"
19200"
38400"
SetCurSel
(2);
//设置初始列表项为9600
//初始化数据位控件
pComboBox=(CComboBox*)GetDlgItem(IDC_COMBO_DB);
5"
//添加列表项5
7"
8"
16"
//设置初始列表项为8
//初始化停止位控件
pComboBox=(CComboBox*)GetDlgItem(IDC_COMBO_SB);
1"
//添加列表项1
1.5"
2"
//设置初始列表项为1
//初始化校验位控件
pComboBox=(CComboBox*)GetDlgItem(IDC_COMBO_CB);
N"
(5)、为Open按钮添加消息响应函数,在该消息响应函数中添加串口参数设置和打开串口:
voidCMSComDlg:
:
OnOpen()
{
UpdateData();
//更新参数数据
intiComPort=1;
//定义串口号变量
iComPort=atoi(m_strComNo.Right(m_strComNo.GetLength()-3));
//获得格式化后的串口号
m_ctrMSCom.SetCommPort(iComPort);
//设置串口号
CStringstrParam="
9600,N,8,1"
;
//定义通信参数,初始化的格式为模板
//获得并更新串口通信参数,包括波特率、校验位、数据位、停止位
strParam=m_strBps+"
"
+m_strCheckBit+"
+m_strDataBit+"
+m_strStopBit;
m_ctrMSCom.SetSettings(strParam);
//设置串口通信参数
m_ctrMSCom.SetOutBufferSize(512);
//设置发送缓冲区大小为512字节
m_ctrMSCom.SetInBufferSize(1024);
//设置接收缓冲区大小为1024字节
m_ctrMSCom.SetInBufferCount(0);
//清空接收缓冲区
m_ctrMSCom.SetInputMode(0);
//设置串口数据获取方式为文本方式
m_ctrMSCom.SetInputLen(0);
//设置接收缓冲区中的所有数据
m_ctrMSCom.SetRThreshold
(1);
//设置接收缓存区中有数据时的响应OnComm事件
m_ctrMSCom.SetPortOpen(TRUE);
//打开指定串口
if(m_ctrMSCom.GetPortOpen())
{//串口成功打开
MessageBox("
COMisopened!
"
}
}
(6)、为Send按钮添加消息响应函数,在该函数中发送数据和显示发送数据和系统当前时间:
OnSend()
_variant_tvSendData;
//定义发送数据变量
vSendData=m_strSendData;
//转换发送数据类型
m_ctrMSCom.SetOutput(vSendData);
//发送数据
CTimetCurrentTime=CTime:
GetCurrentTime();
//获得系统当前时间
CStringstrCurrentTime="
//定义字符串变量
strCurrentTime.Format("
%d-%d-%d%d:
%d:
%d\r\n"
//格式化日期时间
tCurrentTime.GetYear(),//年
tCurrentTime.GetMonth(),
tCurrentTime.GetDay(),
tCurrentTime.GetHour(),
tCurrentTime.GetMinute(),
tCurrentTime.GetSecond());
CStringstrDisplay="
//定义数据显示变量
strDisplay="
TX:
+m_strSendData;
//格式化要发送的数据
m_strRecvData+=strDisplay+strCurrentTime;
UpdateData(FALSE);
//将格式化的数据显示在接收数据框中
使用数据类型_variant_t之前,需要包含头文件comdef.h,可在stdafx.h头文件中添加#include<
comdef.h>
。
(7)、为ClosePort按钮添加消息响应函数,在该函数中关闭串口:
OnCloseport()
{//若串口已打开,则关闭
m_ctrMSCom.SetPortOpen(FALSE);
同时为CMSComDlg类添加WM_CLOSE消息响应函数,在该函数中关闭串口:
OnClose()
OnCloseport();
//关闭串口
CDialog:
OnOK();
(8)、为MSComm控件添加事件响应函数,在该函数中根据响应的事件处理串口数据的接收和显示:
OnComm()
{//根据串口响应事件的值来判断接收缓存区中是否有数据
if(m_ctrMSCom.GetCommEvent()==2)
{//若事件值为2,表示接收缓存区中有数据
CStringstrDisplay="
variant_tvSendData;
//定义接收数据变量
vSendData=m_ctrMSCom.GetInput();
//接收数据
strDisplay=vSendData.bstrVal;
//获取文本数据
CTimetCurrentTime=CTime:
CStringstrCurrentTime="
//定义时间字符串变量
strCurrentTime.Format("
//格式化时间字符串
tCurrentTime.GetYear(),
strDisplay="
RX:
+strDisplay;
//格式化接收到的数据
m_strRecvData+=strDisplay+strCurrentTime;
//将格式化后的数据显示在接收数据框
UpdateData(FALSE);
//更新接收数据框
提示:
右击MSComm控件,选择Event,便可添加事件响应函数。
即添加自定义的消息处理函数。
(9)、将电脑的COM1和COM3口用串口线连接起来,打开该程序的两个实例,设置好参数后,分别打开COM1和COM3,然后进行数据通信。
若只有一个COM口,可以短接该口的引脚2和引脚3,然后打开一个实例进行测试。
使用MSComm控件编写的串口程序发布时会有控件注册的问题。
四、CSerialPort串口类库编程
1、CSerialPort串口类概述
CSerialPort是一个基于多线程的串口通信类,CSerialPort类的原创作者是RemonSpekreijse,应用CSerialPort串口类编写串口通信程序的步骤如下:
(1)、为工程添加CSerialPort类的头文件和源文件。
(2)、为工程添加CSerialPort类对象。
(3)、初始化串口,主要包括串口号、奇偶校验、数据位、停止位等信息。
(4)、启动串口监听线程。
(5)、为工程添加WM_COMM_RXCHAR消息响应函数,在该函数中处理数据的接收。
(6)、发送数据。
2、实例讲解,用CSerialPort类编写串口通信程序
(1)、创建一个基于对话框的MFC工程SerialPortCom。
(2)、将CSerialPort类的头文件和源文件添加到工程目录中,然后选择【Project/AddtoProject/Files】菜单项,选中SerialPort.h和SerialPort.cpp,单击【OK】按钮,完成CSerialPort类的添加。
(3)、为IDD_SERIALPORTCOM_DIALOG对话框添加一系列的控件,设计该对话框如下:
对话框各控件的信息如下:
后的组合框
【Type】属性为DropList,并且取消Sort属性
CString类型的变量m_strComNo
CString类型的变量m_strBps
CString类型的变量m_strDataBit
CString类型的变量m_strStopBit
CString类型的变量m_strCheckBit
OpenPort按钮
Clear按钮
IDC_CLEAR
Send成组框中的编辑框
CString类型的变量m_strSendData
添加Multiline、AutoHScroll、AutoVScroll、Read-only属性
CString类型的变量m_strRecvData
打开组合框IDC_COMBO_COM控件的属性,选择【Data】选项卡,在【Enterlistboxitems】框中输入COM1、COM2等,同理为组合框IDC_COMBO_BPS添加2400、4800、9600、19200、38400,为数据位组合框IDC_COMBO_DB添加5、7、8、16,为停止位组合框IDC_COMBO_SB添加1、1.5、2,为校验位组合框IDC_COMBO_CB添加N。
在【Enterlistboxitems】框中Ctrl+Enter键用于换行。
(4)、在对话框类CSerialPortComDlg的成员函数OnInitDialog函数中初始化控件:
CComboBox*pComboBox=NULL;
//初始化串口号控件
//设置初始串口号为COM1
//初始化校验位控件
pComboBox=(CComboBox*)GetDlgItem(ID