FD-110A型涡轮分子泵控制器串口通信的实现与应用
本文基于串口通讯的原理,并以DF-110A型涡轮分子泵控制器为模型,介绍了使用CSerialPort类实现串口通讯的步骤,分析和讨论了计算机与单片机进行通讯的协议,且在VC++6.0的基础上运用多线程串口编程工具CSerialPort类实现PC机与单片机之间的串口通讯编程。通过协议改变时,模型做很小的修改就能够很方便的移植到不同的应用系统中,具有很好的扩展性。同时,模型中利用多线程技术设计了一个串口监视的线程,能实时的监视串口状态和数据,因此具有很好的实时性。
在现代工业控制中,串口通信的应用越来越广泛。单片机和PC机之间的串口通信在进行数据交换时经常被使用。在串行通信时,要求通信双方都采用一个标准接口,RS-232C接口是单片机和PC机进行通信最常用的一种接口。单片机与PC机进行串口通信最简单的三线制法,即接收数据针脚(RxD)与发送数据针脚(TxD)相连,彼此交叉,信号地(GND)对应相接,如图1所示。
为了实现单片机和PC机之间的串口通信,采用VC++6.0来实现编程,VC++6.0是一种功能强大的面向对象的Windows编程开发平台。与以
往DOS下串行通信不同,Windows不提倡应用程序直接控制硬件,而是通过Windows系统提供的设备驱动程序来进行数据传递。串口在Win32中是作为文件来处理的,而不是直接对端口进行操作。本文采用多线程串口编程工具CSerialPort类来实现PC机与单片机之间的通讯。
图1 RS-232端接口
1、使用CSerialPort类实现串行通信
CSerialPort类是由RemonSpekreijse提供的串口类,该类支持线连接(非MODEM)的串口编程操作。
CSerialPort类是基于多线程的,其工作流程如下:首先设置好串口参数,再开启串口监测工作线程,串口监测工作线程监测到串口接收到的数据、流控制事件或其他串口事件后;就以消息方式通知主程序,激发消息处理函数来进行数据处理,这是对接收数据而言的;发送数据可直接向串口发送。具体实现如下:
1.1、添加类文件(SerialPort.h和SerialPort.cpp)并定义类对象m_SerialPort,(若要操作多个串口,则要为每个串口均定义一个类对象)。
1.2、串口的初始化
串口的初始化代码一般在OnInitDialog()函数中实现,下面给出了主要代码以及定义了一个布尔变量m_bSerialPortOpened用来标志串口是否打开。
if(m_SerialPort.InitPort(this,nPort,4800,'D',8,1,EV_RXFLAG|EV_RXCHAR,512))
{m_SerialPort.StartMonitoring();//启动监测辅助线程
m_bSerialPortOpened=TRUE;
}
else
{AfxMessageBox("没有发现此串口或被占用");
m_bSerialPortOpened=FALSE;
}
1.3、接收数据
接收处理在串口事件消息处理函数OnComm()中实现。并将接收到的字符显示在接收编辑框中,下面代码中,定义了接收数据变量m_ReceiveData,WPARAM、LPARAM类型是多态数据类型(polymorphicdatatype),根据需要自动适应,每当串口接收缓冲区内有一个字符时,就会产生一个WM_COMM_RXCHAR消息,触发OnComm()函数,这时就转到函数中进行数据处理。
LONGCFD110ADlg::OnComm(WPARAMch,
LPARAMport)
{m_ReceiveData+=ch;
UpdateData(FALSE);//将接收到的字符显示在接收编辑框中
return0;
}
1.4、数据发送
if(!m_bSerialPortOpened)return;//检查串口是否打开
UpdateData(TRUE);//读入编辑框中的数据
m_SerialPort.WriteToPort((LPCTSTR)m_strSend-Data);//发送数据
2、PC机与单片机之间的相互通信
FD-110A型分子泵控制器是供高速无刷直流电动机的电子换向器,其使用51系列单片机
作为控制器。具有4位LED数码管显示频率、电压、电流值;3只键盘用于启动、停止控制,频率、电压、电流显示切换及高、低转速设置;过流、过热、超时声光保护报警;本地线控和远程RS232通讯控制。
2.1、C51单片机串行口协议
(1)通讯波特率4800bit/S,格式8.1.1
(2)命令格式:
长度:参数的长度。无参数时填零。
异或效验:从命令码开始。
2.2、PC机与单片机接通后,PC机发送以下命令:
AB800080分子泵停止工作
AB810081分子泵启动工作
AB820082设置430Hz
AB830083设置704Hz
AB840084要工作状态
其中命令“AB800080”解释如下
AB:包头-同步码
80:命令字
00:参数长度,无参数时填零
80:异或效验码
2.3、单片机上传数据
当启动分子泵时,随着分子泵旋转速度的增加,4位LED数码显示数字随之增加,当显示稳定在704Hz±10后分子泵加速完毕,进入匀速旋转状态。此时向单片机发送命令,单片机即可返回当前数据,就可以获得分子泵的当前工作状态。
具体说明如下:
(1)上传命令
(2)上传命令参数
(3)状态字节
注意:等于1时,有效。
2.4、实现的程序代码
//各种命令参数
constCStringSTARTMOTOR=“AB810081”
constCStringCLOSEMOTOR=“AB800080”
constCStringSET430Hz=“AB820082”
constCStringSET704Hz=“AB830083”
constCStringWORKSTATUS=“AB840084”
constCStringBACKDATA=“AB91078491”
//当前运动状态
constintStartMotor=0;
constintCloseMotor=1;
constintSet430HZ=2;
constintSet704HZ=3;
constintWorkStatus=4;
//启动分子泵
CStringstr;//临时变量
str=m_strSendData;
m_strSendData=STARTMOTOR;
StrtoHex(m_strSendData);
CountDisplay(m_strSendData);
m_strSendData=str;
CurrentControlStatus(0);
……………
//关闭分子泵
CStringstr;//临时变量
str=m_strSendData;
m_strSendData=CLOSEMOTOR;
StrtoHex(m_strSendData);
CountDisplay(m_strSendData);
m_strSendData=str;
CurrentControlStatus(1);
…………
//用于显示分子泵当前工作状态
CStringstr;
CStringstrTemp;
switch(ControlStatus)
{
……………
case1:
str="分子泵已关闭";
strTemp.Format("当前工作状态:%s",str);
m_ctrlControlStatus.SetWindowText(strTemp);
//显示当前工作状态
break;
……………
UpdateData(FALSE);
}
3、结论
本文在PC机与单片机之间的串口通讯实例中,并非直接去编写单片机(下位机)程序,而是直接面向通信协议编写PC机(上位机)端运行的智能软件,从而实现与单片机之间的串口通讯,该方法有两大优点:①同一上层客户端软件可以与不同的单片机之间实现串口通讯,从而实现对单片机的空控制。②如果控制任务特别多,多用户也可以通过上位机运行的智能软件来对同一单片机共同分担各自的控制任务。