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

VisualBasic串口通信程序設計

編輯:更多關於編程

      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將成為最快速、易用、強勁的應用開發工具,是企業級客戶/服務器應用軟件開發的首選工具之一。

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