VB开发通讯软件

2016-02-19 12:55 36 1 收藏

今天图老师小编给大家精心推荐个VB开发通讯软件教程,一起来看看过程究竟如何进行吧!喜欢还请点个赞哦~

【 tulaoshi.com - 编程语言 】

一、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值取得较大。->

来源:http://www.tulaoshi.com/n/20160219/1602443.html

延伸阅读
我这里重点的介绍如何写驱动程序,对于一些应用程序我就不做介绍了,因为我对于那些高层的东西写得很少。倘若再讲,有班门弄斧之嫌,呵呵! 作为WIN98和WIN2K推荐的一项新技术来说,USB的驱动程序和以往的直接跟硬件打交道的WIN95的VXD的方式的驱动程序不同,它应该是WDM类型的。 USB的WDM接口框图如下(这个图可以说是USB软件总...
    1、如何升级、编译内核? 如果你不想改变内核的版本,直接转到以下第四步。 1)在任何一个子目录下(但通常是在/usr/src/下)untar解开新的内核源程序: tar xvfz linux-x.x.xx.tar.gz (例如linux-2.0.35.tar.gz) 或者是打补丁(patch):  gzip -cd patch-2.0.35.gz | patch -p0 打完补丁直接...
转载自http://www.erptao.org 关于代码重复最闻名的单词是Kent Beck的Once And Only Once,也就是说软件操作的任何一个片断--不管是一个算法,一个常量集合,用于阅读的文档或者其他东西--应当只出现一次。 软件重复出现至少会导致以下问题: ? 其中的一个版本会过期 ? 代码的责任会四处散开,导致代码难以理解 ...
VB作为快速开发Windows下的编程工具,已经为越来越多的开发者采用。但如果要开发出专业的Windows软件,还需采用大量的API函数,以下结合笔者开发管理软件的经验谈几点体会。 程序中判定Windows的版本 众所周知,Windows3.x各版本或多或少会有些差别,为了使开发程序避免出现莫名其妙的错误,最好在程序运行前自动判定Windows的版本。采...
有很多深受欢迎的软件,如ARJ,UNDISK等都是在DOS环境下以命令行的形式出现的。其特点就是依靠大量的参数和开关变量来实现其丰富的功能。利用VisualBasic可以简单地把此类软件改写成WINDOWS版本,其中大量的开关参数可用菜单、列表框、组合框和复选框等一一映射成图形界面。而命令的调用。可以用VB提供的SHELL函数,其语法为: shell(...

经验教程

533

收藏

13
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部