FILENAMERCC串口通讯协议V10_第1页
FILENAMERCC串口通讯协议V10_第2页
FILENAMERCC串口通讯协议V10_第3页
FILENAMERCC串口通讯协议V10_第4页
FILENAMERCC串口通讯协议V10_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、rcc串口通讯协议1 介绍32 本文目标33 读者要求34 系统构造图35. rcc串口通讯协议概要说明46. rcc串口通讯协议详细说明56.1. 帧格式56.l1.数据帧格式.56.l2.应答帧、检测帧、检测应答帧、abort m 系统借谋帧格式562处理流程66.2.1. 数据分帧及数据重组6622.数据发送流程.76.2.3. 数据接收流程.76.3. rcc 状态76.4. rcc帧类别87. rcc内部结构图97.1. 重要数据结构、宏定义、消息及函数1072数据处理模块127.3. 初始化/设置模块127.4. 状态查询模块127.5. 消息处理模块127.6. 内部处理函数13

2、8. rcc串口读写线程及发送接收函数算法描述138.1. 串口读线程138.2. 串口写线程1482发送函数148.3. 接收函数159. rcc可靠性分析179对等通讯可靠性189.2异常对方通讯可靠性1810. rcc速度分析及可扩充性1910.1. rcc速度分析1910.2. rcc可扩充性19102丄协议集扩充.1910.2.2. 参数协商.20102.3压缩数据方式:2010.24.异步传输方式:2011 附录(appendix)2010.1 参考(reference)201介绍串口通讯在客户端/服务器类型的应用程序设计屮经常要使用到,目前串口通讯采用的 般是专用软件包或者标准串

3、口通讯协议(如xmodem、zmodem等),这样完整详细且 免费的软件包比鮫少,所以在spcomm的基础z上建立了本文所描述的串口通讯协议,称 之为rcc(表示为reliable comm communication),其主要目标是在用串口i!t行通讯的客八 端/服务器双方建立一条可靠的通讯链路,就象tcp(rfc793)一样。该协议的目前的开发是 采用vc+,应用平台为win95/nt,但作为rcc协议的本身不受具体编程语言及操作系 统所限制,2 本文目标本文的目标在于描述rcc串口通讯协议设计思路以及其详细设计说明,还冇相关的 串口通讯技术(win95/nt)o3 读者要求 熟悉串口通讯

4、方式 熟悉win95/nt线程机制及界步文件调用方式 对vc+有一定的了解 一般协议的描述方式4 系统构造图系统构架如下方式:客八端应用程序服务器端应用程序应用程序之间数据交互rcc串口通讯协议rcc串口通讯协议5.rcc串口通讯协议概要说明rcc串口通讯协议设计思想是基于帧传输方式,即在向modem(rs232)发送数据时是一帧 一帧地发送,对于应用程序来讲,应用程序所发送的和所接收的都是流式数据,即如果应用 程序需要进行上层的协议解释的话,它将而对这些流数据的更新拼装。为保证可靠的传输, 在rcc进行数据传输时,采用发送/应答/握手/失败方式,即发送一帧数据,一个应答,若 应答没收到,重新

5、进行协商握手,握手失败则向应用程序报告错误。在利用rcc进行实际的应用程序设计时,首先笫一步通过rcc进行串口初始化操作,在串 口初始化成功时,rcc通过界步消息rcc_connect向应用程序报告,此吋一条通讯链路 建立完毕。应用程序开始发送数据,这是通过send调用实现的,rcc根据内部缓冲区的人 小决定真正可发送的数据最返回给应用程序,数据将被存储在内部缓冲区内(此缓冲区人小 可由应川程序调节),rcc将内部缓冲区的数据分割成一帧一帧,每一帧将调川内部线程通 过win95/nt向modem/rs232发送数据,当数据金部发送完毕(即内部缓冲区为空),则 向应用程序发送rcc_write消

6、息表示数据全部发送完毕,应用程序将可继续发送余下的 数据,在接收方,如果数据到达了,由win95/nt通知rcc,由rcc接收到达的数据,当 到达一帧时,对到达的数据进行解包,若发生错谋则通过指定方式进行重发或协商abort, 当通讯能继续则不向应用程序发送任何消息,继续保持链路,若通讯不能继续,则abort 此链路,并口向应用程序发送rcc_error的消息,应用程序将重新reset此链路或进行 其它相应的处理。当数据被解包到内部缓冲区吋,将发送rcc_read消息到应用程序,表 示数据可用了,应用程序将调用receive接收相应的数据(注意此时的数据并不是发送时的 数据,而是被割成一帧一帧

7、的),也可通过相应的调用查询所接收到的数据最。另外当有任 何一方断开链接,应川程序将接收到rcc_close消息,表示此链路己经断开(modem挂 机)。6.rcc串口通讯协议详细说明6工帧格式帧格式包插帧头和数据区,其中对于任何帧而言,帧头固定为八个字节,若该帧类型需要数 据才有数据区,否则只有帧头。6.1.1数据帧格式帧头标志版本号类別帧头校验和帧号数据总长度保留数据crc校验数据区数据区帧头标志(1 byte),表示此数据包是属于rcc串口通讯协议,为字母0x12。版本号(4 bit)为rcc数据帧的版本号,目両为零,意为零版类别(4 bit),此帧的类别,目前冇四种类别,0表示数据帧,

8、1表示应答帧,2检测帧(用于 检测对方是否在线),3为检测应答帧,4为abort帧,5为系统错误帧(接收方发出通讯底 层系统错误,指示对方发送刚发送的任何一帧,包括应答帧、检测帧、检测应答帧),其它 帧类别目前保留。头校验和(lbyte), checksum是对帧头八个字节进行的校验,类似于ip协议帧头,只是对 帧头另外七个字节的累加,填入。帧号(lbyte),帧号是发送的顺序号,可用值为1-255, 0保留用作其它用途crc检验是指对整个数据区进行的crc校验,首先将此域清为零,然后生成crc校验填 入,接收时先得到crc校验,然后将此域清零,再计算其crc,以检查数据传输是否正确 还是错谋

9、。总长度表示当前数据的总长度,不包括数据crc校验的长度。数据为具体所发送的数据内容,最长不得超过2048字节,即整个帧不超过2058个字节,缺 省为512字节,512字节应该相对串口比较稳定的数据发送单位。如果此数据帧为压缩数据帧,则数据区内的笫1、2个字节为压缩数据的压缩前长度。6.1.2.应答帧、检测帧、检测应答帧、abort帧、系统错误帧头标志版本号类别帧头校验和帧号数据总长度保留帧头标志、版本号、类别、头校验和同上帧号为上一次发送/接收帧的帧头,对于abort而言,帧号为零。对于应答帧、检测应答 帧、syserror帧为上一次最后收到的帧号,对于检测帧而言,是发送端最后一次发送的帧号

10、。 数据总长度对于此类消息帧而言无意义,n前为零。保留,目前为零此类帧类型恒为8个字节。图6. 1 rcc数据发送流程图62处理流程621数据分帧及数据重组应用程序送过來的数据作为一个流而放入rcc内部缓冲区内,由rcc按rcc协议进行分 帧,切割进行发送,在接收端,分帧的数据去掉帧头重新归到接收缓冲区流,由应用程序接 收。整个过程的示意如门应用程序数据rcc发送缓冲区rcc接收缓冲区622数据发送流程623数据接收流程图6. 2 rcc接收流程图6.3.rcc 状态rcc在其生命周期中有以下状态, rcc_stat_init初始化状态,在初始化状态z下,系统刚刚对rcc进行初始化,内 部缓冲

11、区清空,各个状态复位。 rcc_stat_comm通讯状态,在此状态z下,通讯链路建立好,可以进行数据通讯。 rcc_stat_data数据通讯状态,rcc刚发送一帧数据,在等待对方数据应答。 rcc_stat_polling发送检测帧状态,rcc刚刚发送一个检测帧,在等对方的检测 应答帧。rcc状态转换机如下(图6.3,从stat_comm状态开始):状态转换机说明:rcc最初为statjnit,当通讯链路建立完毕(收到了 rcc_connect消息吋)rcc则进入 stat_comm状;态,正式进入通讯状态。当发送数据,则进行stat.data状态,此状态 卜接收到数据帧时处理完毕后回到s

12、tat_comm状态,如果接收到abort帧时,则转到 stat_abort,重新初始化又冋到stat.init,接收到其它任何帧则忽略。进入到 stat_data状态时,接收到正确应答帧时(即与上一帧发送的帧号一样),则回到 stat.comm状态,接收到错误应答帧或者是系统错误帧时,则重发上次的数据帧,状态 不变,接收到abort帧时,则进入到stat_abort,重新初始化又回到statjnit状态, 在此状态卜-如果超时(超时时间可设直),则发送检测帧用于检测对方是否在线,此时进入 stat.polling状态。在stat_polling状态下,接收到检测应答帧,如果检测应答帧数 据内

13、容表示上一帧已经接收到,贝i直接回到stat_comm状态;若上一次未收到则重发上 帧,若上数帧未收到,贝ij发送abort帧,断开链接,进入stat_abort状态;如果是 系统错误帧,则重新发检测帧;如果超时还未接收到检测应答帧,则发送abort帧,断开 链接,进入stat_abort状态;应答错误帧(系统牌误帧),犁工趣吋处理宀发選 polling帧* stat_datastat cow接收到abort帧红虚线:终止处理 黑线:止常处理 蓝点线:错误处理t收到检测应答帧 贞未收到)帧处肖完毕后 则向到该状态,英左忽略接收到检测应答帧、接收到abort帧图6. 3 rcc系统状态转换图俭答

14、错误帧係统 x®误帧),重发stat_poll八ing超时处理'发送abort帧. *接收到abqrt帧)、 stat abort6.4.rcc帧类别rcc有以下七类帧,数据帧、压缩数据帧数据应答帧、检测帧、检测应答帧、系统错误帧、abort 帧,数据帧(frmdata)数据帧是用于发送数据时使用的帧,数据帧长度为(8b<length<=2058b),最长为2048b+2b(data crc)+8b(header),数据帧类别为0,帧号由1-255循环,crc检验只包括 数据区,总氏度为数据区的氏度。压缩数据帧(frmzippeddata)压缩数据帧基本上同数据帧

15、内容一样,只不过是在数据区内的而两个字节,表示压缩而的长 度,rcc在发送数据时,将口动选择压缩,如果压缩后比压缩前的数据耍少(大部情况),则 使用压缩数据帧,否则使用数据帧。数据应答帧(frmdataanswer)数据应答帧是用于应答对方数据吋使用的帧,数据应答帧为8字节长,类别为1,其中帧号 表明最后一次接收到数据帧号,若接收方发现与自已最后一次发送的帧号一样,则表示接收 正确,若差一(由于是循环计数,第1帧没收到则发帧号为255)则重发上一帧,若差二以上, 则表示帧同步丢失,则需要向应用程序报告错课,由应用程序调用rcc关闭通讯底层。 检测帧(frmpolling)检测帧是用于检测对方是

16、否存在的帧,类別为2,当发送数据后,超吋等待期间没有收到数 据应答帧,则发送此帧,其中帧号里带上最后一次接收到的帧号,对方收到此帧必须返回检 测应答帧,同时带上上一次最后接收到的帧号。检测应答帧(frmplanswer)检测应答帧指示对方自已在线,类别为3,同时带冇数据应答帧的功能。abort 帧(frmabort)在发送时发生系统错误或检测帧发送一段时间内未得到检测应答时,则发送本帧,类别为4, 对方接受到此帧,则断开链路,重新初始化底层,并返回rcc.close消息到应用程序。 系统错谋帧(frmsyserror)在接收时发生帧头错误时或win95/nt通讯系统错误(比如说奇偶校检错误、超

17、越错误等) 则发送此帧,类別为5。在接受到此帧时则发送上一帧,这里所说的“上一帧”不是指数据 帧,而是指的最后发送任何帧,包括数据帧、应答帧、检测帧、检测应答帧,但abort帧 除外。7.rcc内部结构图rcc内部结构以一个窗口类为基础,下设两个侦听线程,一-个用于读串口,一-个用于写串 口,应用程序调rcc初始化/设置函数对rcc进行操作,通过拔号函数进行链接,通过rcc 的数据接收/发送/错谋函数来处理数据,rcc通过消息发送来通知应用程序数据的到达及发 送完毕等等。rcc内部可分为以下几部分: 串口监听线程(读/写),利用界步文件方式负责对串口进行读写操作,此处是数据发送/ 接收的原始出

18、入口。 初始化/设置串ii模块,负责对modem/rs232进行初始化设置,比如说波特率、校验 方式、停止位、超时等等,还冇对rcc的初始化设置,收发缓冲区大小、发送等待超 时等等,包括建立链接、拔号、侦听等调用。 数据处理模块,其中有发送数据处理及接收数据处理,发送数据处理对发送缓冲区分帧, 通过监听线程发出,同时向应用程序提供接口发送数据(send函数);接收数据处理对监 听线程接收到的数据进行处理,将数据去掉帧头放入rcc血向应用程序的数据缓冲区 内。 消息处理模块,用于接收来win95/nt系统消息、监听线程消息,同时根据处理向应 用程序发送自定义rcc消息,其中消息包括rcc_con

19、nect、rcc_read、rcc_write、rcc_close、rcc_error 五种消息。 状态查询模块,用于应用程序向rcc查询状态的函数,比如接收缓冲区人小、当前缓 冲区数据大小等等。其它功能模块。这些模块的协作方式图如下(图6.4)7重要数据结构、宏定义、消息及函数int rccstatus; rcc 当前状态char sendbuffer16k发送数据缓冲区word sendbufferlength发送数据缓冲区长度char receivebuffer16k接收数据缓冲区word receivebufferlength接收数据缓冲区长度char databuffer16k去掉帧

20、头的缓冲区(即而向应用程序的缓冲区)word databufferlength面向应用程序缓冲区长度int prevreceframeno; 上一次接收数据的帧号int prevsendframeno; 上一次发送数据的帧号 char zippedbuf 2048*3;int lasterror;最后错误号hwnd appwindow应用程序窗口句柄frameanalysisbuffer famebuffer;帧分析缓冲区,丿ij于接收时进行帧分析 rccdataframe dataframe;最后一次发送的数据帧rccmsgframe msgframe;最后一次发送的消息帧int lastf

21、rameclass;最丿孑一次发送的帧类别(用于重发处理)structbyte flag; 标志byte version:4; 版本号byte kind:4; 帧类别byte checksum; 帧头检查和byte frameno; 帧号word length; 数据长度word reserved; 保留jrccframehead; /crc 帧头格式#define rccmsgframe rccframehead; /rcc 消息帧格式 structrccframehead header; 帧头word crc; 数据区crc校验 chardata512; 数据区jrccdataframe;

22、 /rcc 数据帧格式#define frameanalysisbuffer rccdataframe;宏定义:#define wm_rccnotify#define rcc_connect#define rcc_read#define rcc.write#define rcc_close#define rcc.errorwm_user+200512345rcc_connect通知消息告知应用程序底层链路已经建立好可以发送和接收数据;rcc.read告知应用程序rcc底层接收到数据;rcc.write告知应用程序rcc底层数据发送完毕,应用程序可以继续发送剩余数据;rcc_close告知应用程

23、序rcc底层链路已经正常或异常断开;rcc_error告知应用程序在通讯时发生通讯错误#define rcc_stat_init#define rcc_stat_comm#define rcc_stat_data#dcfinc rcc_stat_polling#define rcc_stat_abort1初始化状态2通讯状态3发送数据状态4检测状态5屮断状态错误处理宏定义#define rcc_error_success#dcfinc rcc.errorjnit#define rcc_error_sync0处理成功1初始化错误2同步错误72数据处理模块int send(char *buffer

24、jnt buflen);发送数据,返i叫1表示发送失败,其它则表示发送字节数int receive(char *buffer,int butlen);接收数据,返回1表示接收失败,具它则表示接收的字 节数。int conncct(char *phoncno);链接服务器,在modem方式下,phoncno为电话号码,最氏 40bytes;返回-1表示失败,其它表示正常。在rs232方式下,phoneno为null;int listen(void);服务器侦听,在modem方式下,将modem置成自动侦听状态atso=1 方式,dtr灯亮;在rs232方式下,设dtr。7.3 初始化/设置模块i

25、nt initialize(void);初始化rcc,返回1表示失败,其它表示成功int reset(void);重新复位rcc,返回表示成功,其它表示失败int setcomm(lpdcb *dcb);设定win95/nt通讯底层参数。返冋消息参数win32 sdk int getcomm(lpdcb *dcb);得到win95/nt通讯底层参数。返冋消息参数win32 sdk int setsendtimeout(int ms);设置发送超吋,单位毫秒int getsendtimeout(int ms);获取发送超时,单位毫秒int setpollingtimeout(int ms);设置

26、检测超时,单位毫秒int getpollingtimeout(int ms);获取检测超时,单位毫秒int sctscndbuffcr(int size);设置发送缓冲大小,缺省16kint setrecebuffer(int size);设置接收缓冲大小,缺省16kenumsize_16,size_32,size_64,size_12&size_256,size_512;)blocksize;int setcommblock(blocksize size);设置每一帧数据最大大小,缺省 512b7.4.状态查询模块int getlasterror(void); /得到最后一,次错误号

27、int getsendbufferlength(void);得到发送缓冲区大小int getrecebufferlength(void);得到接收缓冲区人小int getrecelength(void);得到当前接收缓冲区内的数据量int getsendlength(void);得到当前发送缓冲区内的数据量int getcommblock(void);得到每一帧数据最人人小,缺省512b75消息处理模块messagewparamlparamwm rccnotifyrcc connectdeviceid(设备号)保留,目前为()wm.rccnotifyrcc readdeviceid(设备号)保

28、留,目前为0wm rccnotifyrcc writedeviceld(设备号)保留,冃前为0wm.rccnotifyrcc closedeviceid(设备号)保留,目前为()wm rccnotifyrcc errordeviceid(设备号)保留,目前为0其中设备号在rcc之中指的端口号,1代表com1, 2代表com2.255代表com255等 等。7.6 内部处理函数内部处理两数主要是为实现接口功能而使用的一些断数。int genoneframe(void); /将sendbuffer之中的数据牛成一个帧,准备发送出去,这将是在被 告知ev_empty时发生。-1返回火败,其它则成功i

29、nt searchhead(void);在receivebuffer之中找到帧头,从而得到一个帧,并将余下的数据放至lj 帧缓冲区内进行分析。int getframe(void);在帧缓冲区內进行帧分析,根据返回的错误进行相应的处理int senddataframe(void);将生成的数据帧通过串口写线程发送出去。int scndmsgframc(void);将生成的消息帧通过串口写线程发送出去。int getcrc (char *buffer,char buflen);/得到 buffer 的 crc 校验码,用 j:检查 crc。int postrccmessage(int msg,in

30、t notify);向应用程序发送 rcc 消息。8.rcc串口读写线程及发送接收函数算法描述.1.串口读线程close event =程序关闭事件comm event二串口消息事件read event =界步文件读事件(1) initialize for comm read thread清接收临时缓冲区创建串口消息事件comm event创建串口杲步文件读事件read event设置串口屏蔽通知消息ev_erriev_rlsdiev_ring(2) wait for event(3) if event=close event then go (17)(5) else if event=com

31、m event(6) handle comm event and send conun message to rcc(7) if result = ev_err then clear the error, clear buffer, send error message to peer(8) else if result = ev.ring then notify app that modem is ringing(9) else if result = ev_rlsd then notify app that rcc was establish(10) else shouldn't

32、happen.(11) setup comm event for next active;(12) else if event= read event(13) read data to temp buffer,then call rcc to receive this data,then rcc reassembly the rcc frame;(14) setup read event for next active;(15) else shouldn't happen;(go(17) clear up the comm data (win95/nt layer, use purge

33、comm)(18) destroy event,include comm event and read event(19) comm read thread complete;2 串口写线程close event =程序关闭事件write event =界步文件写事件iparam为长度pwm.commwrite =线程写串口消息,wparam为缓冲区,(1) initialize for write thread(2) wait for a thread message.(3) wait for close event then go (8)(4) translate and dispatch

34、 message(5) if message =pwm_commwrite then(6) handle write data to w1n95/nt comm layer(7) do write data until all data send finish(8) clear up the comm data (win95/nt layer, use purgecomm)(9) destroy event,include write event(10) conun write thread complete;2 发送函数发送函数主要是指int send(char buffer,int buf

35、len),发送函数首先将数据拷贝到发送缓冲区 (如果缓冲区不够,且只拷入部分数据),然后根据当前通讯状态做相应处理send buf =发送缓冲区send buflen =发送缓冲区长度send bufmaxlen =发送缓冲区最大长度status = rcc 状态data frame buf = dataframc 变量,参考 7.1write thread =串口 写线程入口参数:buf=数据buflen =数据长度result =返回长度(1) if status = rcc_stat_init or status = rcc_stat_abort then(2) set lasterro

36、r to no connect ,the n ex it, return -1(3) copy len = min(send bufmaxlen 一 send buflen,buflen);(4) memcpy(send buf,buf,copy len); result = copy len;(6) if status = rcc_stat_polling or status = rcc_stat_data then(7) exit and return result;(8) if status = rcc_stat_comm then /send first data(9) call ge

37、noneframe function / generate one frame from send buf,put it to dataframe buf(10) call senddataframe function / send data frame to write thread(11) return result;剩下的数据在接收到answcrok时写入下一帧on ev_txempty message:(1) if send buflen = 0 exit(2) call genoneframe function / generate one frame from send buf,p

38、ut it to data framebuf(3) call senddataframe function / send data frame to write thread3接收函数接收函数主要是指read thread来的通知消息pwm.commread ,而不是应用程序 所调用的int rcccivc(char buffer,int buflcn),receive只是简单将已经解好的数据拷入到应用 程序zm。接收函数主要是分析接收缓冲区,如果是数据帧则将其放入面向应用程序的缓冲 区之中,并且发送数据应答帧,如果是其它帧,分别做相应的处理。recebuf=接收缓冲区rece buflen

39、=接收缓冲区的数据量rece bufmaxlen =接收缓冲区的最大长度status = rcc 状态data frame buf = dataframe 变最,参考 7.1msg frame buf = msgframe 变量,参考 7.1write thread =串口 写线程read thread =串口读线程lasterror =错误号minframesize =最小帧长度,rcc 为 8bdata buf =面向应川程序的数据缓冲区data buflen =面向应用程序的数据缓冲区大小data bufmaxlen =血向应用程序的数据缓冲区最人人小 入口参数:buf=接收到的数据bu

