多串口通信系统设计与实现Ξ
张晓华 陈 曦
(武警指挥学院武汉分院训练部 武汉 430062)
摘 要
串口通信作为传统的通信方式仍然受到广泛应用,本文选用高性能的通信卡,采用OOP(面向对象)编程思想,利用多线程技术和数据同步控制技术,实现了八个串口同时进行长时间稳定可靠的双向数据通信。实验结果表明系统采集数据平均延时10ms,能够稳定的进行数据接收
关键词:串口通信 OOP 多线程 同步控制
中图分类号:TP393
Design and R ealization of Multi-Serial Port Communication System
Zhang Xiaohu a Cheng Xi
(Wuhan College,Command College of Chinese Armed Police Forces,Wuhan 430062)
Abstract:Serial port communication methods are widely used until now.It can realize eight serial port sending and receiving data simultaneously with high performance communication card,OOP program,multi-thread technology and data synchronization technology.Experimental result shows the system can communicate with ad jacent device reliably.
K ey w ords:Serial port communication,OOP,multi-thread,s ynchronization control
Class number:TP393
串口通信目前仍是广泛使用的实现计算机间相互通信的方法之一,尽管RS-232使用广泛,但在编程方面确有一些小问题。编程接口几乎没有文档说明,不存在设备驱动程序,或使用驱动程序非常复杂。在这种情况下需要实现多串口通信,需要考虑接口的问题,以及大流量数据下如何同时控制读写多个串口进行通信以及资源的合理分配利用。
1 通信系统设计与实现
目前,多串口通信开发多基于iRmx操作系统、Vxworks操作系统和DOS操作系统[1]。本文所设计的多串口通信系统基于高性能的工控计算机和串行通信卡,选取Windows N T操作系统作为开发平台,以VC++6.0作为开发环境和工具。主要考虑解决了以下几个问题:
・基于Windows N T操作系统的单串口的程序控制问题;
・多串口并行工作的控制协同问题;
・串口的数据保护、时间同步、异常处理
、故障分析等问题;
・串口程序与其他程序间的接口问题。
1.1硬件选择
Intellio C218Turbo/PCI是基于32位PCI总线“即插即用”型的高性能8串口智能通讯卡,PCI B IOS在驱动程序安装的过程中自动完成对中断地址的设置。卡上有高性能处理器(TMS320)和512K B板上内存以缓解主机CPU的压力。八串口可同时以921.6Kbps的速率进行通信。
图1 系统框架
系统使用八个串
口同时与外围子系统
和两个备用监测系统
进行通信,外部设备
多,数据流量大,故在
解决串行通信设计问
题上,硬件上选用台湾Moxa公司的Intellio C218T urbo/PCI通讯卡。系统框架见图1。
Ξ收到本文时间:2005年3月28日
1.2通信函数库选择
常用的串口通信函数库有Win32API函数库, Pcomm函数库,另外还有用于串口通信的ActiveX 控件。
Windows平台禁止应用程序直接操作硬件,必须使用系统提供的标准API函数通过设备驱动程序访问硬件[2]。Windows对与通信设备有关的函数都进行了标准化,使用Win32通信API函数对这些资源进行操作跟基本的文件操作一样。其主要的数据结构和API函数如表1所示。详细的函数参数和结构说明参见参考文献[3]。ActiveX控件虽然使用简单,由于本系统需要对八个串口同步实施控制,数据流量大,对程序的响应速度要求高,因此并不适用,而直接调用Win32API函数会是一个比较安全、灵活和可靠的解决方案。由于在Windows N T同步方式下难以同时收发数据,故选用异步方式。
Pcomm函数库是由台湾Moxa公司为开发串行通信程序提供了一套函数库。通过对Windows API函数进一步封装,提供50多个串口操作函数,覆盖了Windows操作系统下几乎所有异步通信的问题,控制方式多样,有文件传输协议选择、端口设置和查询、线程控制和中断控制等,可以简捷地开发多线程通信程序(可从a.tw下载)。基于Pcomm开发的程序和基于Windows API开发的程序关系如图2所
示。本文对Pcomm 函数库进行了进一步封装,设计了通信类,并以此为基础设计了针对各种数据类型的设备类用于产生实例接收串口数据。
表1 通信数据结构和API函数
符号说明
DCB 设备控制块含通讯参数、流控、环境等参数
数据结构
L PO V ERLAPPED 重叠结构,存放异步I/O数据控制信息和处理事件
COMMTIMBEU TS 存放和查询通信的超时时间参数结构
串口控制CreateFile()打开串行口设备PurgeComm()清空缓冲区
CloseHandle()关闭线程包柄
BuildCommDCB设置DCB结构状态查询Set/G et CommState()设置串口配置
Set/G etCommMask 设置事件掩模,监视指定串口的事件
Set/G etCommTimeouts设置通讯最大等待时间数据输出WriteFile()写串口资源
数据输入ReadFile()读串口资源
事件处理WaitCommEvent()等待事件的发生
ClearCommError清除通讯错误
基于Pcomm的应用程序
Pcomm库函数
基于Win32API的应用程序
Windows N T/9X WIN32API
Windows N T/9X串行通行设备驱动程序
图2 Pcomm程序和基于Windows API程序关系
从两者的比较中,可以看出API函数常采取的方法是在串口监视线程中设置串口通信事件掩码及重叠机
制,允许程序在后台等待串口通信事件。通过WaitCommEvent检测特定的串行通信事件。而Pcomm可以采用中断处理的方式,为各种事件指定相应的中断处理函数,如接收到一定数目的字符,接收到结束字符,接收到中止信号以及发送缓冲区为空等;同时还可以采用线程控制的方式,直接采用库中的sio read()和sio write()函数读写串口。这两个函数的使用有Block和Polling两种方式,前者阻断线程执行,必须将数据块完全导入或导出串口缓存,而后者不影响线程执行,采取通知驱动程序的方式完成对串口的操作。
asp 字符串转数组1.3通信设备类的设计与封装
通用串行通信设备类的设计主要基于Pcomm 函数库,根据重载和封装的设计思想,设计了串口类和设备类。由串口类实例对串口实施一系列操作,包括打开、关闭串口,以及串口通信参数设置。设备类实例针对从各个串口接收到或发送的数据特点,进行相应的编码解码,数据存储操作。数据接收操作通过CALLBAC K类型函数来唤起。串口类实现代码如下:
#include”Pcomm.h”
#define WM INS WM USER+1//串行设备接收数据消息
class PSerialPort:public CWnd{
public:
int BaudRate,Parity,ByteSize,StopBits,PortNum;//串口号和通信参数
int RcvCharNum,iRcvLength;//需要接收的字符数和实际的接收字符数
char TermChar;char3InBuf;//接收的终止字符和接收字符串指针
bool CommOpenFlag;//串口打开标记
CWnd3m pOwner;//父窗口指针
PSerialPort();
virtual~PSerialPort();
static PSerialPort3pComArray[10];
static int ComNum;
int OpenPort(CWnd3p PortOwner,VOID(CALLBACK 3TermIrq)(int port));//打开串口
void ClosePort();//关闭串口
void Write ToPort(CString OutBuf);//写串口
static void CALLBACK TermIrq(int port);//读串口
void SetBaud(int baud,int data,int stop,int parity);//串口参数设置
void Set PortNum(int num){PortNum=num;}
void Set TermChar(char num){TermChar=num;}
void SetRcvCharNum(int num){RcvCharNum=num;} };
设备类实现代码:
class DeviceINS:public CWnd{
public:
DeviceINS();
virtual~DeviceINS();
CString OutBuffer,InBuffer;
PSerialPort Com;
void Convert(void){//编码函数};
void DisConvert(void){//解码函数};
void Simulator(void){//模拟函数};
};
设备初始化和数据通信控制代码:
bool CPserialportView::OnCommunication(L PARAM port){ CPserialportDoc3pDoc=G etDocument();
if(port==pDoc->ins2.Com.G et PortNum()){ pDoc->ins2.InBuffer.Empty();
for(int i=0;i<pDoc->ins2.Com.RcvCharNum;i+ +)//数据转移
pDoc->ins2.InBuffer+=B YTE(pDoc->ins2.Com. InBuf[i]);
pDoc->ins2.DisConvert();//数据解码
}return0;
}
实际使用中,为每一个串口建立一个实例,同时将此实例作为自定义的设备类中的成员变量,置于系统的文档实例中,在文档初始化函数和通信设置对话框中通过调用成员函数Set Port()、SetCOM ()等对串口通信参数进行设置;调用OpenPort()完成对端口的打开和线程创建;数据通信处理通过CALLBAC K函数由设备类相应实例在线程间协调执行。
1.4通信类设计中一些问题
设计通信类时需要注意以下几个问题:
(1)线程协调与同步
线程间执行次序的不可预期性将造成了线程间的竞争,从而引发线程的同步问题。系统为每个通信串口
产生一个串行通信类对象,并置于不同线程内,线程间接触面较小,相互之间的关系发生在线程间的切换和主线程对数据的综合处理中。通过对各线程优先级的合理指定,可以防止线程间切换过于频繁,节约时间。
串口使用过程中用一个关键区域对象(CCriti2 calSection)进行限制和同步;用一个线程的运行标记来防止同一端口的重复初始化问题。其中写事件的激活由用户主线程来控制,在本系统中由定时器来定时激活;摧毁事件由关闭系统、设置端口时激活;而读事件取决于数据的到来。
(2)数据保护
当数据在输入输出缓冲区没有得到及时处理,会被后来的数据覆盖,数据发生丢失,这时就产生了数据保护问题。可以采用环状缓冲区和双缓冲区的方式来解决这一问题。在本系统中,将两者结合起来,采用环形缓冲区数组,配合头尾数据标记指针,由串口读写线程和主线程的后续处理函数分别进行改写,用关键区域对标记数据进行同步。为此,根据MFC的数据结构类,派生设计一个CRing 类,类中包含一个存储字符串数组的环状缓冲区、头尾指针标记同步对象和串口操作函数。在串行通信类中增加两个CRing类的对象分别作为数据接收发送缓冲区。
(3)异常处理
数据通信过程中会产生多种异常和故障,软硬件故障都将可以造成通信中断。通过定时监测无效数据,以及是否超过最大等待时间来进行判断;通信参数设置错误或数据丢失的问题,根据校验码和和结束字符进行检验。监测到此类故障之后,在主线程(U I线程)中用不同颜的端口状态指示灯显示故障原因。
2 通信实验分析及结果
通信试验分析包括时间延迟分析和数据接收成功率分析。
数据从各个子系统经串口发送到主机之间有延时,各子系统发送出来的数据已经打上时间标记,延时值为主机接收到数据时的时间与数据时间标记之差。数据接收成功率是指主机接收到的正确数据与子系统发送的总数据流量之比。主机和子系统通过一套时间同步系统同步二者的时间。时间同步系统授时精度为0.3342ms。
试验中串口线长度为15m,数据发送频率为20Hz,串口通信波特率为115200bit/s。主机为PI2 II733,128M内存。经过多次长时间试验,下面是有关数据分析结果及曲线。数据分析结果为多次试验的统计结果,数据分析曲线为其中一次试验的分析曲线,如图3和图4所示。
图3 通信延时曲线-
串口
图4 数据接受成功率曲线-串口
3 结论
通过对PComm 函数进一步封装,设计了串口
类,针对各个串口进来的数据特点,设计了相应的设备类。设备类的设计为各种类型的串口应用留出了扩展接口,具备灵活的扩展能力和冗余通信容量。采用多线程技术为每个端口创建一个相应的监控和读写线程,每个线程处理一个串口的通信任务,实时监视串口的事件并做数据的预处理。利用Windows 消息分发机制,将串口事件发送到父窗口,根据事件同步对象进行同步。主窗口的消息响应函数进行数据的综合处理。实验结果表明系统采集数据平均延时10ms ,数据接收成功率高,实现了八串口的双向可靠通信功能,数据更新率可以达到20Hz 。如果缩短串口线长度,降低波特率,那么系统采集数据平均延时将进一步减少,数据接收成功率也会相应提高。
参考文献
[1]刘乐善,欧阳星明,刘学清.微型计算机接口技术及应用[M ].武汉:华中科技大学出版社,2000
[2]David J.Kruglinski ,Scot Wingo ,G oerge Shepherd.Pro 2gramming Microsoft Visual c ++6.0.Seattle :Microsoft Press ,1999
[3]Art Baker.Windows N T 设备驱动程序指南[M ].北京:
机械工业出版社,1997
(上接第115页)
求。
5 结束语
电子商务将传统的商务流程电子化、数字化,
一方面以电子流代替了实物流,可以大量减少人力、物力,降低了成本;另一方面突破了时间和空间的限制,使得交易活动可以在任何时间、任何地点进行,从而大大提高了效率。本设计方案实现了一个B2C 电子商务网站所必需的功能,此设计对目前所存在的设计方法是一种改进。随着电子商务应用的普及,良好的设计方法必将愈加重要和发挥积极作用。
参考文献
[1]Chris Ullman.ASP.N ET 入门经典-C #编程篇[M ].北
京:清华大学出版社,2003
[2]杜军平,黄杰.SQL Server 2000数据库开发[M ].北京:
机械工业出版社,2001
[3]Dino Esposito.构建Web 解决方案———应用ASP.N ET
和ADO.N ET[M ].北京:清华大学出版社,2002
[4]Scott Allen.C #数据库入门经典[M ].北京:清华大学出
版社,2003
[5]木林森.C #和ASP.N ET 程序设计教程[M ].北京:清
华大学出版社,2002
[6]孙岩等译.Microsoft SQL Server 2000系统管理员宝典[M ].北京:清华大学出版社,2001
[7]李劲等.SQL Server 2000数据库设计与系统管理[M ].
北京:清华大学出版社,2001
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论