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

VB開發通訊軟件

編輯: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值取得較大。->

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