用ComPort实现PC机和伺服控制器的串行通信
2010-06-05刘智慧
刘智慧
(西安外事学院 计算机中心,陕西 西安710077)
随着计算机的发展,单片机在工业控制领域里得到广泛的应用,例如:用于数据采集、监控与控制等。很多工业控制系统都采用上下位机的方式,用串口来实现数据交换。为了实现上位机与下位机之间快速、高效的通信,这就需要根据两者之间的通信协议在上位机和下位机编写相应的串口通信程序,本文主要是针对上位机串行通信的设计和实现。
1 串行通信控件库ComPort
在Windows环境下,既可以用Windows API函数进行串行通信编程,也可以利用串行通信控件来进行编程。利用API函数编写实际应用程序时,往往要考虑多线程的问题,这样编出来的程序庞大,且结构复杂,继承性差,维护困难。使用串行通信控件就相对简单一些,而且其功能强大,性能安全可靠。Comport控件库中就提供了串行通信控件。另外用Delphi编写图形用户界面程序比较容易,所以用Delphi+ComPort控件库进行串行通信程序的设计不失为一个明智的选择[1]。
ComPort 控 件 库 适 用 于 Win95、Win98、WinNT、Windows2000、Windows XP等操作系统,支持 Delphi3~7和 C++Builder3~6, 有 TComPort、TComDataPacket、TComComboBox、TComRadioGroup、TComLed、TComTerminal等控件 (其中的TComPort提供的功能就类似于MSComm),支持同步、异步读写操作,可对流控制进行详细的设置,可以设置读写操作的超时(TimeOut)时间,用多线程监视串口事件[2]。
TComDataPacket可以很容易从输入缓冲区中以包的形式读出数据,并且可以通过设定TComDataPacket的属性来设定数据包的开始和终止条件。
TComTerminal可以接收TComPort控件接收到的数据并显示在屏幕上。它支持VT52,VT100和ANSI等终端连接。
TComComboBox提供可视化用户界面,使用户可以很容易地设置串口的常用属性,并可以选择所需要的串口。
TComLed可以显示CTS,DSR,RLSD,Ring,Tx和Rx等信号的状态。TComLed可以与 TComPort连接,当这些串口信号变化的时候,TComLed就可以自动地更新这些信号的状态。
本文中就是利用TComPort控件实现PC机(上位机)与伺服控制器(下位机)之间的串行通信。
1.1 ComPort提供的对串口进行操作的方式
串口的读写操作可以以2种方式进行:同步或者异步。在同步方式下,进行串口操作的函数直到操作完成或者产生错误才返回。在异步方式下,进行串口操作的函数执行后直接返回,无需等待操作结束。在进行异步操作后,如果执行的结果还没有出来,所有应用程序应该调用等待函数(Wait)以确保操作完成。在异步操作和等待函数(Wait)之间,应用程序可以执行与此异步操作结果无关的其他任何操作[3]。
在执行异步操作之前要先调用InitAsync方法,该方法是初始化PAsync类型的参数,每个进行异步操作的方法都有PAsync参数。在操作完成后,调用DoneAsync方法释放资源。
1.2 ComPort控件的常用属性、方法和事件
ComPort控件有很多重要的属性、方法和事件,通过这些可以很好地控制串口。常用的属性方法和事件[4-5]如下:
1)常用属性 ①BaudRate、Port、DataBits、Parity、StopBits:
分别设置串口的波特率、对应的串口号、数据位、校验类型和校验位、停止位;②Buffer:设置接收、发送缓冲区的大小;③Connected:返回串口的状态;也可以打开或者关闭串口;④FlowControl:设置流的控制方式;⑤Timeouts:用来设置读写操作的间隔和完成的超时时间;⑥TriggersOnRxChar:用来设置当串口接收到数据的时候,哪个事件会被触发(On-RxBuf还是 OnRxChar),通常设置 TriggersOnRxChar=True,也就是串口接收到数据时候,触发OnRxChar事件。
2)常用方法和事件 ①Open/Close:打开/关闭串口;②Read/ReadStr:向串口读字符/读字符串;③Write/WriteStr:向串口写字符/写字符串;④OnRxChar:当串口接收到数据时,触发该事件。
1.3 用ComPort读串口数据的方式
ComPort提供了2种读串口数据的方式:事件驱动方式和查询方式。
1)事件驱动方式 用事件驱动方式对串口操作,响应速度快,可靠性高,是一种有效的方式。当有串口接收到数据的时候,会触发ComPort控件的OnRxChar事件,就可以在这个事件中写处理数据的代码。
2)查询方式 查询方式就是在需要读取数据时,用Com-Port提供的Read或者ReadStr函数读串口以获得接收到的数据。
2 串行通信的实现
在电机伺服控制器的课题中,PC机作为上位机,通过串行口与多个用MCU实现的下位机进行通信,示意图如图1所示。
图1 上位机与下位机通信示意图Fig.1 Schematic diagram of communication between PC and MCU
用Delphi6编写上位机的控制程序,用来控制下位机。上位机和下位机之间发送的数据格式如图2所示。
图2 数据格式Fig.2 Data format
每包数据的大小最少为4个字节:指令字(2字节);数据长度(1 字节);数据字(0 字节);校验值(1 字节)。
MCU每收到第3个字节(数据长度)后,由“数据长度”字节确定数据字的长度和校验值。校验值是从指令字的第1个字节到校验值之前字节的异或值。判断计算得到的校验值与收到的校验值是否一致,一致则发送回应信息——数据已正常接收;否则不回应。
2.1 串口设置
在ComPort控件的属性栏中设置串口的主要属性:BaudRate:=br9600;DataBits:=dbEight。 然后在“打开串口”按钮的Click事件中打开串口,打开串口的伪代码如下:
2.2 读取下位机的数据
在下面的代码中aCommandType表示上位机发给下位机的是地址帧 (TI_Address)、读取数据的命令帧(TI_Command)还是发送给下位机的数据帧(TI_Data)。
首先上位机发送读取数据的命令帧给MCU,这个命令帧包括要读取的参数代码。命令帧的具体格式由PackData()函数实现,通信协议不同,PackData(CommandType:TInfo-Type)函数的实现也不同,读取下位机数据的伪代码[6]如下:
在下面的事件中接收下位机返回的数据:
2.3 向下位机发送数据
其工作原理与从下位机读取数据类似,向下位机发送数据的伪代码如下:
3 实验结果
通过上位机和一个下位机进行串行通信试验,上位机成功获得了伺服控制器(下位机)的状态(伺服电机的速度、转矩和位置偏差等),如图3所示。
图3 上位机与下位机通信获得的数据绘制成的波形图Fig.3 Graph of MCU status(PC got data from MCU by serial communication)
4 结 论
结合实际项目,利用第三方控件库CPort中的控件ComPort在Windows下实现了PC机与单片机的串行通信,并给出了部分实现代码及结果。此方案在实际运行过程中,实现了上位机与下位机之间的通信。本文中给出的只是CPort控件库中的ComPort控件的应用,CPort控件库中还有其他的控件,如 ComLed,TComDataPacket,TcomTerminal等,可以帮助用户很容易地实现串口通信相关的其他复杂的应用程序。
[1]范逸之,陈立元.Delphi与RS-232串行通信控制[M].北京:清华大学出版社,2002.
[2]赵兰涛,苏彦华.Delphi串口通信技术与工程实现[M].北京:人民邮电出版社,2004.
[3]赵曙光.Delphi中利用ComPort元件开发串行通信程序[J].应用科技,2001,28(3):15-16.ZHAO Shu-guang.Development of ComPort by use of Com-Port component in Delphi[J].Applied Science and Technology,2001,28(3):15-16.
[4]张程志.基于ComPort Library控件的Delphi串行数据采集系统的软件设计[J].水利科技与经济,2007,13(8):614-615.ZHANG Cheng-zhi.Computer series-port communication technology based on ComPort Library and XSL/B intelligent digital apparatus[J].Water Conservancy Science and Technology and Economy,2007,13(8):614-615.
[5]张秀德.基于ComPort Library的Delphi串行数据采集系统的软件设计[J].工业控制计算机,2004,17(12):53-54.ZHANG Xiu-de.Delphi software design of serial data acquisition system based on comport library[J].Industrial Control Computer,2004,17(12):53-54.
[6]席一凡.Delphi程序设计[M].北京:中国铁道出版社,2008.