VB开发通讯软件

弄啥嘞弄啥嘞

弄啥嘞弄啥嘞

2016-02-19 12:55

今天图老师小编给大家精心推荐个VB开发通讯软件教程,一起来看看过程究竟如何进行吧!喜欢还请点个赞哦~
一、PC串行通信程序机制
  常用的PC串行通信程序大多利用BIOSINT14H中断,以查询I/O方式完成异步串行通信。
  
  Windows系统提供中断方式驱动的串行通信驱动程序COMM.DRV。通信程序无需直接对串行端口进行操作,而是通过驱动程序这一编程接口进行间接操作。
  
  Windows操作系统中,串行通信采用“事件通知”方式,支持数据按块传送。进行通信时,Windows开辟一个用户定义的输入输出缓冲区,每接收一个字符就产生一个低级硬件中断,串行驱动程序立即取得控制权,并将字符放入输入数据缓冲区,然后将控制权返还正在运行的应用程序。如果输入数据缓冲区满了,驱动程序用当前定义的流控制机制通知发送方停止发送数据。发送数据也采用类似的处理方式,应用程序将需要发送的数据放入输出数据缓冲区,串口每发送一个字符就产生一个低级硬件中断。
  
  二、PC串行口远程通信的硬件配置
  
  串行通信数据链中,计算机一端称为DTE,即数据终端设备;调制解调器一端称为DCE,即数据通信设备。PC串行通信的硬件连接方式分为零Modem连接和Modem连接。
  
  零Modem连接即直接用调制解调器电缆将两台设备连接起来,Modem连接则通过DCE(Modem)将两台PC连接起来。
  
  零Modem连接用于距离15m内两台DTE或DCE设备之间的连接。而Modem连接则通过电话网或专线用于长距离的通信。
  
  TXD和RXD信号线用于计算机和Modem间传输数据信息;RTS从计算机端发送信号到Modem,表示希望把数据传给Modem,若Modem能接收这个数据,它将发送CTS信号给计算机;DTR从计算机端发送信号到Modem,表示计算机已作好通信准备,Modem将DTR信号作为初始化自己的信号,然后给计算机回送数据设置就绪信号DSR;当本地Modem接收到远地Modem的呼叫,则发送RING信号给计算机;Modem应答呼叫后,发送数据载波检测DCD信号到计算机,表示已建立连接。
  
  Modem的工作状态分为命令状态和在线状态。处于命令状态时,Modem对串口发送的信息进行解释,可通过PC串口向Modem发送AT命令对其进行初始化、设置和操作。
  
  例如,初始化命令为:“ATQOV1WOSOΚ1&C1&D2&YO&WO”,其含义为:
  
  QO:返回结果码;
  
  V1:以字符形式显示结果码;
  
  WO:不返回协商进程结果码;
  
  SOΚ1:振铃一次,即应答;
  
  &C1:追踪数据载波信号CD;
  
  &D2当DTR从开到关时,Modem挂机进入命令状态;
  
  &YO:Modem上电时重新调出用户方案;
  
  &WO:将以上设置存为动态设置用户方案0;
  
  一旦本地Modem与远地Modem建立连接,Modem即处于在线状态,可进行数据传输。此时,Modem不响应AT命令,直接传送所收到的数据。
  
  三、Modem连接远程通信软件的编制
  
  通信过程中大部分的工作由串行通信驱动软件承担。
  
  本文软件的运行环境为AST+4/66d,Hayes公司的ACCURA144+FAX144Modem,Windows3.2,VB3.0专业版。VB3.0专业版中提供了一个MSCOMM.VBX通信控件。它使用户能很方便地通过对控件属性的设置、检测,访问串行通信驱动程序的大多数特性,而不必考虑其实现细节。该控件为“事件驱动”,只响应“OnComm”事件,该事件可对已发生的事件或错误进行处理,与CommEvent属性紧密相关。
  
  通信软件、通信驱动软件和Modem之间的通信关系
  
  以下程序实现了通信的基本过程。包括初始化串口和Modem,上位机拨号呼叫下位机,下位机应答并开始定时传输数据,挂机停止传输等功能。
  
  VB3.0编制的通信软件清单如下:
  
  上位机控件清单:
  
  控件名称属性
  
  Form1Form1Caption″上位机通信″
  
  MsCommcomm1
  
  CommandButton1CallCaption″拨号″
  
  CommandButton2hangCaption″挂机″
  
  CommandButton3ExitCaption″退出″
  
  下位机控件清单
  
  控件名称属性
  
  Form1Form1Caption″下位机通信″
  
  MsCommcomm1
  
  CommandButton1hangCaption″挂机″
  
  CommandButton2ExitCaption″退出″
  
  Timer1Timer1Interval3000
  
  Text(i)Text(i)
  
  1.串口初始化、设置程序
  
  在程序初始化时,先对串口初始化。因为使用RTS/CTS握手信号的硬件设备只有RTS信号置为高才能接收数据,所以需将MSCOMM通信控件的RTSenable属性设为TRUE。由于Modem在处于命令状态时,通过串口发送的命令以及命令结果均会回显在输入缓冲区中,因此在进入在线状态前,禁止产生EV-RECEIVE事件,避免数据误处理。
  
  由于Windows是多任务系统,在进行数据收发循环处理时,应调用DOEVENTS事件,将控制权交还系统,允许Windows执行其他任务。但应注意,在处理OnComm事件时小心使用DOEVENTS,避免系统又产生OnComm事件,造成嵌套,出现堆栈溢出错误。
  
  SubForm-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″′初始化Modem
  
  DoDoEventsLoopUntilcomm1.OutBufferCountΚ0
  
  EndSub
  
  2.上位机拨号呼叫下位机
  
  SubCallcom-Click()
  
  Comm1.OutPutΚ″ATDT″&Phonnum$&chr$(13)′向Modem发拨号命令
  
  DoDoEventsLoopUntilcomm1.OutBufferCountΚ0
  
  EndSub
  
  3.下位机Modem应答,连通后开始定时传输数据
  
  下位机检测CD,判断是否连通:
  
  SubComm1-OnComm()
  
  SelectCasecomm1.CommEvent
  
  Case5′MSCOMM-EV-CD
  
  Timer1.EnabledΚ-1′启动定时器
  
  EndSelect
  
  EndSub
  
  VB传送定长字符串,数据接收处理相对简单。但在发送实时数据时,若将数据转换成定长字符串,这样会大大降低传输效率。在接收端,通知程序从输入缓冲区中取字符有两种方法:一是用轮询方法循环判断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值可实现发送变长数据。
  
  Windows串行通信驱动程序的事件驱动特性仍有不稳定的缺陷。如InputLenΚ0时,有可能取出不完整的数据。为保证可靠,采取降低处理速率的方法,保证下位机发送的数据流完整地进入输入缓冲区。设InputLenΚ1,即每次从缓冲区中取一个字符。也可采用轮询方法,定时检测输入缓冲区。下位机定时发送数据:
  
  SubTimer1-Timer()
  
  Ifcomm1.CDHoldingΙΛcdThen
  
  str1$-text1(i).Text
  
  strin2$Κstrin1$′上一字符串
  
  strin1$Κstr1$′当前字符串
  
  strin3$ΚFormat$(Len(strin1$),″0000″)&chr$(8)&strin2$
  
  ′传送当前字符串长度,以及上一字符串内容
  
  comm1.OutPutΚstrin3$
  
  DoDoEventsLoopUntilcomm1.OutBufferCountΚ0
  
  Else
  
  Timer1.EnabledΚ0
  
  EndIf
  
  EndSub
  
  上位机检测CD状态,判断是否连通、并接收处理数据。
  
  SubComm1-OnComm()
  
  SelectCasecomm1.CommEvent
  
  Case5′MSCOMM-EV-CD检测CD状态,判断是否连通
  
  comm1.InBufferCountΚ0′清输入缓冲区
  
  comm1.RThresholdΚ4′当输入缓冲区中有五个字符,
  
  Case2′MSCOMM-EV-RECEIVE产生EV-RECEIVE事件,接收处理数据
  
  DoDoEvents
  
  Ifcomm1.InBufferCountThen′循环从缓冲区中取数据
  
  str1$Κstr1$+comm1.Input
  
  Else
  
  ExitDo
  
  EndIf
  
  Loop
  
  len2Κ1en1′当前字符串长度
  
  len1ΚVa1(Left$(str1$,5))′即将发送的字符串长度
  
  comm1.RThresholdΚlen1+4
  
  strin$ΚRight$(str1$,len2)′数据处理
  
  ……
  
  EndSelect
  
  str1$Κ″″
  
  EndSub
  
  4.根据设置的AT命令“&D2”,当置DTR信号为低时,Modem挂机进入命令状态。也可通过串口输出““+++ATH”+chr$(13)”字符串挂机。
  
  SubHang-click()
  
  Ifcomm1.CDHoldingΙΛcdThen′检测CD,判断是否挂机
  
  comm1.DTRenableΚ0
  
  comm1.DTRenableΚ-1′置DTR信号为高,为下一次通信准备
  
  EndIf
  
  EndSub
  
  5.退出程序时,一定要关闭串口
  
  SubExitcomm()
  
  comm1.PortOpenΚfalse
  
  End
  
  EndSub
  
  四、Windows通信机制和VB3.0通信控件潜在缺陷
  
  在通信软件编制过程中,我们发现Windows下通信机制采用的“事件驱动”在实际运行中不稳定。如在文件传输过程中,误码和数据丢失的情况时有发生;若串口波特率过高,会产生无法通信或在通信过程中随机挂机的情况。这主要是由于Windows本身通信机制和通信线路介质及质量的影响。为保证数据传输稳定可靠,可采用通信协议如XModem-CRC或YModem。在MSCOMM.VBX通信控件中,Rthreshold属性值大小与输入缓冲区InBufferSize大小有关,当Rthreshold值较接近InBufferSize值时,有可能不产生EV-RECEIVE事件,为保证产生该事件,可将InBufferSize值取得较大。->

展开更多 50%)
分享

猜你喜欢

VB开发通讯软件

编程语言 网络编程
VB开发通讯软件

用VB开发CAI软件的小经验

编程语言 网络编程
用VB开发CAI软件的小经验

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

VB软件开发中的错误捕获及处理技术

编程语言 网络编程
VB软件开发中的错误捕获及处理技术

VB编程开发常见技巧

编程语言 网络编程
VB编程开发常见技巧

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

VB开发技巧三则

编程语言 网络编程
VB开发技巧三则

熟悉VB的集成开发环境

编程语言 网络编程
熟悉VB的集成开发环境

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

VC快捷键:

VC快捷键:

JavaScript TO HTML 转换

JavaScript TO HTML 转换
下拉加载更多内容 ↓