關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 利用VB實現PC機與多單片機通訊

        利用VB實現PC機與多單片機通訊

        ——
        作者:趙志國 馮建武 時間:2007-08-23 來源:單片機與嵌入式系統應用 收藏

          摘要:在Windows98下利用VB的串行控件可實現PC機與多單片機之間的。采用定時器控制大大加快了自動化進程,克服了往多“握手”協議造成的速度緩慢的缺點。本文以PS1016單片機為例,詳細介紹了PC機與單片機之間的串行通訊、數據的發送和接收。

            關鍵詞:通訊

        前言

          在采用以PC機為控制中心的數據采集自動化控制系統中,通常需要單片機采集數據,然后用異步串行通訊方式傳給PC機,PC對單片機進行定時控制,需要多個單片機協同工作。如果系統不很復雜,可通過定時器控件控制收發過程,在必要的地方自動接收裝置,使定時控制和通訊過程完美地結合起來。這樣,可以免去“握手”協議的繁瑣過程,簡化編程,提高速度。VB具有面向對象的設計方法,友好的用戶界面,簡單方便的串行通訊和實用性強等優點,無論借用其他語言就可以開發出優秀的控制系統通訊軟件。本文介紹在Windows 98環境下如何利用VB來實現PC機與多個PS1016單片機之間的串行通訊。

        VB環境下通訊程序的設計

          VB提供了串行端口控制Mscomm來為應用程序提供串行通訊。該控件屏蔽了通信過程中的底層操作,程序員可以設置、監視Mscomm控件的,結合Timer控件即可完成對串行口的初始化和數據的輸入輸出工作。Mscomm控件的主要如下:

          (1)Commport 設置并返回通訊端口號。端口號可以設置為1~16的任何數,如Mscomm.Commport=2表示設置當前通訊端口為COM2。

          (2)Setting 設置并返回波特率、奇偶校驗、數據位、停止位。格式為Mscomm.Setting=String。String是一個包含四部分的字符串:第一部分為波特率;第二部分為奇偶校驗,N表示不校驗,M表示符號校驗,E表示偶校驗,O表示奇校驗,S表示空格校驗;第三部分為數據位數,其可選值為4,5,6,7,8;第四部分為停止位位數,其可選值為1,1.5,2。Setting屬性的缺省值為“9600,N,8,1”。

          (3)Portopen 設置并返回通訊端口的狀態,也可以打開和關閉端口。

          (4)Input 從接收緩沖區返回和刪除字符。該屬性在運行時為只讀。

          (5)InputLen 設置并返回每次Input屬性從接收緩沖區中讀取的字符數。InputLen屬性的缺省值為0。設置InputLen為0時,Input將讀取接收緩沖區的全部字符。

          (6)Output 向傳送緩沖區寫數據。要傳送的數據可是文本數據或二進制數據。

          (7)CommEvent 返回最近的通訊或錯誤。只要有通訊錯誤或事件發生錯誤時就會產生Oncomm事件。CommEvent屬性中存有該錯誤或事件的數值代碼。

        Timer控件的主要屬性如下:

          (1)Enabled 返回或設置一個值,該值用來確定一個窗體或控件否能夠對用戶產生的事件作出反應。通過把Enabled設置為“Galse”來使Timer控件成為無效,將取消由控件的Interval屬性所建立的倒計時數。

          (2)Interval 返回或設置對Timer控件的計時事件調用間的毫秒數。Timer控件的Enabled屬性決定該控件是否對時間的推移作出響應。將Enabled設置為“False”會關閉Timer控件,設置為“True”則打開Timer控件。當Timer控件置為有效時,倒計時總是從其Interval屬性設置值開始。創建Timer事件程序。可通知VB在每次Interval到時該做什么。Timer控件和Enabled屬性設置為“True”時,VB將在Interval時間到后自動訪問Timer_Timer過程。

          為實現通訊程序,須在VB開發環境下設置一個用做控制通訊的窗體。窗體上主要有一個通訊控件Mscomml和兩個Timer控件。VB的特點是事件驅動,定時器控件會定時觸發相應事件的驅動程序。

        1.發送單片機命令

          為了使主機能夠對整個檢測過程進行實時控制,須要在發送命令以后設定等待的時間,也可以通過條件判斷下一步是發達還是接收命令。對發送的命令,可能是文本方式或二進制代碼。在發送二進制代碼時,應特別注意發送的格式。

        發送命令過程是一個帶參過程,這樣可使發送命令簡便易行。具體程序如下:

        Sub發送單片機命令過程(command As Byte)

        Dim輸出命令(1 To 1)As Byte

        DoEvents

        輸出命令(1)=command

        MSComm1.OutBufferCount=0

        MSComm1.Output=輸出命令

        MSComm1.InBufferCount=0

        End Sub

        2.接收數據

          接收數據是一個被動的過程,可以通過函數來實現,由定時器開啟。在接收過程中,多數用特征字符,如“OK”、“#”等。這些需要在通訊協議中約定。

        Function接收數據()

        Do

        DoEvents

        In_buffer $=In_buffer$&MSComm2.Input

        Loop Until InStr(_buffer$,“OK”)'從串行端口讀“OK”響應'

        In_buffer=Left(In_buffer,len(In_buffer)-2)

        接收數據=In_buffer$

        End Function

        3.Timer控件控制

          通過Timer控件來控制通訊中的發送命令和接收數據過程,在通訊程序中設置兩個Timer控件分別控制發送單片機命令和接收單片機數據。為了實現一臺PC機和多單片機之間的通訊,可在一個Timer控件的過程中,在發送命令之前設定命令參數和要接收數據的單片機號,然后發送單片機命令;在另一個Timer控件的過程中,根據發送前設定的單片機號,接收不同單片機的數據。

        Timer控件控制程序如下:

        '發送命令主控程序

        Privata Sub TimerSend_Timer()

        TimerSend.Enabled=False

        Select Case command

        Case 1]

        Call發送單片機命令過程(任務1)

        TimerReceive.Enabled=False'啟動自動接收

        Case2

        Call發送單片機命令過程(任務2)

        MSComm1.Rthreshold=0'關閉自動接收

        TimerReceive.Interval=500

        TimerReceive.Enabled=True'啟動定時器接收機號=1

        Case 3

        Call發送單片機命令過程(任務3)

        MSComm1.Rthreshold=0'關閉自動接收

        TimerReceive.lnterval=500

        TimerReceive.Enabled=True'啟動定時器接收

        機號=2

        Case 4

        Case n

        End Select

        End.Sub

        '接收數據主控程序

        Private Sub TimerReceive_Timer()

        TimerReceive.Enabled=False

        Select Case機號

        Case 1

        In_buffer$=接收數據(機號)

        Call任務2

        Case 2

        In_buffer$=接收數據(機號)

        Call任務3

        Case 3

        Case n

        In_buffer$=接收數據(機號)

        Call任務n

        End Select

        End Sub

        4.自動接收、監視總線狀態和通訊錯誤的處理

          自動接收、監視總線狀態和通訊錯誤的處理可以通過OnComm事件實現。VB程序運行過程中只要設置MSComm1.Rthreshold=1,在接收事件發生時程序就會自動訪問MSComm1.OnComm()過程。

          由于外界干擾或電壓波動等原因,PC機和單片機之間的通訊可能會出現錯誤,如接收緩沖區溢出、網絡端口超速等。這些可能發生的事件都能在代碼中引起運行錯誤。為了處理這些錯誤,須要將錯誤處理代碼添加到程序中。通過控件中的OnComm事件可以捕捉和處理錯誤。在通訊過程中所發生的通訊錯誤是CommEvent屬性返回的。當CommEvent屬性值發生改變時,表明有通訊錯誤,就會產生OnComm事件。同時,可以利用自動引發OnComm事件的特點在接收過程中加入狀態顯示碼。這樣可以監視通訊線路狀態,得到單片機和主機及單片機和單片機之間的通訊進程。通訊錯誤的處理程序如下:

        Private Sub MSComm1_OnComm()

        Select Case MSComm1.CommEvent

        Case ComReceive 'Receive data '自動數據接收、監視總線通信信息

        Select Case In_buffer $

        Call A

        Label.Enabled=“正在執行任務1”

        Call B

        End Select

        Case comFrame 'Framing Error '通訊錯誤處理

        X=MsgBox(“Framing Error!”,16)

        …'錯誤處理

        Case comEventOverrun '數據丟失

        X=MsgBox(“數據丟失!”,16)

        …'錯誤處理

        End Select

        End Sub

         



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 观塘区| 临城县| 南江县| 正定县| 天镇县| 平江县| 福鼎市| 砚山县| 伊金霍洛旗| 泰顺县| 信丰县| 商丘市| 九寨沟县| 三门县| 宜章县| 博罗县| 万盛区| 徐闻县| 东方市| 登封市| 射阳县| 平泉县| 麟游县| 沅江市| 长治市| 甘泉县| 新余市| 万荣县| 宜宾县| 闵行区| 夏河县| 慈利县| 呼图壁县| 忻城县| 佛教| 黄浦区| 邵东县| 长寿区| 砚山县| 红桥区| 柏乡县|