程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 基於Win95的VB5串口通信程序

基於Win95的VB5串口通信程序

編輯:VB綜合教程
----VisualBasic5.0(以下簡稱VB)以其簡單易學、32位面向對象的程序設計等特點,倍受廣大計算機開發者的青睐,已泛地應用於各個領域;在實時監測系統中串行端口通信是一項基礎功能,因此我們使用VB5編寫了實時水庫水文自動監測系統的後台機軟件。本文就Windows95環境中采用VB5設計串行端口通信程序進行討論並給出實例。
  
  ----一般用VB開發串行通信程序有兩種方法:一是利用Windows的通信API函數;另一種是采用VB標准控件Mscomm來實現。
  
  Windows95的通信API
  ----Windows95中的串口通信API函數不同於Windows3.x中的OpenComm、CloseComm、ReadComm、WriteComm,而是采用硬件與文件通用的函數CreateFile、ReadFile、WriteFile、CloseHandle,該類函數更具有一般性,並且可以用EscapeCommFunction函數實現底層硬件操作,比如:SETXOFF、CLRDTR等。
  ----利用API編寫串口通信程序較為復雜,需要掌握大量通信知識,其優點是可實現的功能更豐富、應用面更廣泛,
  更適合於編寫較為復雜的低層次通信程序。采用這種方法編寫串行端口通信程序一般可分為以下幾個過程:
  
  ----1.初始化串行端口
  
  ----首先用CreateFile函數打開指定串口,置參數中訪問類型為GENERIC_READ|GENERIC_WRITE、共享模式為0、創建標志為
  OPEN_EXISTING、模板句柄為NULL。
  
  ----2.配置串口
  
  ----Windows95的串口配置比Windows3.x較為復雜,但其功能更強大,對一般程序可使用CommConfigDialog函數以對話框方式設置波特率、數據位、奇偶校驗、停止位和流控制方式,並且可以恢復缺省值。
  
  ----3.超時控制
  
  ----為了防止意外情況使串口讀寫無休止地等待,Windows95提供了超時設置,這是由COMMTIMEOUTS結構定義的,通過調用GetCcommTimeOuts函數獲得當前的設置,用SetCommTimeOuts函數來完成設置。
  
  ----4.數據傳輸
  
  ----讀寫串行端口與讀寫文件采用的函數相同,即ReadFile、WriteFile,讀寫操作可分四種方式:查詢方式、同步I/O、異步(後台)I/O和事件驅動I/O。
  
  ----5.關閉串口
  
  ----程序的終止可以自動關閉串口,也可用函數CloseHandle(),以便釋放所獨占資源。
  
  VB通信控件Mscomm
  ----Mscomm控件提供了功能完善的串口數據的發送和接收功能,Mscomm控件具有兩種處理方式:1事件驅動方式:由Mscomm控件的OnComm事件捕獲並處理通信錯誤及事件;2查詢方式:通過檢查CommEvent屬性的值來判斷事件和錯誤。
  ----Mscomm控件的通信功能實現,實際上是調用了API函數,而API函數是由Comm.drv解釋並傳給設備驅動程序執行的,對於VB程序開發者只需知道Mscomm控件的屬性和事件的用法即可以實現串口的操作。
  
  ----以下是Mscomm控件的主要屬性和方法:
  
  ----1)CommPort:設置或返回串行端口號,其取值范圍為1~99,缺省為1。
  
  ----2)Setting設置或返回串行端口的波特率、奇偶校驗位、數據位數、停止位。如:Mscomm.Setting=“9600,N,8,1”。
  
  ----3)PortOpen:打開或關閉串行端口,格式為:Mscomm.PortOpen={TRUE|FALSE}。
  
  ----4)InBufferSize:設置或返回接收緩沖區的大小,缺省為1024字節。
  
  ----5)InBufferCount:返回接收緩沖區內的等待讀取的字節個數,可通過設置該屬性為0來清除接收緩沖區。
  
  ----6)RThreshold:該屬性為一閥值,它確定當接收緩沖區內字節個數達到或超過該值後就產生代碼為MSCOMM_EV_RECEIVE的OnComm事件。
  
  ----7)InputLen:設置或返回接收緩沖區內用Input讀入的個數。若取0,則INPUT讀取整個緩沖區的內容。
  
  ----8)Input:該屬性表示從接收緩沖區移走一串字符。
  
  ----9)OutBufferSize:設置或返回發送緩沖區,缺省為512字節。
  
  
  ----10)OutBufferCounter:返回發送緩沖區內等待發送的字符數,可用來清空緩沖區。
  
  ----11)Output:向發送緩沖區傳送一字符串。
  
  ----12)EOFEnable:若置TRUE,則當輸入中出現EOF,就停止輸入並產生OnComm事件。
  
  ----如果在通信過程中發生錯誤或事件,就會引發OnComm事件並且改變屬性值,由CommEvent屬性代碼反映錯誤類型,在通信程序的設計中可根據該屬性值來執行不同的操作,以下是部分屬性常數值及其含義:
  
  ----1)ComEvSend:其值為1,發送緩沖區的內容少於SThreshold指定的值。
  
  ----2)ComEvReceive:其值為2,接收緩沖區內字符數達到RThreshold值,該事件在緩沖區中數據被移走前將持續產生。
  
  
  ----3)ComEventFrame:其值為1004,硬件檢測到幀錯誤。
  
  ----4)ComEventRxOver:其值為1008,接收緩沖區溢出。
  
  ----5)ComEventTxFull:其值為1010,發送緩沖區溢出。
  
  ----6)ComEventRxParity:其值為1009,奇偶校驗。
  
  ----7)ComEvEOF:其值為7,接收數據中出現文件結束(ASCII碼為26)字符。
  
  程序樣例
  ----采用Mscomm控件實現串口通信時,首先添加一Mscomm控件到窗體中,該控件一般不在通用工具窗口中,而是需通過菜單項“工程(P)→部件(O)”進入選擇窗口,在控件tab頁中選取MicrosoftCommControl5.0,此時工具窗口中出現Mscomm圖標,即可被使用。
  ----以下是事件驅動方式的接收程序的主要部分:PrivateSubgetdatafromserial_Click()
  
  ----CommonDialog1.InitDir=“c: emp"
  
  ----CommonDialog1.ShowSave
  
  ----mainfrm.MSComm1.CommPort=1
  
  ----hfile=FreeFile
  
  ----'打開存儲接收數據的文件
  
  ----OpenCommonDialog1.filenameForOutputAs#hfile
  
  ----'設接收緩沖區的大小,可按量確定
  
  ----mainfrm.MSComm1.InBufferSize=4096
  
  ----IfNotmainfrm.MSComm1.PortOpenThen'打開串口
  
  ------mainfrm.MSComm1.PortOpen=True
  
  ----EndIf
  
  ----IfErrThen
  
  ----MsgBox“Communcationportcannotbeopened!!"
  
  ----'清接收緩沖區
  
  ----mainfrm.MSComm1.InBufferCount=0
  
  ----'設一次讀入的長度,可根據數據格式設置
  
  ----mainfrm.MSComm1.InputLen=77
  
  ----'設置接收事件觸發的閥值
  
  ----mainfrm.MSComm1.RThreshold=77
  
  ----counter=Timer+10
  
  ----Do
  
  IfTimer>counterThen
  
  mainfrm.Label1.Caption=“正在通信......"
  
  mainfrm.Label1.Refresh
  
  counter=Timer+10
  
  EndIf
  
  DoEvents
  
  Loop
  
  EndSub
  
  ----以下為事件處理子程序,flag為一靜態變量記錄讀取次數,以便改變接收數據的長度,讀者可根據實際需要添
  加其它處理內容:
  
  PrivateSubMSComm1_OnComm()
  
  SelectCaseMSComm1.CommEvent
  
  CasecomEvReceive
  
  Ifflag>246Then
  
  MSComm1.InputLen=0:MSComm1.RThreshold=32
  
  EndIf
  
  buffer=MSComm1.Input
  
  temp=buffer
  
  Print#hfile,temp
  
  counter=Timer+10
  
  DoWhileTimer>counter
  
  DoEvents
  
  Loop
  
  flag=flag+1
  
  CasecomEvEOF
  
  EVMsg$=“檢測到文件結尾!!!"
  
  CasecomFrame
  
  ERMsg$=“幀出錯!!!"
  
  CasecomRxParity
  
  ERMsg$=“奇偶錯!!!"
  
  EndSelect
  
  IfLen(EVMsg$)Then
  
  Text1.Text=“Status:"&EVMsg$
  
  ElseIfLen(ERMsg$)Then
  
  Text1.Text=“Status:"&ERMsg$
  
  Beep
  
  Ret=MsgBox(ERMsg$,1,“ClickCancelto
  
  quit,OKtoignore.")
  
  MSComm1.PortOpen=False
  
  EndIf
  
  EndSub->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved