您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 自定义串行通信软件的方法
自定义串行通信软件的方法林俊兴戴余良张涛(海军工程大学动力工程学院武汉430033)摘要:介绍DOS和Windows两种环境下自定义串行通信软件的方法,并根据工程应用经验对它们的特点进行比较,给出选择串行通行方案的建议。自定义串行通信软件可以封装特定的数据传输校验协议,提高数据传输可靠性,有利于大型软件项目开发过程的组织管理和维护,充分体现面向对象和软件工程的设计思想。关键词:串行通信;软件;面向对象;软件工程1.引言尽管微型计算机各项技术发展很快,但串行通信口仍然是微型计算机的基本配置,商用机和工控机都是双串口配置。串行通信以传输距离长,连接简单为突出特点,在分布式控制领域,微机之间不必增加其他设备就可以实现数据传输。虽然在面向对象的软件开发中可以使用第三方提供的串行通信控件(如MSComm),实践证明它的灵活性和扩展性很差,增加数据传输校验时,每个使用该控件的人都要编写相关代码,不利于软件的开发管理和维护升级。在实时仿真控制系统中,对数据传输的同步性、实时性和正确性有很高的要求,往往需要根据所传输数据的类型和用途,自定义数据传输的格式和校验协议。要实现这些特殊功能,就要求开发者自定义串行通信的控制软件。另外,在一个由多人完成的大型软件项目中统一使用自定义的经过封装的串行通信软件,可以保证数据传输的安全性和整个项目软件风格的一致性;自定义特定的数据校验协议也可以作为专用软件的加密措施。本文介绍自定义DOS下和Windows下串行通信软件的实现方法和它们的特点。2.串行通信的实现方法串行通信的波特率、数据位、停止位和校验方式等可以根据需要设定,参与串行通信的两台计算机必须设置相同的串行口特征参数。串行通信连接最简单的方式是用带屏蔽的两根数据线,这时需要短接标准串行口中的部分引脚,图1表示这种最简单的接线方法。由于DOS下和Windows下的编程机制有明显的差别,实现的方法不同,所表现出来的特性也不相同。2.1DOS下的通信在TurboC的bios.h文件中定义了函数intbioscom(int,unsignedchar,int),第一个参数标识了该函数的功能,取值0到4,具体参见下面例子;第二个参数是一个数值;第三个参数指定通信端口,0对应于COM1,余类推。该函数每次只读写一个字节的数据,它可以用来初始化串口的波特率、停止位、校验方式;检查端口的状态;读端口的数据和向端口写数据。具体可以参考相关的文献[1]。使用串口时要先初始化,设置好串口参数。初始化串口以后可以根据实际需要向串口写数据或者读数据。注意读数据以前要先检查端口状态,确认以后才能读接收到的数据,写数据时要注意数据的类型,具体应用参见下例。bioscom(0,0xa3,port);其中0xa3是设置串口参数(帧格式为:9600,n,8,1)的组合数;bioscom(1,c,port)为向端口port写入的数据c,该数据类型为unsignedchar;c=bioscom(2,0,port)返回从端口读到的数据,应该将它赋给一个参数;图1一种串行通信接线图678912345123456789c=bioscom(3,0,port)用来检测端口的状态,在读数据以前要进行检测,确认数据缓冲有新数据。根据控制系统对数据同步性的要求,一般是在一组数据传输完毕后进行校验,对于仿真和控制系统尤为重要,以确定某组数据是表达系统的一个状态,验证重要数据也为了保证对系统的控制不会因超限而进入危险状态。阿里亚娜5型火箭空中爆炸的原因就是数据超限[2]。这样的校验协议需要软件开发人员自己制定并通过程序代码实现。工程项目中的应用,一般是需要传送一组数据,所传送的数值一般也是带符号的大于255的数,由于DOS下bioscom函数每次只能传送一个字节,这样传送前和接收以后都要进行数据的拆分和组合,拆分和组合的具体代码如表1所示。对于有符号的数据一般要进行变换,使它在正数范围内传送,否则要单独处理符号位。2.2Window下的通信在Windows下使用VC对串口的控制,最合理的方法是创建一个串口通信类(假设命名为CMyCom),强烈建议以静态库或动态链接库形式来创建这个工程,这样可以独立于调用它的应用程序。该类完成串口参数的初始化和自定义必须的数据传输功能函数,串口初始化可以在该类的结构函数中进行,这样创建实例时即可完成初始化工作。初始化的方法:先创建一个对应于串口的句柄,创建成功后对该串行口的所有操作都是对该句柄的操作;可以指定被检测的事件消息;设置串行口发送缓冲区和接收缓冲区的大小,这可以根据所传输的数据量来指定;在设定串口参数实际是填充一个已经定义好的DCB数据结构[3];注意在自定义数据接收和发送函数中要隐含相关的通信校验协议,如设置初始位特殊值和末位和校验,这样封装在该类的数据校验功能对于调用者是透明的,调用者看不见也不知道这个功能的实现。良好的编程风格要求对所调用函数的返回值进行恰当的处理,以保证相关功能已经被正确执行和防止软件系统进入陷阱。各函数中参数和返回值可以直接从联机帮助中得到。串口初始化的代码段为:hCom=CreateFile(COM1,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);//创建一个标识串口的句柄com_mask=SetCommMask(hCom,EV_RXFLAG);if(com_mask==0)returnNULL;//指定监视事件com_buff=SetupComm(hCom,4096,4096);if(com_buff==0)returnNULL;//设置端口缓冲区com_state=GetCommState(hCom,&dcb);if(com_mask==0)returnNULL;//通过DCB结构定义串口参数dcb.BaudRate=9600;dcb.ByteSize=8;dcb.Parity=NOPARITY;dcb.StopBits=ONESTOPBIT;com_state=SetCommState(hCom,&dcb;if(com_mask==0)returnNULL;在应用程序中使用该串行口通信类定义的功能很方便,首先生成该类的实例,对于使用多串口的计算机,每个串口要创建一个实例,实例与物理串口对应。然后直接调用该实例中传送数据的成员函数即可。2.3Windows和DOS之间的通信只要参与通信的两台计算机串口参数设置一致,Windows端和DOS端的通信软件可以依照上述方法分别进行准备,只不过要“就低不就高”,Windows也按每次传送一个字节的方式发送数据,否则DOS端不能正确接收,Windows端每次也只接收到一个字节的数据。只要在CMyCom类中分别定义一个按字节发送和接收数据的成员函数就可以实现与DOS的通信了,注意两端自定义的数据校验协议要相一致。在这种情况下,串行通信的特点等同于DOS之间的通信。在一系列的训练仿真系统中,作者使用过如下的通信方案:本机Windows下的VC++与另一台微机DOS下的TurboC和一单片机汇编语言;本机Windows下的VC++与微机Windows下的VC++表1数据拆分组合方法发送一个16位的数据接收一个16位的数据voidsend_d(shortintd){unsignedcharc1,c2;c1=d8&0x00ff;bioscom(1,c1,port);c2=d&0x00ff;bioscom(1,c2,port);}shortintrecieve_d(void){unsignedcharc1,c2;shortintd1,d2;c1=bioscom(2,0,port);c2=bioscom(2,0,port);d1=(c18)&0xff00;d2=c2&0x00ff;return(d1|d2);}通信;本机Windows下的VC++与另一台微机DOS下的TurboC和以太网上5台微机网络通信。这些项目已经在工程中运行了几年时间,体会了自定义串行通信控制软件给实际应用带来了的灵活性。3.串行通信方案的比较和选择在Windows下可以使用大的数据缓冲区传送数据,与DOS下的方式相比较明显的提高了效率和可靠性。另外,串行通信功能以库函数形式可以在同一项目中供不同开发人员使用,并确保在使用过程中不被修改,保证软件系统乃至整个系统运行的安全性,也使大型项目软件的开发易于组织、维护和升级,可扩展性也明显增强。自定义的发送和接收函数可以具有强大的功能和灵活性,可以在这个类中针对不同的需要定义不同的发送和接收的功能函数,比如在这个类中分别定义定长或不定长的双精度或字符型或双字节整型的传送函数,也可以从该串口通信类中派生一个有特殊需要的通信控制类,提高重用性,这些通信功能的扩展完全不必修改调用它的应用程序。大大提高软件开发的效率。在DOS下,明显的限制就是每次只能发送一个字节的数据,降低了传输效率,适合于传递字符而不适合于传递浮点数,实践中检测到由于参与通信的两台计算机由于硬件电路的差别可能造成发送和接收周期不同步,经过一定时间的积累,通信过程中会有数据丢失;由于对数据拆分后按字节传输,当某次传输不成功时,接收端的数据就难以组合复原,实际监测可能发现不能复原的错乱数据,虽然严格的数据传输校验可以保证数据的可靠性,但无效数据多,效率低,实时性难以满足要求。以上的比较充分体现了面向对象编程的优点,提高软件开发的效率,这是软件工程的思想[4]。借助VC开发环境,Windows下串行通信软件开发工作可以方便实现。4.结束语在实际应用中,在DOS下或者在Windows下进行串行通信方案需要考虑到整个项目其他硬件和软件因素,建议在可能的情况下选择Windows环境下开发串行通信的相关软件,这从上述分别介绍的DOS下和Window下串行通信的实现方法就可以得出明确的结论。Windows下的方式代表了软件开发和管理的先进思想。根据多个工程项目的实践体会,数据量大、有实时性、同步性要求的数据传输应该选在Windows下进行。对于传送实时性要求不高的或字符型变量的命令信息或少量的数据在DOS下进行也可行,不同的传送方式作者在不同的项目中都使用并验证过。最终的方案还要在现场环境下测试通过,主要检验传输误码和传输时间。以满足可靠性和实时性的要求。参考文献:[1]叶欣.TURBOC参考手册.北京:学苑出版社,1994.5[2]黄锡滋.软件可靠性、安全性与质量保证.北京:电子工业出版社.2002[3]李国徽,王涛,潘琳.VisualC++6.0编程实例技巧.武汉:华中理工大学出版社,1999.10[4]陈世鸿,朱福喜,黄小松等.软件工程原理及应用.武汉:武汉大学出版社,2000.12
本文标题:自定义串行通信软件的方法
链接地址:https://www.777doc.com/doc-2117567 .html