40、flen =接收到的数据长度(1) if status = rcc_stat_init or status = rcc_stat_abort then exit /impossible(2) 1f rece buflen + buflen > rece bufmaxlen then(3) set lasterror to buff'eroverflow exit;(4) memcpy(&rece bufrece buflen,buf,buflen) /copy data to rece buf(5) whilc ( rece buflen >= minfkamesi

41、ze) do(6) result = call getframe(7) data buflen += result(8) if data buflen > data bufmaxlen then(9) set lasterror to bufferoverflow(10) scndmsgframc send abort frame and post it to application then exit;(11) enddo(12) post message to application to get these data;getframe主要功能是从流式的缓冲区内找到一帧数据,并根据帧

42、数据内容做相应的处理, 然后则返回。pos = rece buf的指针,用于分析数据用temp data frame buf =临时的数据帧缓冲temp msg frame buf=临时的消息帧缓冲temp frame header =临时的帧头(i) pos = call scarchhcad function to search frame head from rece buf; pos +(3) temp frame header = get frame header(4) if checksum = error then(5) sendmsgframe(syseitor);(6) cl

43、ear win95/nt comm buffer; / purgccomm(rx_clear);(7) clear rcc receive buffer; then exit; /rece buflen = 0;(9) if rece bufpos&0xfo » 4 ! = 0 then(10) sendmsgframe(frmaboil); then exit;(ii) framctypc <= rece bufpos&0x0f;(12) if frametype!= frmdata or frmanswer or frmpolling or frmplans

44、wer then(13) sendmsgframe(frmabort);(14) postmessage to app and reinit then exit;(15)(15) if framctypc = frmdata then(16) data length frame header(17) if not (data length >1 and data length <=512) then(18) sendmsgframe(frmabort); then exit;(19) if rece buflen(rest) < data length then(20) do

45、 nothing then exit;(21) frameno <- frame header;(22) temp data frame buf = get data from rece buf(23) if checkcrc = error then(24) scndmsgframc(frmanswcr); del dealt data then exit;(25) if frameno = lastframeno + 1 then /get one frame(26) memcpy(&data bufdata buflenj,&rece bufposj,length)

46、;(27) sendmsgframe frmanswer ok(28) else if frameno = lastfrmeno then sendmsgframe frmanswer ok;(29) else lasterror = asyncerror scndmsgframc(frmabort) init then exit;(30) else if frametype = frmanswer(31) if frmanswer ok then(32) status = rcc.statjnit(33) send next frame(34) exit;(35) else /or sync

47、 error(36) resend last frame(37) else if frametype = frmpolling(38) if checkcrc error then sendmsgframe(frmsyseitor)(39) scndmsgframc(frmpi answer)(40) else if frametype=frniplanswer(41) if checkcrc error then sendmsgframe(frmsyserror)(42) if frmplanswer ok then(43) status = rcc_stat_init(44) send n

48、ext frame(45) exit(46) else(47) resend last frame(48) else if frametype= frmabort(49) reinit exit(50) else if frametype = frmsyserror(51) resend last "any" frame(52) clear dealt data /memcpy(&rece bufpos,&rece bufposrece buflen -pos ) rece buflen 二 pos(53) complete9.rcc可靠性分析本处所进行的r

49、cc可靠性分析,需要建立在以下两点的基础z上:1. 驶件(modem & com 口)盂要保证数据的传输,在发生错误的情况下,予以指示,比如说超越错、奇偶校验错等,dtr, dsr, cts, rts等2. win95/nt底层的可靠性,也就是win95/nt能及时正确的返冋modem/rs232的状态 等9.1对等通讯可靠性所谓对等通讯是指的对方使用的也是rcc底层通讯,在此,考虑硕件通讯的正常性及 win95/nt通讯底层,讨论rcc是否能保证英可靠的通讯状态。rcc的可靠性是有两个理论基础:1帧方式。通过帧方式,判断帧头起始字符来决定一帧的开始,这样就避免了部分数据进入 到rcc

