工程化应用框架建立中相关模块实现方法

2015-12-18 06:13程西娜蔡文斋
计算机与网络 2015年1期
关键词:服务器端线程串口

程西娜 蔡文斋

(中国电子科技集团公司第三十九研究所陕西西安 710065)

1 引言

该题目来源于本承研单位统一标准化天线监控程序设计开发项目,鉴于以前工程监控程序分为各工程组开发模式之弊端,该研发室欲开发出一款通用的天线类应用程序框架,在该框架基础上再加入各自工程特点的业务逻辑模块,最终形成某工程使用的监控软件。经有关专家充分论证后,欲开发出一种通用的与工程无关的底层控制类框架平台,用来完成整个控制工程最关键的功能如通讯、线程调度和消息传递机制等等,对业务逻辑开发者而言,无需关心硬件层的操作,只需依据具体项目要求编制有关的数据处理工作即可,这样可以提高研制效率。本文主要论述了此框架中相关模块的实现方法,诸如多串口通讯模块、网络通讯模块和主控线程模块。

2 研制背景

整个框架运行在windowsxp3系统上,使用Delphi XE2开发[1-4]。采用抽象构架与应用逻辑相结合的开发方法。首先设计一个与控制工程项目无关的核心框架,完成整个系统硬件级通信调度和调试等功能,该框架主要功能模块为:所有硬件层设备通信模块、调度模块、主工作线程模块、动态调试支持模块、存储线程和日志线程工作模块。框架模块与具体控制工程无关,一旦调试完成,其函数级文件即可使用在以后其它任何该类工程中。该框架设计方法已经由导师发表[5],不再赘述。该文主要讨论在新开发环境下DELPHIXE2如何实现出工程用的部分模块。

框架将通讯用数据定义为抽象缓冲区形式,当框架代码段完成设备读后,发一个用户定义的消息给前台应用逻辑窗口给界面,通知硬件层数据已准备就绪。这样业务逻辑中仅实现读消息函数即可完成数据处理和显示等工作,这样设计的好处在于软件结构清晰明了,这两部分可以独立开发。因为这次开发工具的版本提升,以前的许多实现方法都做了调整,本文主要讨论在新环境下这些部分功能块是如何实现的。

3 解决方案

3.1 多路串口通讯实现

多路串口分别使用ComPort组件和MoxaPcomm组件库实现,ComPort组件为VCL组件,可以在DELPHI环境下无缝使用,MoxaPcomm为台湾专业串口厂商提供的串口库,可在DELPHI环境下使用DLL技术加载[6],这里重点介绍多路串口初始化参数配置的技术实现。

该应用程序框架为了适用于所有这一类项目,设计时考虑的的是通用性,所以将该部分设计为具备可以配置的动态自调整功能,例如工程1使用12个串口,工程2使用32路串口等等,使用一抽象的串口结构定义串口类,再使用动态数组形式定义串口实例,在窗口创建函数中首先枚举系统中所有串口数量,根据系统中串口数量设置动态数组长度,再使用程序方法自动生成配置界面,配置界面使用DELPHI的属性页技术展现,采用NextSuite组件集的NxInspector组件实现,该组件在设计时定制是较方便的,但当串口较多时,每个串口都有10个参数,程序员工作量较大,而且不能够动态生成,经反复试验,使用如下关键代码实现了程序自动生成:

运行程序Inspector组件中的COM 树已生成,在COM参数配置树中勾选需要打开的串口,配置波特率、数据位、终止位、校验位和超时值等参数,配置完毕后点击。点击apply按钮,对应的串口指示灯变亮,表明已经打开成功,如图1所示。

图1 串口配置树

Moxa串口库编程与ComPort编程方法有差异,Moxa串口库使用动态链接库方式提供,底层实现与ComPort不同,但多参数配置部分仍然可以使用属性页方式编程,串口的读写仍然使用动态分派机制。

3.2 网络通讯实现

网络部分使用了多页组件PageControl,分别为UDP、TCP/IP和组播3个页面[7]。网络的读写采用了Indy10.0.52组件开发,分为客户端和服务器端,通过界面设置IP地址和端口,数据以数组的形式发送,delphi 2007以上版本使用Indy10组件,与以前版本差异较大。Indy9组件[8]的读是采用流方式,如UDP读的重载函数为IdUDPServerUDP Read(Sender:TObject;AData:TStream;ABinding:TIdSocket Handle);,读缓存区的内容需要用AData.Read(ReadBuffer,AData.Size)函数获得;而Indy10组件的读是直接采用缓存区的方式,如UDP读的重载函数为IdUDPServerUDPRead (AThread:TIdUDPListener Thread;AData:TBytes;ABinding:

TIdSocket Handle),读缓存区的内容直接从AData里获得。

3.2.1 UDP方法的实现

UDP通讯的特点是点对点的通讯方式,服务器开放端口,客户端只需要将数据发至该服务器开放的端口即可,由于它不属于连接型协议,即发送时不需要接收方确认,可能会出现丢包现象,但是它具有处理速度快和资源消耗小的优点。

采用了组件包中IdUDPServer和IdUDPClient实现了8路服务器端的读操作和1路客户端的写操作。服务器端的设置同样采用了Inspector组件,以配置树的形式展现,点击需要开放的服务器的“Enable”,对应的端口被激活;客户端的设置需填入远程地址和端口号,勾选“激活”后客户端打开成功,如图2所示。

