立即注冊 登錄
返回首頁

uid:71870的個人空間

日志

VB與單片機通信的建立

已有 5760 次閱讀2015-1-17 10:27 |個人分類:資料| 計算機系統(tǒng), 發(fā)送信息, 監(jiān)控系統(tǒng), 單片機, 通信


多點溫度監(jiān)控系統(tǒng)下位機將溫度轉(zhuǎn)換并將溫度值存儲到單片機的RAM里,本章主要討論采用比較廉價的通信方式—RS232來實現(xiàn)多點溫度監(jiān)控系統(tǒng)的上位機(PC機)向下位機(單片機)發(fā)送信息以及上位機接收下位機的溫度信息并加以處理。

1.1 串行通信及RS232總線

多點溫度監(jiān)控系統(tǒng)下位機采集到的大量溫度信息,需要傳送至上位機,為接下來的溫度分析處理提供數(shù)據(jù)。下位機只有一個單片機與PC機通信且兩者之間的距離不是很長,因此我們采用異步串行通信中應(yīng)用最廣的RS-232標(biāo)準總線實現(xiàn)兩者之間的信息傳遞。本節(jié)將主要介紹串行通信的基本概念,數(shù)據(jù)傳送方式,RS-232總線標(biāo)準等。

1.1.1 串行通信

隨著計算機系統(tǒng)的應(yīng)用和微機網(wǎng)絡(luò)的發(fā)展,計算機的通信功能顯得尤為重要。從廣義上講,計算機通信可以分為并行通信和串行通信。并行通信速度快、實時性好,但占用的口線多、成本高、通信距離短,不適用于小型化產(chǎn)品。串行通信只需一根傳輸線即可完成通信功能,成本低,在通信中得到了廣泛應(yīng)用。計算機與外界的數(shù)據(jù)傳送大多數(shù)都是串行的,通常把計算機與外界的數(shù)據(jù)傳送稱之為通信,因此提到的通信大多數(shù)都是指串行通信。

1、串行通信的概念

串行通信是計算機與外部設(shè)備進行信息交換的一種方式,是指數(shù)據(jù)一位一位地按順序在一根信號線上進行傳輸?shù)耐ㄐ欧绞。串行通信有兩種基本工作方式:異步傳送和同步傳送。在單片機中使用的串行通信都是異步方式,因此本系統(tǒng)采用異步串行通信方式來實現(xiàn)上位機與下位機之間的通信。

異步串行通信是以字符為單位組成的禎傳送的,即一禎一禎地傳送。禎由發(fā)送端一禎一禎地發(fā)送,通過傳輸線被接收一禎一禎地接收。發(fā)送端何時開始發(fā)送以及何時結(jié)束發(fā)送是由禎格式規(guī)定的。通信線上沒有數(shù)據(jù)傳送時為邏輯高電平,每當(dāng)接收端檢測到傳輸線上發(fā)送來的邏輯低電平(禎起始位)時就知道發(fā)送端已開始發(fā)送,每當(dāng)接收端接收到禎的停止位時就知道一禎字符信息已發(fā)送完畢。

禎是一個字符的完整通信格式,由起始位、數(shù)據(jù)位、奇偶校驗位和停止位等四部分組成。字符傳送的禎格式如圖3.1所示:

3.1 異步通信的禎格式

禎中各部分結(jié)構(gòu)和功能如下:

1)起始位:位于字符禎開頭,始終為邏輯“0低電平。用于向接收設(shè)備表示發(fā)送端開始發(fā)送一禎信息。

2)數(shù)據(jù)位:緊跟起始位之后,數(shù)據(jù)位的個數(shù)可以是5、6、7、89位。PC機中經(jīng)常采用7位或8位數(shù)據(jù)傳送,8051串行口采用8位或9位數(shù)據(jù)傳送。傳送時,數(shù)據(jù)位從最低有效位開始發(fā)送,依次在接收設(shè)備中被轉(zhuǎn)換為并行數(shù)據(jù)。

3)奇偶校驗位:位于數(shù)據(jù)位后,用于對字符傳送作正確性檢查,因此奇偶校驗位是可選擇的,共有3種可能,即奇校驗、偶校驗和無校驗,由用戶根據(jù)需要選定。

4)停止位:位于字符禎末尾,為邏輯“1高電平,用于標(biāo)志一個字符傳送的結(jié)束。可取1、1.52位。

2、串行通信的數(shù)據(jù)傳送方式

在串行通信中,數(shù)據(jù)通常是在發(fā)送端和接收端之間進行傳送,根據(jù)數(shù)據(jù)傳送的方向,可分成三種基本的傳送形式:單工、全雙工和半雙工。

單工形式的數(shù)據(jù)傳送是單向的,只需要一根數(shù)據(jù)線,通信線的一端固定為發(fā)送端,另一端固定為接收端。半雙工形式的數(shù)據(jù)傳送是雙向的,但任何時刻只能由其中的一方發(fā)送數(shù)據(jù),另一方接收數(shù)據(jù)。雖然半雙工形式比單工形式靈活,但它的效率依然較低,從發(fā)送方式轉(zhuǎn)換到接收方式所需要的時間大約為數(shù)個毫秒,這個時間延遲在時間較為敏感的系統(tǒng)是無法忍受的。全雙工形式下,采用了信道劃分技術(shù),避免了半雙工形式的缺點,數(shù)據(jù)傳送是雙向的,且可以同時發(fā)送和接收數(shù)據(jù)。本系統(tǒng)采用了效率較高的全雙工通信形式。

3、串行通信的傳送速率

在串行通信中,用“波特率”來描述數(shù)據(jù)的傳輸速率。所謂波特率,即每秒鐘傳送的二進制位數(shù),其單位為bps。它是衡量串行數(shù)據(jù)傳輸快慢的重要指標(biāo)。接收方的波特率和發(fā)送方的波特率可以分別設(shè)置,但接收方的波特率必須與發(fā)送方的波特率相同。

1.1.2 RS-232總線標(biāo)準

在串行通信時,要求雙方都采用一個標(biāo)準接口,使不同的設(shè)備可以方便地連接起來進行通信。RS-232C是美國電子工業(yè)協(xié)會   EIA公布的串行通信標(biāo)準,RSRecommended Standard的字頭縮寫,代表推薦,232是標(biāo)識號,C表示修改的次數(shù)。RS-232C適用于短距離或帶調(diào)制解調(diào)器的通信場合,目前已廣泛應(yīng)用于計算機與外圍設(shè)備的串行異步通信接口中。

1、機械特性

RS-232C的機械特性主要指兩個通信裝置如何實現(xiàn)機械對接。RS-232C是數(shù)據(jù)終端設(shè)備DTE與數(shù)據(jù)通訊設(shè)備DCE之間的接口,RS-232C的機械標(biāo)準規(guī)定DTE應(yīng)配置DB25插頭,即25針連接器,DEC應(yīng)配置DB25的插座,即25孔連接器。

3.1 計算機DB-9連接器引腳信號功能

引腳號

信號名稱

方向

信號功能

1

DCD

PC對方

PC機收到遠程信號(載波檢測)

2

RXD

PC對方

PC機接收數(shù)據(jù)

3

TXD

PC對方

PC機發(fā)送數(shù)據(jù)

4

DTR

PC對方

PC機準備就緒

5

GND

——

信號地

6

DSR

PC對方

對方準備就緒

7

RTS

PC對方

PC機請求發(fā)送數(shù)據(jù)

8

CTS

PC對方

對方已切換到接收狀態(tài)(清除發(fā)送)

9

RI

PC對方

通知PC機,線路正常(振鈴指示)

 

實際應(yīng)用中,DB-25型連接器中的許多信號用不上,對于一般的雙工通信,僅需幾條信號線就可實現(xiàn),包括一條發(fā)送線、一條接收線和一條地線。因此普遍采用DB9插頭,即9針連接器。表3.1給出了DB9連接器的信號引腳功能。

本系統(tǒng)采用DB9型連接器,通過三根線實現(xiàn)系統(tǒng)連接,即接收數(shù)據(jù)引腳與發(fā)送數(shù)據(jù)引腳彼此交叉相連,信號地對應(yīng)相接。這是最常用的全雙工最簡單系統(tǒng)連接法。

2、電氣特性

RS-232標(biāo)準的電氣特性如表3.2所示。

3.2 RS-232標(biāo)準的電氣特性

不帶負載時驅(qū)動器輸出電平

-25V~25V

負載電阻范圍

3~7k

驅(qū)動器輸出電阻

<300

負載電容(包括線間電容)

<2500pF

邏輯0時驅(qū)動器輸出電平

5~15V

邏輯0時負載端接收電平

>+3V

邏輯1時驅(qū)動器輸出電平

-15~-5V

邏輯1時負載端接收電平

<-3V

輸出短路電流

<500mA

驅(qū)動器轉(zhuǎn)換速率

<30

 

由表4.2可以看出RS-232C電平采用負邏輯,邏輯“0”:+5~+15V,邏輯“1”:-5~-15V。在計算機和智能儀器內(nèi),通用的信號是正邏輯的TTL電平。而RS-232C電平是負邏輯的,與TTL電平不兼容,必須進行電平轉(zhuǎn)換。電平轉(zhuǎn)換通常可以使用MC1488、MC1489、MAX232等芯片來實現(xiàn)。本系統(tǒng)是采用MAX232芯片實現(xiàn)電平轉(zhuǎn)換的。

RS-232標(biāo)準規(guī)定的波特率為:50、75、100、150、300、600、1200、4800、960019200bps。本系統(tǒng)波特率采用9600bps。

1.2 Visual Basic6.0中的串行通信控件MSComm

Visual Basic是一種可視化的編程語言,利用可視化技術(shù)進行編程,可使應(yīng)用程序的開發(fā)簡單、快捷,可編寫出界面友好、功能強大的應(yīng)用程序。MSComm控件全稱為Microsoft Communications Control,是Microsoft公司提供的ActiveX控件,目的是為了簡化Windows下串行通信編程,它既可以用來提供簡單的串口端口通信功能,也可以用來創(chuàng)建功能完備的、事件驅(qū)動的高級通信工具。

MSComm控件在串口編程時非常方便,程序員不必花時間去了解較為復(fù)雜的API函數(shù),而且在Visual Basic、Visual C++Delphi等語言中均可以使用。使用它可以建立與串行端口的連接,通過串行端口連接到其它通信設(shè)備(如調(diào)制解調(diào)器),發(fā)出命令,交換數(shù)據(jù),以及監(jiān)視和響應(yīng)串行連接中發(fā)生的事件和錯誤。

1.2.1 MSComm控件處理通信的方式

MSComm控件通過串行端口傳輸和接收數(shù)據(jù),為應(yīng)用程序提供串行通信功能。

它提供下列兩種處理通信的方式。

1、事件驅(qū)動方式

事件驅(qū)動通信是處理串行端口交互作用的一種非常有效的方法。在許多情況下,在事件發(fā)生時程序得到通知,例如,在串口接收緩沖區(qū)中有一個字符到達或一個變化發(fā)生時,程序都可以利用MSComm控件的OnComm事件捕獲并處理這些通信事件,OnComm事件還可以檢查和處理通信錯誤。在程序設(shè)計中,可以在OnComm事件處理函數(shù)中加入自己的處理代碼,一旦事件發(fā)生即可自動執(zhí)行該段程序。這種方法的優(yōu)點是程序響應(yīng)及時,可靠性高。

2、查詢方式

在程序的每個關(guān)鍵功能完成之后,可以通過檢查CommEvent屬性的值來查詢事件和錯誤。適用于自保持的應(yīng)用程序較小的編程。查詢方式的編程可用計時器或DoLoop程序?qū)崿F(xiàn)。其實,查詢方式實質(zhì)上還是事件驅(qū)動,但在有些情況下,這種方式顯得更為便捷。

1.2.2 MSComm控件的常用屬性

對控件編程首先需要了解它的屬性和事件。下面介紹MSComm控件的一些主要屬性,如表3.3所示。

 

 

 

 

3.3 MSComm控件的主要屬性

屬性

描述

Commport

設(shè)置并返回通信串口號

Settings

以字符串的形式設(shè)置并返回串口波特率、奇偶校驗、數(shù)據(jù)位、停止位。格式為:MSComm1.Settings=BBBB,P,D,S

Portopen

設(shè)置并返回串口狀態(tài),也可以打開和關(guān)閉串口

Input

從接收緩沖區(qū)中讀取數(shù)據(jù)并清空緩沖區(qū)

Inputlen

設(shè)置并返回一次從接收緩沖區(qū)中讀取字節(jié)數(shù)

InBufferSize

設(shè)置并返回接收緩沖區(qū)的大小,缺省值為1024字節(jié)

InBufferCount

設(shè)置并返回接收緩沖區(qū)中等待接收的字符數(shù)

InputMode

設(shè)置并返回接收數(shù)據(jù)的類型。其值為01時,分別表示通過Input屬性以文本方式和二進制方式取回數(shù)據(jù)

OutBufferSize

設(shè)置并返回發(fā)送緩沖區(qū)的大小,缺省值為512字節(jié)

OutBufferCount

設(shè)置并返回發(fā)送緩沖區(qū)中等待計算機發(fā)送的字符數(shù)

Output

向發(fā)送緩沖區(qū)發(fā)送數(shù)據(jù),該屬性設(shè)計時無效,運行時只讀

Rthreshold

MSComm控件設(shè)置ConunEvent屬性為comEvReceive并產(chǎn)生OnComm之前,設(shè)置并返回要接收的字符數(shù)

 

其中CommEvent屬性是一個非常重要的屬性。一旦串口發(fā)生通信事件或產(chǎn)生錯誤,依據(jù)產(chǎn)生的事件和錯誤,MSComm控件為CommEvent屬性賦以不同的代碼,同時產(chǎn)生OnComm事件。用戶程序就可在OnComm事件處理程序中針對不同的代碼,進行相應(yīng)的處理。CommEvent屬性的事件代碼、常數(shù)以及含義參見表3.4和表3.5。

3.4 CommEvent通信事件代碼、常數(shù)及含義表

事件代碼

常值

含義

1

ComEvRecive

接收到Rthreshold個字符。該事件將連續(xù)產(chǎn)生,直到用Input屬性從接收緩沖區(qū)中讀取并刪除字符

2

ComEvSend

發(fā)送緩沖區(qū)中數(shù)據(jù)少于Sthreshold個,說明串口已經(jīng)發(fā)送了一些數(shù)據(jù),程序可以用Output屬性繼續(xù)發(fā)送數(shù)據(jù)

3

ComEvCTS

Clear To Send信號線的狀態(tài)發(fā)生變化

4

ComEvDSR

Data Set Ready信號線從1變到0

5

ComEvCD

Carrier Detect信號線的狀態(tài)發(fā)生變化

6

ComEvRing

檢測到振鈴信號

7

ComEvEOF

接收到文件結(jié)束符

 

3.5 ComEventnt通信錯誤代碼、常數(shù)及含義表

事件代碼

常數(shù)

含義

1001

ComEvntBreak

接收到一個中斷信號

1002

ComEvntCTSTO

Clear To Send信號超時

1003

ComEvntDSRTO

Data Set Ready信號超時

1004

ComEvntFrame

禎錯誤

1006

ComEvntOverrun

串口超速

1007

ComEvntCDTO

載波檢測超時

1008

ComEvntRxOver

接收緩沖區(qū)溢出,緩沖區(qū)中已沒有空間

1009

ComEvntRxParity

奇偶校驗錯

1010

ComEvntTxFull

發(fā)送緩沖區(qū)溢出,緩沖區(qū)中已沒有空間

1011

ComEvntDCB

檢測串口的設(shè)備控制塊時發(fā)生錯誤

 

1.2.3 MSComm控件的使用

MSComm控件通信的流程圖如圖3.2所示。編寫程序時,只需要按照下面流程圖,即可實現(xiàn)通信功能。

3.2 MSComm控件通信的流程圖

1.3 PC機與AT89S51單片機的通信

PC機與單片機之間的串行通信主要實現(xiàn)下位機的溫度數(shù)據(jù)的采集和傳輸。下位機程序用匯編語言編寫,固化在AT89SC51單片機中。單片機是測量系統(tǒng)的數(shù)據(jù)采集端,它主要完成對多個測溫傳感器DS18B20的控制和溫度數(shù)據(jù)的讀取以及同上位機的數(shù)據(jù)通信。上位機軟件用VB編寫,主要完成通信參數(shù)設(shè)置和溫度數(shù)據(jù)的轉(zhuǎn)換。

通信參數(shù)設(shè)置主要用來完成對系統(tǒng)通信參數(shù)的設(shè)置,包括設(shè)定通信端口、波特率、數(shù)據(jù)位、奇偶校驗位和停止位。溫度數(shù)據(jù)的轉(zhuǎn)換主要實現(xiàn)對接受到的溫度數(shù)據(jù)由十六進制到十進制的轉(zhuǎn)換,同時這一步也為后面的數(shù)據(jù)庫的生成及溫度信息管理工作做好了準備。

1.3.1 硬件連接線路

PC機與單片機之間的通信通過串口實現(xiàn)。由于RS232電平與TTL電平不兼容,本系統(tǒng)通過MAX232芯片實現(xiàn)TTL電平到RS232電平的轉(zhuǎn)換,MAX232芯片是包含兩路接收器和驅(qū)動器的RS232電平轉(zhuǎn)換芯片,適用于各種232通信接口。如圖3.3所示。

3.3 PC與硬件單片機的連接電路圖

1.3.2 通信協(xié)議

為使數(shù)據(jù)在PC和單片機之間無差錯的傳送,本文采用通信協(xié)議來規(guī)約數(shù)據(jù)的傳輸。PC機與單片機雙方的通信協(xié)議如下:

波特率:9600bps;

數(shù)據(jù)格式:8位數(shù)據(jù)位,1位停止位,無奇偶校驗;

傳送方式:PC機和單片機都采用查詢方式收發(fā)數(shù)據(jù),傳送的數(shù)據(jù)格式為二進制格式。DS18B20轉(zhuǎn)換出的溫度信息包含兩個字節(jié),經(jīng)過處理后,一個字節(jié)為溫度的整數(shù)部分,另一個字節(jié)為溫度的小數(shù)部分。每個DS18B20共傳送三個字節(jié),第一個字節(jié)為傳感器所在的行列號,第二個字節(jié)是溫度的整數(shù)部分,第三個字節(jié)是溫度的小數(shù)部分。單片機收到PC機發(fā)送的握手信號“S”后,就依次命令DS18B20進行溫度轉(zhuǎn)換;PC機依次接收單片機上傳過來的數(shù)據(jù),并顯示在特定區(qū)域。

1.3.3 VB程序編制

本系統(tǒng)串行通信的界面如圖3.4所示:

3.4 串行通信的界面

因為系統(tǒng)采用的是事件驅(qū)動,所以具體程序的編制必須圍繞相應(yīng)的事件進行。本系統(tǒng)中,有關(guān)通信的工作過程主要有:通信參數(shù)初始化、發(fā)送握手信號、接收數(shù)據(jù)。具體初始化程序如下:

Private Sub Form_Load()

MSComm1.CommPort = 1                '設(shè)置通訊窗口

MSComm1.Settings = "9600,N,8,1"     '設(shè)置數(shù)據(jù)傳輸率和發(fā)送字符格式

MSComm1.InputMode = comInputModeText

MSComm1.InBufferSize = 1024         '設(shè)置接收緩沖區(qū)1024Byte

MSComm1.InputLen = 0                '設(shè)置或返回一次從接收緩沖區(qū)中讀取字節(jié)數(shù),0表示一次讀取所有數(shù)據(jù)

MSComm1.RThreshold = 21

If MSComm1.PortOpen = False Then     '打開串口

   MSComm1.PortOpen = True

End If

End Sub

初始化完成后,PC機就可以與單片機進行通信了。點擊“開始接收”按鈕即可完成向單片機發(fā)送握手信號功能。

發(fā)送程序為:

Dim rece As String

rece = MSComm1.Input

If Mid(rece, 1, 1) = "S" Then

Text1.Text = Text1.Text & rece

Else

Text1.Text = Text1.Text

End If

單片機接收到PC機發(fā)送的握手信號S后,就依次命令總線上的DS18B20進行溫度轉(zhuǎn)換并向PC機發(fā)送轉(zhuǎn)換后的溫度信息。我們在OnComm事件里進行溫度數(shù)據(jù)的接收和轉(zhuǎn)換。在轉(zhuǎn)換后的溫度之間加上一個空格,且在單個DS18B20溫度信息末尾加上回車和換行符,目的是為PC機接收到的溫度信息保存的文本文件轉(zhuǎn)換成數(shù)據(jù)庫作好準備。如果系統(tǒng)初始化不正;DS18B20端脫開未接好時,轉(zhuǎn)換出的溫度為默認初始值+85,溫度高低字節(jié)為05H50H。系統(tǒng)檢測到DS18B20轉(zhuǎn)換的溫度值為上面兩種情況時,我們在接收區(qū)顯示該測點出現(xiàn)“測量有誤”字樣,提醒我們對系統(tǒng)進行硬件線路檢查。OnComm事件程序如下:

Private Sub MSComm1_OnComm()

Dim buffer As Variant

Dim arr() As Byte

Dim i As Integer, a As Integer

Dim restr1 As String, restr2 As String, srestr3 As String, ABC As String

a = MSComm1.InBufferCount

Select Case MSComm1.CommEvent

Case comEvReceive

buffer = MSComm1.Input

arr = buffer

For i = 0 To 18 Step 3

restr1 = arr(i)

restr2 = arr(i + 1)

restr3 = arr(i + 2)

If restr2 = 127 And restr3 = 240 Then

Text1.Text = Text1.Text = Str(Now) + " " + restr1 + " " + "測量有誤" + " " + Chr(13) + Chr(10)

Else

If Val(restr3) = 0 Then

ABC = "." + Mid$(Str(Val(restr3) / 256), 2, 3)

Else

ABC = Mid$(Str(Val(restr3) / 256), 2, 3)

End If

Text1.Text = Text1.Text + Str(Now) + "    " + restr1 + "    " + restr2 + ABC + "   " + Chr(13) + Chr(10)

End If

Next i

End Select

End Sub

 

評論 (0 個評論)

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

返回頂部