||
多點溫度監(jiān)控系統(tǒng)下位機將溫度轉(zhuǎn)換并將溫度值存儲到單片機的RAM里,本章主要討論采用比較廉價的通信方式—RS232來實現(xiàn)多點溫度監(jiān)控系統(tǒng)的上位機(PC機)向下位機(單片機)發(fā)送信息以及上位機接收下位機的溫度信息并加以處理。
1.1 串行通信及RS—232總線
多點溫度監(jiān)控系統(tǒng)下位機采集到的大量溫度信息,需要傳送至上位機,為接下來的溫度分析處理提供數(shù)據(jù)。下位機只有一個單片機與PC機通信且兩者之間的距離不是很長,因此我們采用異步串行通信中應(yīng)用最廣的RS-232標(biāo)準總線實現(xiàn)兩者之間的信息傳遞。本節(jié)將主要介紹串行通信的基本概念,數(shù)據(jù)傳送方式,RS-232總線標(biāo)準等。
隨著計算機系統(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、8或9位。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.5或2位。
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)準,RS是Recommended 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、9600和19200bps。本系統(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)用程序較小的編程。查詢方式的編程可用計時器或Do…Loop程序?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ù)的類型。其值為0和1時,分別表示通過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ù)庫的生成及溫度信息管理工作做好了準備。
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與硬件單片機的連接電路圖
為使數(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é)為05H和50H。系統(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
Powered by 單片機教程網(wǎng)