vb开发通信软件(cloud转贴)(2) CommandButton1CallCaption ″拨号″CommandButton2hangCaption ″挂机″CommandButton3ExitCaption ″退出″下位机控件清单控件名称 属性Form1Form1Caption ″下位机通信″MsComm comm1CommandButton1hangCaption ″挂机″CommandButton2ExitCaption ″退出″Timer1Timer1Interval 3000Text(i)Text(i)1.串口初始化、设置程序在程序初始化时,先对串口初始化。因为使用RTS/CTS握手信号的硬件设备只有RTS信号置为高才能接收数据,所以需将MSCOMM通信控件的RTSenable属性设为TRUE。由于Modem在处于命令状态时,通过串口发送的命令以及命令结果均会回显在输入缓冲区中,因此在进入在线状态前,禁止产生EV-RECEIVE事件,避免数据误处理。由于Windows是多任务系统,在进行数据收发循环处理时,应调用DOEVENTS事件,将控制权交还系统,允许Windows执行其他任务。但应注意,在处理OnComm事件时小心使用DOEVENTS,避免系统又产生OnComm事件,造成嵌套,出现堆栈溢出错误。Sub Form-Load()comm1.CommportΚ1′COM1口通信comm1.SettingsΚ″9600,N,8,1″′波特率9600,无校验,8位数据位1位停止位comm1.OutBufferSizeΚOUTPACK′设置输出缓冲区大小comm1.InBufferSizeΚINPACK′设置输入缓冲区大小comm1.InputLenΚ1′每次从输入缓冲区中取一个字符comm1.RTSenableΚ-1′RTS信号为高comm1.RthresholdΚ0′不产生MSCOMM-EV-RECEIVE事件comm1.PortOpenΚ-1′打开串口cdΚcomm1.CDHolding′取载波检测信号线原始状态comm1.outputΚ″ATQOV1WOSOΚ1&C1&D2&YOWO″′初始化ModemDo DoEventsLoopUntilcomm1.OutBufferCountΚ0End Sub2.上位机拨号呼叫下位机SubCallcom-Click()Comm1.OutPutΚ″ATDT″&Phonnum$&chr$(13)′向Modem发拨号命令Do DoEventsLoopUntilcomm1.OutBufferCountΚ0End Sub3.下位机Modem应答,连通后开始定时传输数据下位机检测CD,判断是否连通:Sub Comm1-OnComm()Select Casecomm1.CommEventCase5 ′MSCOMM-EV-CDTimer1.EnabledΚ-1′启动定时器End SelectEnd SubVB传送定长字符串,数据接收处理相对简单。但在发送实时数据时,若将数据转换成定长字符串,这样会大大降低传输效率。在接收端,通知程序从输入缓冲区中取字符有两种方法:一是用轮询方法循环判断InBufferCount是否为0;另外就是利用Rthreshold属性触发“OnComm”事件及“CommEvent”属性中EV-RECEIVE事件。当Rthreshold的值不为0时,允许产生EV-RECEIVE事件。该属性设置和返回在通信控件设定CommEvent特性为接收和产生OnComm事件之前要接收的字符数。VB传送变长字符串时,接收端的Rthreshold值要作相应的改变,以确保接收数据及时准确。下位机定时发送字符串“strin3$ΚFormat$(Len(strin1$),″0000″)&chr$(8)&strin2$”。strin1$为当前字符串,strin2$为上一字符串。上位机根据接收strin3$中Len(strin1$),相应改变RthresholdΚLen(strin1$)+4。这样,通过提前发送字符串长度,改变Rthreshold值可实现发送变长数据。