FD-110A型涡轮分子泵控制器串口通信的实现与应用
在现代工业控制中,串口通信的应用越来越广泛。单片机和PC 机之间的串口通信在进行数据交换时经常被使用。在串行通信时,要求通信双方都采用一个标准接口,RS-232C接口是单片机和PC机进行通信最常用的一种接口。单片机与PC机进行串口通信最简单的三线制法,即接收数据针脚(RxD)与发送数据针脚(TxD)相连,彼此交叉,信号地(GND)对应相接,如图1所示。
为了实现单片机和PC机之间的串口通信,采用VC++6.0来实现编程,VC++6.0是一种功能强大的面向对象的Windows 编程开发平台。与以往DOS 下串行通信不同,Windows 不提倡应用程序直接控制硬件,而是通过Windows 系统提供的设备驱动程序来进行数据传递。串口在Win32 中是作为文件来处理的,而不是直接对端口进行操作。本文采用多线程串口编程工具CSerialPort 类来实现PC机与单片机之间的通讯。
1 使用CSerialPort 类实现串行通信
CSerialPort 类是由Remon Spekreijse 提供的串口类,该类支持线连接(非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 类型是多态数据类型(polymorphic data type), 根据需要自动适应,每当串口接收缓冲区内有一个字符时,就会产生一个WM_COMM_RXCHAR 消息, 触发OnComm()函数这时就转到函数中进行数据处理。
LONG CFD110ADlg::OnComm (WPARAM ch,
LPARAM port)
{ m_ReceiveData+=ch;
UpdateData (FALSE); // 将接收到的字符显示
在接收编辑框中
return 0;
}
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 机发送以下命令:
AB 80 00 80 分子泵停止工作
AB 81 00 81 分子泵启动工作