vb开发通信软件(cloud转贴)(3) Windows串行通信驱动程序的事件驱动特性仍有不稳定的缺陷。如InputLenΚ0时,有可能取出不完整的数据。为保证可靠,采取降低处理速率的方法,保证下位机发送的数据流完整地进入输入缓冲区。设InputLenΚ1,即每次从缓冲区中取一个字符。也可采用轮询方法,定时检测输入缓冲区。下位机定时发送数据:Sub Timer1-Timer()If comm1.CDHoldingΙΛcdThenstr1$-text1(i).Textstrin2$Κstrin1$′上一字符串strin1$Κstr1$′当前字符串strin3$ΚFormat$(Len(strin1$),″0000″)&chr$(8)&strin2$′传送当前字符串长度,以及上一字符串内容com m1.OutPutΚstrin3$Do DoEventsLoopUntilcomm1.OutBufferCountΚ0ElseTimer1.EnabledΚ0End IfEnd Sub上位机检测CD状态,判断是否连通、并接收处理数据。Sub Comm1-OnComm()Select Case comm1.CommEventCase5 ′MSCOMM-EV-CD检测CD状态,判断是否连通comm1.InBufferCountΚ0′清输入缓冲区comm1.RThresholdΚ4′当输入缓冲区中有五个字符,Case2′MSCOMM-EV-RECEIVE产生EV-RECEIVE事件,接收处理数据Do DoEventsIfcomm1.InBufferCountThen′循环从缓冲区中取数据str1$Κstr1$+comm1.InputElseExit DoEnd IfLooplen2Κ1en1′当前字符串长度len1ΚVa1(Left$(str1$,5))′即将发送的字符串长度comm1.RThresholdΚlen1+4strin$ΚRight$(str1$,len2)′数据处理……End Selectstr1$Κ″″End Sub4.根据设置的AT命令“&D2”,当置DTR信号为低时,Modem挂机进入命令状态。也可通过串口输出““+++ATH”+chr$(13)”字符串挂机。Sub Hang-click()If comm1.CDHoldingΙΛcdThen′检测CD,判断是否挂机comm1.DTRenableΚ0comm1.DTRenableΚ-1′置DTR信号为高,为下一次通信准备End IfEnd Sub5.退出程序时,一定要关闭串口Sub Exitcomm()comm1.PortOpenΚfalseEndEnd Sub四、Windows通信机制和VB3.0通信控件潜在缺陷在通信软件编制过程中,我们发现Windows下通信机制采用的“事件驱动”在实际运行中不稳定。如在文件传输过程中,误码和数据丢失的情况时有发生;若串口波特率过高,会产生无法通信或在通信过程中随机挂机的情况。这主要是由于Windows本身通信机制和通信线路介质及质量的影响。为保证数据传输稳定可靠,可采用通信协议如XModem-CRC或YModem。在MSCOMM.VBX通信控件中,Rthreshold属性值大小与输入缓冲区InBufferSize大小有关,当Rthreshold值较接近InBufferSize值时,有可能不产生EV-RECEIVE事件,为保证产生该事件,可将InBufferSize值取得较大