⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 35.htm

📁 VB的一些网络编程的例子,个人认为还不错。大家一起来研究一下.
💻 HTM
字号:
<p>基于Win95的VB5串口通信程序</p>
<p> </p>
<p></p>
<p>山东省水文水资源勘测局   王 军</p>
<p></p>
<p>  VisualBasic5.0(以下简称VB)以其简单易学、32位面向对象的程序设计等特点,倍受广大计算机开发者的青睐,已广泛地应用于各个领域;在实时监测系统中串行端口通信是一项基础功能,因此我们使用VB5编写了实时水库水文自动监测系统的后台机软件。本文就Windows95环境中采用VB5设计串行端口通信程序进行讨论并给出实例。</p>
<p></p>
<p>  一般用VB开发串行通信程序有两种方法:一是利用Windows的通信API函数;另一种是采用VB标准控件Mscomm来实现。</p>
<p></p>
<p>Windows95的通信API</p>
<p></p>
<p>  Windows95中的串口通信API函数不同于Windows3.x中的OpenComm、CloseComm、ReadComm、WriteComm,而是采用硬件与文件通用的函数CreateFile、ReadFile、WriteFile、CloseHandle,该类函数更具有一般性,并且可以用EscapeCommFunction函数实现底层硬件操作,比如:SETXOFF、CLRDTR等。</p>
<p>  利用API编写串口通信程序较为复杂,需要掌握大量通信知识,其优点是可实现的功能更丰富、应用面更广泛,更适合于编写较为复杂的低层次通信程序。采用这种方法编写串行端口通信程序一般可分为以下几个过程: </p>
<p></p>
<p>  1.初始化串行端口</p>
<p></p>
<p>  首先用CreateFile函数打开指定串口,置参数中访问类型为GENERIC_READ|GENERIC_WRITE、共享模式为0、创建标志为OPEN_EXISTING、模板句柄为NULL。</p>
<p></p>
<p>  2.配置串口</p>
<p></p>
<p>  Windows95的串口配置比Windows3.x较为复杂,但其功能更强大,对一般程序可使用CommConfigDialog函数以对话框方式设置波特率、数据位、奇偶校验、停止位和流控制方式,并且可以恢复缺省值。</p>
<p></p>
<p>  3.超时控制</p>
<p></p>
<p>  为了防止意外情况使串口读写无休止地等待,Windows95提供了超时设置,这是由COMMTIMEOUTS结构定义的,通过调用GetCcommTimeOuts函数获得当前的设置,用SetCommTimeOuts函数来完成设置。</p>
<p></p>
<p>  4.数据传输</p>
<p></p>
<p>  读写串行端口与读写文件采用的函数相同,即ReadFile、WriteFile,读写操作可分四种方式:查询方式、同步I/O、异步(后台)I/O和事件驱动I/O。</p>
<p></p>
<p>  5.关闭串口</p>
<p></p>
<p>  程序的终止可以自动关闭串口,也可用函数CloseHandle(),以便释放所独占资源。</p>
<p></p>
<p>VB通信控件Mscomm</p>
<p></p>
<p>  Mscomm控件提供了功能完善的串口数据的发送和接收功能,Mscomm控件具有两种处理方式:1事件驱动方式:由Mscomm控件的OnComm事件捕获并处理通信错误及事件;2查询方式:通过检查CommEvent属性的值来判断事件和错误。</p>
<p>  Mscomm控件的通信功能实现,实际上是调用了API函数,而API函数是由Comm.drv解释并传给设备驱动程序执行的,对于VB程序开发者只需知道Mscomm控件的属性和事件的用法即可以实现串口的操作。</p>
<p></p>
<p>  以下是Mscomm控件的主要属性和方法:</p>
<p></p>
<p>  1)CommPort:设置或返回串行端口号,其取值范围为1~99,缺省为1。</p>
<p></p>
<p>  2)Setting设置或返回串行端口的波特率、奇偶校验位、数据位数、停止位。如:Mscomm.Setting="9600,N,8,1"。</p>
<p></p>
<p>  3)PortOpen:打开或关闭串行端口,格式为:Mscomm.PortOpen={TRUE|FALSE}。</p>
<p></p>
<p>  4)InBufferSize:设置或返回接收缓冲区的大小,缺省为1024字节。</p>
<p></p>
<p>  5)InBufferCount:返回接收缓冲区内的等待读取的字节个数,可通过设置该属性为0来清除接收缓冲区。</p>
<p></p>
<p>  6)RThreshold:该属性为一阀值,它确定当接收缓冲区内字节个数达到或超过该值后就产生代码为MSCOMM_EV_RECEIVE的OnComm事件。</p>
<p></p>
<p>  7)InputLen:设置或返回接收缓冲区内用Input读入的个数。若取0,则INPUT读取整个缓冲区的内容。</p>
<p></p>
<p>  8)Input:该属性表示从接收缓冲区移走一串字符。</p>
<p></p>
<p>  9)OutBufferSize:设置或返回发送缓冲区,缺省为512字节。</p>
<p></p>
<p>  10)OutBufferCounter:返回发送缓冲区内等待发送的字符数,可用来清空缓冲区。</p>
<p></p>
<p>  11)Output:向发送缓冲区传送一字符串。</p>
<p></p>
<p>  12)EOFEnable:若置TRUE,则当输入中出现EOF,就停止输入并产生OnComm事件。</p>
<p></p>
<p>  如果在通信过程中发生错误或事件,就会引发OnComm事件并且改变属性值,由CommEvent属性代码反映错误类型,在通信程序的设计中可根据该属性值来执行不同的操作,以下是部分属性常数值及其含义:</p>
<p></p>
<p>  1)ComEvSend:其值为1,发送缓冲区的内容少于SThreshold指定的值。</p>
<p></p>
<p>  2)ComEvReceive:其值为2,接收缓冲区内字符数达到RThreshold值,该事件在缓冲区中数据被移走前将持续产生。</p>
<p></p>
<p>  3)ComEventFrame:其值为1004,硬件检测到帧错误。</p>
<p></p>
<p>  4)ComEventRxOver:其值为1008,接收缓冲区溢出。</p>
<p></p>
<p>  5)ComEventTxFull:其值为1010,发送缓冲区溢出。</p>
<p></p>
<p>  6)ComEventRxParity:其值为1009,奇偶校验。</p>
<p></p>
<p>  7)ComEvEOF:其值为7,接收数据中出现文件结束(ASCII码为26)字符。</p>
<p></p>
<p>程序样例</p>
<p></p>
<p>  采用Mscomm控件实现串口通信时,首先添加一Mscomm控件到窗体中,该控件一般不在通用工具窗口中,而是需通过菜单项"工程(P)→部件(O)"进入选择窗口,在控件tab页中选取MicrosoftCommControl5.0,此时工具窗口中出现Mscomm图标,即可被使用。</p>
<p>  以下是事件驱动方式的接收程序的主要部分:</p>
<p></p>
<p>PrivateSubgetdatafromserial_Click()</p>
<p>  CommonDialog1.InitDir="c:\temp"</p>
<p>  CommonDialog1.ShowSave</p>
<p>  mainfrm.MSComm1.CommPort=1</p>
<p>  hfile=FreeFile</p>
<p>  '打开存储接收数据的文件</p>
<p>  Open CommonDialog1.filename For Output As #hfile</p>
<p>  '设接收缓冲区的大小,可按量确定</p>
<p>  mainfrm.MSComm1.InBufferSize=4096</p>
<p>  If Not mainfrm.MSComm1.PortOpen Then'打开串口</p>
<p>  mainfrm.MSComm1.PortOpen=True</p>
<p>  End If</p>
<p>  If Err Then</p>
<p>  MsgBox"Communcationportcannotbeopened!!"</p>
<p>  '清接收缓冲区</p>
<p>  mainfrm.MSComm1.InBufferCount=0</p>
<p>  '设一次读入的长度,可根据数据格式设置</p>
<p>  mainfrm.MSComm1.InputLen=77</p>
<p>  '设置接收事件触发的阀值</p>
<p>  mainfrm.MSComm1.RThreshold=77</p>
<p>  counter=Timer+10</p>
<p>  Do</p>
<p>   If Timer>counter Then</p>
<p>    mainfrm.Label1.Caption="正在通信......"</p>
<p>    mainfrm.Label1.Refresh</p>
<p>    counter=Timer+10</p>
<p>   End If</p>
<p>   DoEvents</p>
<p>  Loop</p>
<p>End Sub</p>
<p></p>
<p>  以下为事件处理子程序,flag为一静态变量记录读取次数,以便改变接收数据的长度,读者可根据实际需要添加其它处理内容:</p>
<p></p>
<p>Private Sub MSComm1_OnComm()</p>
<p>  Select Case MSComm1.CommEvent</p>
<p>    Case comEvReceive</p>
<p>      If flag>246 Then</p>
<p>        MSComm1.InputLen=0:MSComm1.RThreshold=32</p>
<p>      End If</p>
<p>      buffer=MSComm1.Input</p>
<p>      temp=buffer</p>
<p>      Print #hfile,temp</p>
<p>      counter=Timer+10</p>
<p>      Do While Timer>counter</p>
<p>        DoEvents</p>
<p>      Loop</p>
<p>      flag=flag+1</p>
<p>    Case comEvEOF</p>
<p>      EVMsg$="检测到文件结尾!!!"</p>
<p>    Case comFrame</p>
<p>      ERMsg$="帧出错!!!"</p>
<p>    Case comRxParity</p>
<p>      ERMsg$="奇偶错!!!"</p>
<p>  End Select</p>
<p>  If Len(EVMsg$) Then</p>
<p>    Text1.Text="Status:"&EVMsg$</p>
<p>  ElseIf Len(ERMsg$) Then</p>
<p>    Text1.Text="Status:"&ERMsg$</p>
<p>    Beep</p>
<p>    Ret=MsgBox(ERMsg$,1,"ClickCanceltoquit,OKtoignore.")</p>
<p>    MSComm1.PortOpen=False</p>
<p>  End If</p>
<p>End Sub</p>
<p></p>
<p> </p>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -