<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
關(guān) 閉

新聞中心

EEPW首頁(yè) > 工控自動(dòng)化 > 利用VB實(shí)現PC機與多單片機通訊

利用VB實(shí)現PC機與多單片機通訊

——
作者:趙志國 馮建武 時(shí)間:2007-08-23 來(lái)源:?jiǎn)纹瑱C與嵌入式系統應用 收藏

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

    關(guān)鍵詞:通訊

前言

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

VB環(huán)境下通訊程序的設計

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

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

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

 ?。?)Portopen 設置并返回通訊端口的狀態(tài),也可以打開(kāi)和關(guān)閉端口。

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

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

 ?。?)Output 向傳送緩沖區寫(xiě)數據。要傳送的數據可是文本數據或二進(jìn)制數據。

 ?。?)CommEvent 返回最近的通訊或錯誤。只要有通訊錯誤或事件發(fā)生錯誤時(shí)就會(huì )產(chǎn)生Oncomm事件。CommEvent屬性中存有該錯誤或事件的數值代碼。

Timer控件的主要屬性如下:

 ?。?)Enabled 返回或設置一個(gè)值,該值用來(lái)確定一個(gè)窗體或控件否能夠對用戶(hù)產(chǎn)生的事件作出反應。通過(guò)把Enabled設置為“Galse”來(lái)使Timer控件成為無(wú)效,將取消由控件的Interval屬性所建立的倒計時(shí)數。

 ?。?)Interval 返回或設置對Timer控件的計時(shí)事件調用間的毫秒數。Timer控件的Enabled屬性決定該控件是否對時(shí)間的推移作出響應。將Enabled設置為“False”會(huì )關(guān)閉Timer控件,設置為“True”則打開(kāi)Timer控件。當Timer控件置為有效時(shí),倒計時(shí)總是從其Interval屬性設置值開(kāi)始。創(chuàng )建Timer事件程序??赏ㄖ猇B在每次Interval到時(shí)該做什么。Timer控件和Enabled屬性設置為“True”時(shí),VB將在Interval時(shí)間到后自動(dòng)訪(fǎng)問(wèn)Timer_Timer過(guò)程。

  為實(shí)現通訊程序,須在VB開(kāi)發(fā)環(huán)境下設置一個(gè)用做控制通訊的窗體。窗體上主要有一個(gè)通訊控件Mscomml和兩個(gè)Timer控件。VB的特點(diǎn)是事件驅動(dòng),定時(shí)器控件會(huì )定時(shí)觸發(fā)相應事件的驅動(dòng)程序。

1.發(fā)送單片機命令

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

發(fā)送命令過(guò)程是一個(gè)帶參過(guò)程,這樣可使發(fā)送命令簡(jiǎn)便易行。具體程序如下:

Sub發(fā)送單片機命令過(guò)程(command As Byte)

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

DoEvents

輸出命令(1)=command

MSComm1.OutBufferCount=0

MSComm1.Output=輸出命令

MSComm1.InBufferCount=0

End Sub

2.接收數據

  接收數據是一個(gè)被動(dòng)的過(guò)程,可以通過(guò)函數來(lái)實(shí)現,由定時(shí)器開(kāi)啟。在接收過(guò)程中,多數用特征字符,如“OK”、“#”等。這些需要在通訊協(xié)議中約定。

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控件控制

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

Timer控件控制程序如下:

'發(fā)送命令主控程序

Privata Sub TimerSend_Timer()

TimerSend.Enabled=False

Select Case command

Case 1]

Call發(fā)送單片機命令過(guò)程(任務(wù)1)

TimerReceive.Enabled=False'啟動(dòng)自動(dòng)接收

Case2

Call發(fā)送單片機命令過(guò)程(任務(wù)2)

MSComm1.Rthreshold=0'關(guān)閉自動(dòng)接收

TimerReceive.Interval=500

TimerReceive.Enabled=True'啟動(dòng)定時(shí)器接收機號=1

Case 3

Call發(fā)送單片機命令過(guò)程(任務(wù)3)

MSComm1.Rthreshold=0'關(guān)閉自動(dòng)接收

TimerReceive.lnterval=500

TimerReceive.Enabled=True'啟動(dòng)定時(shí)器接收

機號=2

Case 4

Case n

End Select

End.Sub

'接收數據主控程序

Private Sub TimerReceive_Timer()

TimerReceive.Enabled=False

Select Case機號

Case 1

In_buffer$=接收數據(機號)

Call任務(wù)2

Case 2

In_buffer$=接收數據(機號)

Call任務(wù)3

Case 3

Case n

In_buffer$=接收數據(機號)

Call任務(wù)n

End Select

End Sub

4.自動(dòng)接收、監視總線(xiàn)狀態(tài)和通訊錯誤的處理

  自動(dòng)接收、監視總線(xiàn)狀態(tài)和通訊錯誤的處理可以通過(guò)OnComm事件實(shí)現。VB程序運行過(guò)程中只要設置MSComm1.Rthreshold=1,在接收事件發(fā)生時(shí)程序就會(huì )自動(dòng)訪(fǎng)問(wèn)MSComm1.OnComm()過(guò)程。

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

Private Sub MSComm1_OnComm()

Select Case MSComm1.CommEvent

Case ComReceive 'Receive data '自動(dòng)數據接收、監視總線(xiàn)通信信息

Select Case In_buffer $

Call A

Label.Enabled=“正在執行任務(wù)1”

Call B

End Select

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

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

…'錯誤處理

Case comEventOverrun '數據丟失

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

…'錯誤處理

End Select

End Sub

 



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>