阳世荣
(中国舰船研究与设计中心,武汉430064)
阳世荣(工程师),研究方向为电力系统自动化。
串行通信具有简单可靠、使用方便、开发成本较低等特点,在智能仪表行业里得到了广泛应用[1];特别对于数据量不是很大、实时性要求较强的场合,串口通信仍然是最好的选择,有着良好的应用前景。随着单片机在智能仪表 中 的 广 泛 应 用[2],其 串 口 (UART,Universal Asynchronous Receiver/Transmitter,通用异步收发接口)编程成为单片机智能仪表系统开发的重要内容。串口通信程序的传统调试方式,往往需要利用专用的单片机硬件仿真器和调试计算机。在编写好程序后,利用仿真器来设置断点,观察变量和程序的流程,由仿真器和上位机进行串口通信,逐步对程序进行调试及修正错误。
传统调试方法对硬件仿真器依赖性较强,但是很多仿真器不能做到完全硬件仿真,因而可能造成仿真时正常,而实际运行时出现错误的情况,或者造成仿真不能通过,但是实际运行正常的情况;当单片机芯片型号发生较大变化时,需要配置新的仿真器,增加了资金投入。另外,传统的调试方法要求调试计算机具备串行通信口,而现在很多新型计算机,尤其是笔记本电脑,并不提供串行通信接口,往往需要另外配置串口转换模块。因此,传统的串口通信调试方式,对调试工具有较多的硬件方面要求,给串口编程的调试仿真以及现场维护带来不便。
本文介绍了一种串口通信程序调试方法,能够在单台计算机上实现串口通信程序的纯软件仿真调试,既不需要硬件仿真器,又对计算机的串行通信接口无任何要求,给串口编程的调试仿真带来极大方便。
本调试方法无需任何硬件仿真器以及用户电路板,对调试计算机也无串行通信接口要求。在软件方面,只需准备虚拟串口软件VSPD、Keil以及串口通信客户端软件(如串口调试助手等)。
其中,Keil是众多单片机应用开发软件中最优秀的软件之一,支持几乎所有MCS51架构的芯片,并且集编辑、编译、仿真等多项功能于一体,同时支持汇编语言和C语言程序设计[3]。Keil的软件界面十分友好,易学易用,因此广泛应用于单片机系统的程序调试和软件仿真中。
虚拟串口驱动程序(Virtual Serial Ports Driver,VSPD)能够创建数对“虚拟”的串行端口,每对串口虚拟互联[4],在一般程序看来,这些“虚拟”的串行端口跟实体的串行端口完全一致,因此,在单台计算机上运行VSPD即可达到串口扩展的目的。
本调试方法的基本流程如下:
① 运行VSPD实现计算机串口的扩展和互联;
② 在Keil中运行通信程序,对单片机的UART进行仿真,并将之与计算机的某一个虚拟串口绑定,即用计算机的串口来模拟单片机的UART;
③ 打开串口调试助手,选择与②中互联的虚拟串口,进行数据收发从而实现通信调试。
本文介绍的串口调试方法应用了Keil的串口仿真功能,即在应用Keil软件进行通信程序调试时,可利用计算机的串口来模拟单片机的串口。进行仿真时,Keil需要使用的2个命令为:ASSⅠGN和MODE。
2.1.1ASSIGN命令
该命令的功能为将单片机的串口绑定到计算机的串口,其语法格式为:
其中,channel代表计算机的串口,可以是COM1、COM2、COM3或COM4等;而inreg和outreg代表单片机的串口。对于只有1个串口的普通单片机,即为SⅠN和SOUT;对于有2个或者多个串口的单片机,即为SnⅠN和SnOUT(其中,n=0,1,…,为单片机的串口号)。例如:
即为将计算机的串口1绑定到单片机的串口(针对只有1个串口的单片机)。
即为将计算机的串口2绑定到单片机的串口0(针对有多个串口的单片机,需要注意串口号的书写位置)。需要注意的是,在命令行中,<inreg>参数的括号是不能省略的,而outreg则是没有括号的。
2.1.2MODE命令
该命令的功能为设置被绑定计算机串口的通信参数,其语法格式为:
其中,COMx(x=1,2,…)代表计算机的串口号;baudrate代表串口的波特率;parity代表校验方式;databits代表数据位长度;stopbits代表停止位长度。例如:
MODE COM1 9600,n,8,1
即为设置串口1,波特率为9 600,无校验位,8位数据,1位停止位。
即为设置串口2,波特率为19 200,奇校验,8位数据,1位停止位。
在Keil的调试环境下运行以上2个命令,就能够将计算机的串口模拟成单片机的串口了。需要注意的是,这两个命令必须一起使用。
输入上述命令后,然后在Keil的调试环境下运行单片机通信程序,通信程序发送到单片机串口上的数据会通过被绑定的计算机串口发送出来,其他通信客户端软件(如串口调试助手)通过访问计算机串口即可接收到数据;另一方面,所有发送到被绑定的计算机串口上的数据都会转发到Keil模拟的单片机串口上,由单片机通信程序接收。利用这个特点,就可以十分方便地仿真、调试单片机的串口通信程序。
首先,运行VSPD,其软件界面如图1所示。在图1右边Control Panel面板上,选择2个串口号,然后点击“Add pair”按钮。此时,在图1左边的System Explorer显示区的Virtual ports下即出现2个已经互联好的虚拟串口。例如,在图1中设置的2个互联虚拟串口为COM3和COM4。需要说明的是,图1中Physical ports下的COM1为计算机实际的物理串行接口。
其次,在Keil中编写单片机串口通信程序,并编译通过,串口的设置参数示例:波特率9 600,无校验位,8位数据位,1位停止位。接下来,需要设置Keil的Project项目的相关参数。为了正确地仿真串口通信情况,在Keil中必须设置实际使用的晶振频率,这个参数十分重要,直接影响串口通信的波特率。点击Keil工具栏的Project项,在下拉菜单中选择Options for Target,打开的设置界面如图2所示。在图2上方的标题栏中选择Target,在Xtal(MHZ)栏中填写单片机实际使用的波特率。要注意,这个参数的单位是MHz。
第三步,输入串口通信仿真调试命令。单击Keil工具栏的Debug项,选择Start Debug Session,进入仿真状态。在Keil软件左下方的调试窗口中选择Command文档框,输入ASSⅠGN和MODE命令。例如,将图1中的虚拟串口COM3绑定为单片机的串口,命令格式为:
图2 Keil参数设置界面
为了避免每次进入调试仿真状态都要手动输入1次ASSⅠGN和 MODE命令,可以建立1个初始化文件,将ASSⅠGN和MODE命令保存在初始化文件中,由Keil进入调试状态时自动调用。初始化文件的后缀名为.ini,可由普通的文本文件直接保存为此格式。例如,建立1个初始化文件debug.ini,填入 MODE和 ASSⅠGN命令行,然后在图2的Keil参数设置界面中,选择Debug参数设置界面,如图3所示。在Ⅰnitialization中设置好debug.ini文件路径,确定即可。
图3 Debug参数设置
接下来可在通信程序中设置断点,一般是在与串口相关联的部分进行设置。单击Keil工具栏的Debug项,选择Go,开始运行通信程序。此时,打开串口调试助手,选择与单片机串口相连的虚拟串口,例如COM4,并且配置好相应的串口通信参数,即可与单片机程序实现通信,如图4所示。
图4 串口调试助手界面
利用串口调试助手发送命令帧,检查单片机通信程序是否进入断点,回复的数据帧是否正确。还可以有意发送带有错误数据的数据包,以观察单片机通信程序的通信异常处理部分是否正常。一旦发现程序中的错误,可以马上停止仿真调试,立即修改程序代码,然后重复上述步骤进行仿真。
需要注意的是,调试期间是利用Keil软件模拟单片机的串口,因此仿真时串口通信的实际波特率仅仅取决于MODE命令。单片机通信程序中的TMOD、SCON等参数是不影响串口仿真状态的(也就是说这些参数不影响仿真的波特率,即使它们是错误的),但是中断的使能位(如ES、EA等)还是起作用的,如果ES或EA被禁止,那么就不会进入串口中断。
由于VSPD可以在计算机上成对的扩展多个虚拟串口,因此本方法非常适合仿真多串口单片机。一般而言,使用本方法需要占用计算机的串口数量是单片机绑定串口的2倍。一个串口被Keil占用,用来模拟单片机的串口;另外一个串口被计算机占用,用来与单片机的串口进行通信。
由于调试期间不需要与硬件设备联机,也不用下载代码到硬件仿真电路板上,所以调试仿真的速度是比较高的。当然,这种方法是利用计算机的串口来绑定单片机的串口,数据是由Keil软件仿真从单片机串口转换到计算机串口的,因此在仿真时,处理速度会比实际单片机运行时稍微低一点,这与计算机本身的处理速度有关,但是对仿真来说,没有任何影响。
简单、方便、容易使用、经济成本低是本调试方法的最大优点。应用本方法进行通信调试,不需要使用任何硬件电路,对计算机也没有特殊的硬件接口要求,而且对程序编程语言也没有任何特殊要求(C语言和汇编语言均可)。采用本方法可以在硬件电路板研制的同时,就将串口通信部分的程序编写、调试完毕,大大缩短了开发周期。
对于MCS-51架构的单片机,由于均可在Keil环境下进行开发,可直接应用本调试方法;对于其他架构的单片机或者DSP以及ARM平台,虽然无法直接将其串口与计算机串口绑定,但是可以采用变通的办法,先用C语言在Keil中编写通信程序,并采用本方法调试完成,然后将程序移植到相应的单片机或DSP硬件平台。因此,本方法可应用各类单片机、DSP以及ARM的串口通信开发与调试当中,最大限度地降低研制成本,提高开发效率。
[1]徐胜,吴丽琴,施益峰.一种基于串行通信技术的远程监测系统[J].仪表技术与传感器,2006(11):38-41.
[2]骆阳.具有抗干扰性能的单片机智能仪表的设计[J].电测与仪表,2002(3):24-26.
[3]马忠梅.单片机的C语言应用程序设计[M].北京航空航天大学出版社,2003.
[4]罗子明,王磊杰,刘或,等.基于AT89C51的数据采集系统设计新方法[J].电子元器件应用,2007,9(8):37-40.