图2 服务器和客户端配置

服务器和客户端打开成功后,重载服务器组件IdUDPServer的OnUDPRead函数,该函数在每读取到一帧数据时自动执行,通过TIdSocketHandle类的ABinding变量可以获得客户端的IP地址和端口号,在TBytes类型的AData变量中可以获得读取的缓存区的内容。再采用内存拷贝函数,将AData内的字节放到对应的读服务器缓存区。函数如下:

3.2.2 TCP/IP方法的实现

TCP是面向连接的通信协议,通过3次握手建立连接,通讯完成时要拆除连接,具有稳定性好的特点[9]。采用了组件包中IdTCPServer和IdTCPClient组件实现。

客户端写的操作实现:从界面获得远端IP和端口号,在服务器打开的前提下,连接服务器。此时如果服务器没有打开,界面会有提示需先打开服务器。连接成功后,给客户端的写缓存区里赋值需要发送的字节,调用IdTCPClient组件的IO句柄的Write(TCPWriteBuffer)函数,完成客户端写的功能。

服务器端的读操作实现:重载了服务器组件IdTCPServer的OnConnect函数,OnDisconnect函数和OnExecute函数。其中OnConnect函数和OnDisconnect函数是在客户端连接和断开服务器时的动作,发给界面连接或断开的提示。读服务器是采用了OnExecute函数,该函数在每读取到一帧数据时自动执行,用TIdContext类的AContext变量的IO 句柄的ReadBytes(TCPReadBuffer)函数,将读到的数据放到服务器的读缓存区。部分代码如下:

3.2.3 组播方法的实现

组播协议与现在广泛使用的单播协议不同之处在于,一个主机用单播协议向n个主机发送相同的数据时,发送主机需要分别向n个主机发送,并发送n次。而组播协议只需要发送一次,其数据由网络中的路由器和交换机逐级复制并发给各个接收方,是一种一对多的通讯方式,这样既节省服务器资源也节省网络主干的带宽资源[10]。

组播中的读是在客户端实现,写是在服务器中实现,这一点与前2种方法正好相反。采用了组件包的IdIPMCastClient实现了1路客户端的读操作和IdIPMCastServer实现了1路服务器端的写操作。

服务器端的写操作:给服务器端的写缓存区里赋值需要发送的字节,使用IdIPMCastServer组件的Send函数即可实现写操作。

客户端的读操作:重载IdIPMCastClient组件的OnIPMCastRead函数,该函数在每读到一帧数据时自动执行,在TBytes类型的AData变量中可以获得读取的缓存区的内容。再采用内存拷贝函数,将AData内的字节放到对应的读服务器缓存区。部分代码如下:

3.3 控制主线程和中断

控制主线程由主控制事件驱动,线程开始后永远等待该主控制事件对象,当该事件对象变为有信号态时,复位该数据对象到无信号态,调主控函数完成控制操作,再次进入线程开始进入另一次等待。事件的有信号态由中断线程的中断服务线程设置,该部分与硬件接口形式有关系,一般使用Modam状态变化或者TTL电平形式的硬件接入方式。主控线程流程图如图3所示。

图3 主线程框图

4 结束语

由整体基础架构由承研单位有关专家负责,作者编程并调试出文中介绍的各部分模块,经连接测试,代码无误功能齐全。调试期间网络通讯部分样例太少阻力较大,经专家指导及反复试验最终使用文中介绍的方法实现了设计。

[1]谭 燕,赵 磊,李之明.Delphi 高级辅助工具精解[M].北京:中国铁道出版社,2003:28-55.

[2]李之明,高玉琢.Delphi7 组件经典解析[M].北京:中国铁道出版社,2003:88-105.

[3]CANTU M.Delphi Xe Handbook:A Guide to New Features in Delphi Xe[M].USA:Createspace,2011:88-92.

[4]李 慧.Delphi 程序开发范例宝典(第三版)[M].北京:人民邮电出版社,2012:285-291.

[5]蔡文斋.Win32 环境下一种通用控制软件的实现方法[J].现代电子技术,2005(8):51.

[6]张秀关.单片机与计算机串口通信实践[M].北京:电子工业出版社,2013:30-37.

[7]胡 鸣.Windows 网络编程技术[M].北京:科学出版社,2008:67-89.

[8]蔡文斋.应用INDY 组件设计网络调试器[J].现代电子技术,2006(24):94.

[9]尹圣雨.TCP/IP 网络编程[M].北京:人民邮电出版社,2014:24-55.

[10]刘 莹,徐 恪.Internet 组播体系结构[M].北京:科学出版社,2008:44-58.

猜你喜欢
服务器端线程串口
浅谈AB PLC串口跟RFID传感器的通讯应用
Linux环境下基于Socket的数据传输软件设计
基于国产化环境的线程池模型研究与实现
浅析异步通信层的架构在ASP.NET 程序中的应用
浅谈linux多线程协作
基于Qt的安全即时通讯软件服务器端设计
USB接口的多串口数据并行接收方法探索
基于蓝牙串口适配器的GPS接收机与AutoCAD的实时无线通信
线程池技术在B/S网络管理软件架构中的应用
网页防篡改中分布式文件同步复制系统