摘要:设计了一种基于LabVIEW语言的单片机与PC机的串口通信。从软件实现方案、程序结构、结果检测等方面介绍了串口通信电路的实现。能精确地再现单片机采集的低频信号。
串行通信是一种常用的数据传输方法,虽然它的传输速度慢,但它占用的通信线路少,成本低,在工程的通信方式上仍有重要地位。
目前,串口通信程序的开发,在Windows操作系统下一般用VB、VC、Delphi等编写。当用VB、VC开发串行通信程序时,开发人员不得不面对非常烦琐的API函数编程;而Delphi没有自带的串口通信控件,在它的帮助文档里也没有提及串口通信,这也给编程人员带来许多不便。
可见,用上述三种文本语言编串口通信程序较为复杂,花费的时间较长。笔者试图找到一种实现PC机与单片机的串口通信更为简捷的方法:利用LabVIEW进行开发。
1 软件实现方案
1.1 应用软件概述
LabVIEW语言是美国国家仪器(NI)公司开发的一种基于图形程序的编程语言,利用该语言编写的模块化程序,具有良好的界面,简单、直观,且易于理解、调试和维护。做成的虚拟仪表可以当作许多仪器设备来使用,其功能完全由用户编程定义。另外,LabVIEW内还含丰富的数据采集、数据信号分析以及控制等子程序,特别适用于数据采集、通信处理系统。它在信号处理的强大功能方面也是组态软件不可比拟的(它比用基于文本的语言开发效率可以提高10-15倍)。
虚拟仪器系统中串口通信一般用于传统仪器控制和缓慢变化信号的采集。而本项目涉及到的红外探测器所探测的斩波信号仅12Hz,故采用LabVIEW进行串口通信,既经济实惠又能达到预期目的。
1.2 通信模块的引入
在LabVIEW中,对串行口进行控制的方式通常有两种:一是利用LabVIEW功能模块的Instrument I/O-〉VISA子模块;二是直接利用LabVIEW功能模块Instrument I/O-〉Serial子模块,该程序库中包含进行串行通信操作的一些功能模块。这正符合本软件开发的需要。
1.3 通信模块的属性
表1给出了本系统用到的几个通信模块的基本属性的描述。
2 程序结构
本程序主要采用顺序结构实现,具体流程如图1所示:
首先,初始化串口。据实际需要选择并打开com口,打开串口时根据双方协议设置波特率、数据位、奇偶校验位、停止位、缓冲区大小等。如果打开串口无误,指示灯亮;否则提示串口出错,并关闭串口。初始化成功后,退出第一桢,进入第二桢。
其次,输入命令字到串口。因双方约定单片机输入的命令字为十六进制的55(ASCⅡ码字符表示为U),故在程序框图中输入的字串若用ASCⅡ码字符表示为U,用HEX进制表示为55。若写入的命令字有误,或写入串口模块打不开,出现出错提示,重新要求打开串口。
第三,延时。因涉及在操作系统的几层间传递信息,加之从主机发送命令到单片机,单片机判断为正确命令后返回数据给主机是需要一定的时间的,故这一步进行延时等待。延时时间可视情况而定,只要大于单片机回送给主机的时间就行。具体执行时间可由LabVIEW工具菜单栏下的advanced下的profile来确定程序运行时间。若不加以延时程序会有出错提示。
最后,显示部分,主要程序代码如图2所示。根据需要进行图形及表格显示。为能准确计算被测信号的频率值,使前面板横轴表示的时间尽可能准确,在显示图形Graph前用bundle进行处理。实践表明:通过这种处理方式,可使被测信号的频率值误差在百分之三以内。在数组显示前用一个重构数组函数将单片机送来的数据构建成一个10行8列的数组,后利用两层for循环实现数组的行列显示。
3 结果检测
该程序经实际运行证明具有较高的运行速度和测量精度。在此笔者仅给出了f=12Hz时的前面板结果显示图(图3):在波形图中横轴表示时间(ms),纵轴为实测的单片机的采样电压值(单位:v)。因在程序代码4中进入波形图的数据本身已经过绑定处理,故得到的为我们熟悉的十进制数据。又因单片机发送数据一般为八位,为检验数据的正确性,本文采用另一种显示方式---表格显示。表格中的数据是用无符号的八位整形表示,范围在0到255之间,与波形图纵轴表示方法不同,必须将之进行换算才可得如波形图表示的电压值,其换算方法为:
U = X *2.7/255
式中:X为表格中数据;U为实际电压值。
从该显示图上可推出,实测频率约为12.195Hz,示波器显示正确频率为12Hz,误差仅为1.625%,实测结果非常接近于理想输出,符合设计要求。
4 结束语
该通信方式简单、可靠、稳定,具有很好的可移植性、实时性,可供其它串口通信系统参考。该程序现已用于笔者的实际工作。