50、的内部处理之中,这个可能性在1/256,另外通过版木号的判断,可将这个可能性 再降低1/16,再有通过一些保留字节日前为零,则亦可做为判断字节。另外更重要的是通 过帧头检查和来判断帧头是否正确,由正确的帧头继而进行分析。2.crc校验。通过整个数据帧进行crc校验,來保证数据及帧头的止确性,crc校验是16 位的,这样一帧错误的可能性则微乎其微了。在实际应用方而,目询rs232的适用环境为儿米的范围之内,若短距离传输的可靠性比较 高(%更件),另外若小间接上modem通过ddn/pstn來传输的话,目前市场上的modem 绝人部分都支持mnp 2类至4类的纠错协议或者是ccitt v.42纠错

51、协议,(modem速度 己经近极限,各人厂商基本上都是将modem的可靠性不断优化,捉高),所以在modem 一级上已经做过比较好的硕件处理了。rcc的纠错功能体现在以下儿方面:1如杲帧头错谋将发送syserror帧,同时清接收缓冲区,告知对方重发最后一帧。2. 如果帧数据错误将发送数据应答帧,告知对方重发最后一帧。3. 如果等待数据应答帧超过延时,将通过检测帧检测对方是否存在。如果等待检测应答帧收到则根据帧号乂可继续运行,如果没收到则到超时后就发送abort 侦,之后则进入abort状态等待重新初始化。9.2异常对方通讯可靠性异常对方通讯指的是对方使用的并不是rcc底层通讯,则此时防止任意的

52、数据对rcc的破 坏情况,即在任意数据进来的悄况下,保证rcc能保证自身的抵抗性,而且防止这些数据 对应用程序造成的破坏。在异常情况下(有意或无意,有意指的是恶意破坏,无意是指的客户用其它程序拔到rcc服 务器上),如果要进入到应用程序级,首先必须经过帧头的判断才能进入rcc内部处理,如 果是任意数据,这个可能性儿乎很小,因为帧头有帧头标记,帧头校验和,以及保留字,版 本号,数据长度字段,每一个字段都经过严格的限制,另外数据区将有crc进行校验,任 意数据进入应用程序可能是微乎英微。如果是知道协议规范而恶意攻击的话,则冇以下防范:1. 乱序发送:在恶意攻击下,攻击者可能先发应答帧,乂发一个数据

53、帧,或者直接发系统错 误帧。这种类型的防范在于严格的状态转换图(参考图6.3),在何时只接收什么帧,接到什 么帧又做什么处理都有明确的无二义的定义。2. rcc底层实现保证严格的程序设计严密性,这样可以防止诸如缓冲区溢出等等错课。10.rcc速度分析及可扩充性1o.1.rcc速度分析首先必须明确一点rcc的思想在于可靠性,其次再是速度,在可靠的基础上寻求更高的速 度。rcc在不考虑错误发生的情况下,每传送一帧吋需要附加18个字节(其中10个字节用于发 送,8个字节用于应答),按标准的512字节计算的话,其传输效率为以下(忽略计算机dte 的处理时间计算):512/530 = 96%这是理论上的速度,事实述有dte到dcez间的延时,计算机处理的延时,由于rcc冃 询是以同步方式运行的,在其等待对方返回的时间内,不再发送数据,这是一个浪费(但程 序处理上较z简单)。若代入参照数据来算,假设1计算机无论什么时候数据到达都有时间片处理通讯数据,2. 计算机处理的延时(包括dte到dcez间的延时,数据到达应川程序一级的处理)需要10ms, 按全双工28800bps modem算,则rcc效率为:512/530+0.01 *28800/8 = 90%若应用程序一级的处理时间为100ms的话(典型地在hle transafe型的应用程序,应用 程序需要源源不断的数据)。512/530+

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论