VisualBasic串口通訊程式設計

來源:互聯網
上載者:User

  1mscomm.vbx通訊控制項描述

  mscomm.vbx通訊控制項可直接從vb的toolbox中加入表單form,即可用其進行通訊。若toolbox中無此控制項,則用tools的customcontrols將mscomm.vbx從windows的system子目錄中加入vb的toolbox中。

  1.1通訊方式

  mscomm.vbx有2種不同的方式來處理和解決各類通訊軟體的開發和設計問題

  1、事件驅動。它與c/c 寫windows軟體時的視窗回呼函數類似,是1種功能強大的處理問題的方法。在實際工作中,往往要處理許多通訊中的相關事件,例如:當線路資料到達本端或cd線和rts訊號線狀態發生變化時,要求我們使用相應的事件來跟蹤和處理,該控制項是使用oncomm事件來實現的,它也包括檢測和處理通訊錯誤等方面的問題,commevent值返回最近的通訊事件或錯誤的數字代碼。通訊控制項詳細的錯誤和事件舉例有:

  mscomm-er-break收到1個breaksignal

  mscomm-er-cdtocd訊號逾時

  mscomm-ev-cdcd訊號改變

  2、查詢方式。由程式設計者負責讀取commevent的值並處理所發生的錯誤或事件。通常簡單的應用程式設計可採用這種辦法。

  1.2通訊控制項的屬性

  利用通訊控制項編製通訊程式,關鍵是準確理解設定通訊控制項的屬性。mscomm.vbx提供了27個關於通訊控制項方面的屬性,例如:

  commport:設定或返回通訊口編號。

  settings:設定或返回以字串形式出現的資料通訊格式:傳輸速率、校正、資料位元和停止位。

  portopen:設定或返回通訊口狀態(包括開啟和關閉1個通訊口)

  3、執行個體

  本程式應用背景為dcc95型靜電除塵器自動監控系統軟體,解決1個pc工控機(主站)與32個單片機(子站)之間的通訊問題。主站與子站之間這匯流排式網路結構,採用rs-485通訊標準,以問答方式進行資料通訊。由於32個子站與主站發送通訊命令(下行命令),主站在接收子站發回的相應回答命令(上行命令)後繼續發送下行命令的通訊形式。根據系統功能的要求,主站需發送2種類型的命令:(1)同期命令,它由定時器觸發引起,每隔ls周期發送1次;(2)非周期性命令,它由操作者按動相應命令按鈕引起,非周期性發送。自動監控系統軟體安裝在主站上,而通訊程式作為自動監控系統軟體的一部分也安裝在主站上。

  本文僅列出調試通訊程式時進行實驗用的基本示範程式清單。實驗時,用1台pc機作為主站,另一台pc機類比32個子站的工作,兩台pc機之間採用rs232c串口通訊。往主站的通訊示範程式表單(form)中加入1個通訊控制項、2個定時器控制項和1個命令按鈕控制項,通訊控制項(mscomm1)用於訪問串口,發送和接收資料;periodic定時器控制項(periodic)用於控制每秒由主站向各子站發送周期性命令;命令按鈕控制項(nonperiodic-command)與nonperiodic定時器控制項(nonperiodic)用於發送非周期性命令。資料傳送採用事件驅動的通訊方式,根據不同的發送命令設定rtreshlod屬性,從而引起oncomm事件以接收資料。

  2.1表單各控制項初始化程式

  設定通訊串口工作參數,設定periodic定時器的在斷間隔為ls,nonperiodic定時器的中斷間隔為0.5s。

  subform-load()

  mscomm1.commport=2'選用com2串列口

  mscomm1.settings="9600,n8,1"'傳輸速率9600,無同位位元,8位元據位1位停止位

  mscomm1.inputlen=0'input將讀取接收緩衝區的全部內容

  mscomm1.inbuffersize=1024'設定接收緩衝區的位元組長度

  mscomm1.portopen=true'開啟通訊口

  mscomm1.inbuffercount=0'清除發送緩衝區資料

  mscomm1.outbuffercount=0'清除接收緩衝區資料

  periodic.inteval=100'設定ls定時間隔,使遙測命令每隔ls發送1次

  nonperiodic.inteval=500'設定0.5s定時間隔,查詢命令按鈕是否處於啟用狀態以確定是否發送周期性命令

  command-pressed=false'命令按鈕為未啟用狀態

  during-periodic=false'周期性命令資料轉送尚未開始

  during-nonperiodic=false'非周期性命令資料轉送尚未開始

  endsub

  2.2非周期性命令發送程式

  根據命令按鈕狀態及周期性命令資料轉送狀態,在nonperiodic定時器的中斷程式中發送非周期性命令。

  subnonperiodic-command-click()

  command-pressed=true'命令按鈕啟用

  endsub

  subnonperiodic-timer()

  ifduring-periodic=trueorcommand-pressed=false

  thenexitsub'若周期性命令資料轉送尚未結束或命令按鈕處於啟用狀態,則退出發送非周期性命令程式。

  command-pressed=false'命令按鈕恢複為未啟用狀態

  callsenddata(nonperiodic-command)'發送非周期性命令

  mscomm1.rthreshold=r-nonperiodic-byte'發送非周期性命令後,設定rthreshold屬性,使主站接收所設定的位元組數後引發oncomm事件

  endsub

  2.3periodic定時器程式

  在periodic定時器的中斷程式中發送周期性命令:

  subperiodic-timer()

  ifduring-nonperiodic=truethenexitsub'若非周期性命令資料轉送尚未結束,則退出發送非周期性命令程式。

  during-periodic=true'設定周期性命令資料轉送狀態為進行中中

  callsenddata(periodic-command)'發送周期性命令

  mscomm1.rthreshold=r-periodic-byte'發送周期性命令後,主站接收r-remot-edata-byte個位元組,可引發oncomm事件

  endsub

  2.4oncomm事件程式

  根據rthreshold屬性設定值,當接收緩衝區內接收到相應位元組的字元時,引發oncomm事件,在中斷程式中接收資料。

  submscomm1-oncomm()

  selectcasemscomm1.commevent'在此可插入處理各種不同錯誤或事件的代碼

  casemscomm-ev-receive

  receivestring$=mscomm1.input

  selectcasemscomm1.rthreshold

  caser-periodic-byte'周期性命令的應答資料

  calldisposedata(periodic-command)'處理接收資料

  duringperiodic=false'設定周期性命令資料轉送狀態為結束

  caser-nonperiodic-byte'非周期性命令的應答資料

  calldisposedata(nonperiodic-command)'處理接收資料

  during-nonperiodic=false'設定非周期性命令資料轉送狀態為結束

  endselect

  endselect

  endsub

  隨著vb版本的不斷升級,vb將成為最快速、易用、強勁的應用開發工具,是企業級客戶/伺服器應用軟體開發的首選工具之一。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.