探讨Delphi串口通信程序设计与实现

时间:2022-05-03 11:54:58

探讨Delphi串口通信程序设计与实现

摘要:该文主要针对Delphi串口通信程序的设计与实现进行了研究和探讨,在面向对象程序设计方法的基础上,通过采用Delphi 编程技术,利用软件制作数据发生器来对硬件进行模拟,从而产生相应的数据,然后利用已经完成属性和缓冲区等设置工作的Spcomm 控件,通过VCL 控件设计系统界面将所得数据及时发送出去,最终让计算机对串口进行有效的控制来完成数据的发送。

关键词:Delphi;串口通信;控件

中图分类号: TP393 文献标识码:A 文章编号:1009-3044(2013)09-2112-05

1 串口及Delphi介绍

随着我国科学技术水平的不断提高,计算机网络技术的应用越来越广泛,串口通信技术由于具有良好的灵活性以及可靠性进一步促进了我国国防科技的建设,并影响着人们的生产和生活。过去在进行通信控制的过程中,一般都是将PC机和开发板分别作为上位机和下位机,这主要是由于PC机具有较高的性价比,信息处理时速度较快,灵活性较大,所以在用户界面上一般都会要求PC机拥有产生并传输相应控制信号的功能,在这当中信号的传输工作一般都是通过串口通信来完成的。不过串口通信也存在一些不足之处,比如在串口通信当中,RS-232的实际传输距离一般都在30m以内,而RS-485在进行数据传输时通常都是透明的,如果把RS-232和RS-485联合起来使用,串口才可以实现远距离的数据传输,所以在实际传输工作中还需要把RS-232转换成为RS-485。而相对于并行传输来说,串口通信的传输速度虽然比较慢,不过使用过程中较为灵活、简单,可靠性较好,能够有效的减少数据线的使用,特别是在进行远距离通信的过程中,可以极大的节约通信成本。

Borland公司曾推出一种面向对象的高级编程语言,具有较强的可视化,也就是实际应用中较为常见的Delphi语言,该语言能够把可视化设计Windows编程所具有的复杂性封装和ObjectPascal语言进行联合,在用户程序的编写中实用性更强。与此同时由于Delphi具有的多种优点例如界面友好、功能较多等受到了广大软件开发人员的青睐,特别是在数据库开发方面发挥了重要的作用。不过Delphi也存在一定的不足,其本身并不带有串口通信控件,在实际开发过程中不太方便,但是通过引入SPCOMM控件能够有效的解决该问题,促进了众多通信程序的开发人员的软件开发工作。

2 利用 Delphi 实现串口通信的三种常用方法

Delphi 中实现串口通信最常见的三种方法分别是:首先是可以利用 API函数,其次可以利用Spcomm 或者MSComm控件;最后是直接将其他的串口通信程序调用过来。第一种方法对于一些编写相对复杂但是层次相对较低的通信程序来说更具有优越性,但是由于编写通讯程序具有的复杂性,对该方法提出的要求就是必须掌握大量的通信知识。因此第二种方法要比第一种简单一些,由Small-Pig Team研究开发的一个第三方 Delphi 串口控件就是我们常说的Spcomm 控件,通过到相关网站进行下载,然后将其安装到指定目录当中,能够对串口进行多种操作,该方法在编写通讯程序时较为简单,具有良好的可移植性能,而且非常通用,能够支持多线程,目前已经得到了广泛的应用。

2.1利用API函数实现串口通信

串口编程在不同的环境下(例如Windows环境和DOS 环境)存在很大的不同。其中在Windows环境下进行串口通信编程的过程中,其主要特点就是设备具有无关性,在设备驱动程序的帮助下,可以有效的把外界的各种设备和Windows应用程序相互隔离开来。Windows 通过封装其通信机制进而成为通信API,程序工作人员能够利用通信API来完成各种编程工作,省去了对硬件进行的各项操作。而在局域网通信当中,由于通信API只能算做一个串行端口API,所以适应性较差。但是它能够将串口操作和文件操作有机的结合在一起,然后通过类似操作来进一步实现串口通信。一般在利用API函数时能够实现串口通信的事件主要包括下述几种:

1)利用CreatFile 函数实现串口的打开操作,利用CloseHandle函数对串口进行关闭。

2)在获取串口的当前配置时,可以通过GetCommState()函数来实现;在对串口资源的所有参数进行重新分配的过程中可以使用GetCommState()函数来实现。只有对串口设备的属性有一定的了解才可以对其进行相应的配置。在获取串口属性的过程中可以利用GetCommProperties()函数。

3)利用ReadFile()函数进行串口的读取,利用WriteFile 函数写串口。

2.2 利用 MSComm 控件实现串口通信

MSComm 控件在实现数据传输和数据接收目的的过程中主要利用了串行端口,从而为应用程序提供了相应的串行通讯服务。程序员在利用MSComm 控件进行串口编程的过程中不需要再掌握具有较高复杂程度的API函数,而且其具有较强的适用性。

1) 常用的两种能够有效处理通讯的方法

MSComm控件的两种处理通讯的方式主要包括查询方法以及事件驱动方法。

2)常用属性

CommPort和PortOpen分别表示设置并返回通讯端的口号和状态;Input表示从接收缓冲区返回并同时进行字符的删除操作;Output表示向传输缓冲区当中写一个字符串;EOFEnable表示确定输入时控件是否在寻找EOF字符的状态;Settings表示通过字符串进行设置并返回停止位、波特率、数据位以及奇偶校验等。

MSComm控件当中只存在一个OnComm事件。

3)通过利用MSComm控件实现串口通信的具体步骤主要为:

① 进行MSComm控件的添加操作;

② 初始化串口并将其打开;

③ 对串口事件进行捕捉;

④ 按照要求对串口进行读写;

⑤ 完成后关闭串口。

2.3利用 Spcomm控件实现串口通信

Delphi 7.0 并没有自带Spcomm控件,因此需要在相关网站下载该控件并将其安装在指定位置。通过使用Spcomm控件就能够有效的实现串口的通信,这主要是由于Spcomm控件掌握了大量和串口通信有关的属性以及事件,并能够提供多种操作,对于一般串口通信的需求来说都能够满足。

Spcomm 控件的安装方法:

1) 下拉菜单- Component- Install Component,出现Unit file name之后在该位置上填写该控件所在的具体路径信息,其余项均设置为默认值,然后点击OK按钮进行安装。

2)在完成安装操作之后, System 控件面板里面会显示红色控件Com。

Spcomm 控件的具体属性、方法以及相应的事件:

1) Spcomm 控件的属性

CommName:Com1、Com2 等串口所对应的名字主要利用CommName来表示;

BaudRate:波特率,该值主要是根据实际情况进行设定和更改的;

ParityCheck:是否需要进行奇偶校验可以用ParityCheck表示;

ByteSize:字节长度,按照实际需要进行该值的设定;

Parity和StopBits:分别表示奇偶校验位和停止位;

SendDataEmpty:布尔型属性,该属性在true时主要表示发送队列或者发送缓存为空;在false时则表示发送队列或缓存当中有信息。

2) Spcomm 控件的方法

在打开串口的时候需要用到StartComm方法,在串口打开失败之后该方法会自动报错。一般错误种类主要包括下述几种,分别是:串口已经打开或者打开过程中出现错误;无法安装通信缓存;无法产生读进程、写进程以及事件等;文件句柄不属于通信句柄。

在关闭串口时需要用到StopComm方法,该方法没有返回值。

WriteCommData(pDataToWrite:PChar;该方法能够把一个字符串发送到写进程中,如果发送成功即可返回到true,一旦发送失败则会返回到false。

在采用该方法的时候能够立即获得返回值,之后就可以执行发送操作。在该方法中由于具有布尔型函数,所以包括两个参数,其中dwSizeofDataToWrite主要表示发送字符串的具体长度;而pDataToWrite则表示所要发送的字符串。

3) Spcomm 控件的事件

OnReceiveData:procedure (Sender:TObject;Buffer:Pointer;

BufferLength:Word) of object

该事件一般会在数据输入到缓存当中时触发,一般能够有效处理从串口接收到的各种数据。Buffer主要表示接收到的数据,BufferLength则表示该数据的具体长度。

OnReceiveError:procedure (Sender:TObject;EventMask:DWORD)一旦在接收数据的过程中发生错误,该事件就会被触发。在Spcomm 控件的使用过程中,需要先添加一个Com 控件,通过设定该控件的属性来对其发送和接收的触发事件进行设置,最后即可通过对源代码进行编写来完成调试工作。

4) Spcomm串口通信的具体实现过程

Spcomm串行通信控件的主要特点之一就是多线程,接收数据和发送数据不是在同一个线程中完成,其中在接收数据的过程中会触发OnReceiveData事件;然后通过WriteCommData()函数把需要发送的数据快速写入到输出缓冲器当中,数据的发送工作即可在另一个线程中完成。

2.4 对其它串口通信程序进行合理调试

在实现串口通信的过程中不仅可以使用Windows API 函数、Spcomm控件以及MSCOMM 控件,常见的SerialPort 控件以及CommPortDrv 控件同样可以完成串口通信。

3系统的具体设计过程与实现方法

3.1发送窗口功能的实现过程

在该案例中主要是对惯导计算机以及其具有的环境应力进行测试。PC机可以按照用户的实际需求将有效指令发送给单板,然后单板在执行之后再将结果返回PC机上并且明确的显示出来。该操作的主要流程如图1所示。

在串口通信实现的过程中使用SPCOMM控件,需要按照设计规定将程序设计的大体框架构建出来,完成软件界面的设计工作,然后对通信对象、端口号等进行设置,根据实际需求编写程序,有效的完成数据的接收以及发送工作,最后将通信端口全部关闭即可。具体步骤主要为:

1)按照用户的实际需求完成软件界面的构建工作。

2)初始化串口,同时设置SPCOMM控件的具体属性值,将波特率设置为19200,规定字节长度为8位、停止位为一位,将控件名确定为COM1,最后确定无奇偶校验位。

3)设置实现程序所需要的具体代码。由于篇幅的限制,笔者只针对程序初始化代码以及数据接收和发送所对应的代码进行了阐述。

3.2 实时数据发送功能的实现过程

在设计过程中主要依赖于Timer 控件以及Spcomm 控件的使用。

1) 初始化

通过选择在本次通信过程中所使用的串口,对该串口进行波特率、数据位、停止位以及校验方式等各个属性的设置,然后将该串口打开;

2)测试数据的发送方法

为了有效实现模拟实时数据的采集任务,需要先完成串口的调试工作,在选择测试信号的时候可以任意选择一个特定的字符串,然后将测试信号发送出来,如果接收事件能够将这些特定的字符串成功收集,则表明测试数据发送成功,串口能够正常发送数据。

示例代码如下:

5)定时器的设计方法

为了实现自动发送数据这一目的,可以对定时器的相关代码以及属性等进行设置和编写。

4 结束语

总而言之,通过对比上述三种方法发现,利用Spcomm 串行通信控件进行串口通信程序的开发,其灵活性更好,而且操作更为简单,值得推广应用。

参考文献:

[1] 李军.Delphi 7项目开发实践[M].北京:中国铁道出版社,2003.

[2] 赵兰涛,苏彦华.Delphi 串口通信技术与工程实践[M].北京:人民邮电出版社,2004.

[3] 张宏林.Delphi 7程序设计与开发技术大全[M].北京:人民邮电出版社,2004.

[4] 刘宗键.Delphi 7程序设计入门[M].天津:天津电子出版社,2003.

[5] 刘斌,李.Delphi 7高级教程[M].北京:清华大学出版社,2004.

上一篇:浅谈基于ITIL的规范运维保障体系在企业中的建... 下一篇:最短路径动态规划问题及C语言实现探讨