||
多點(diǎn)溫度監(jiān)控系統(tǒng)下位機(jī)將溫度轉(zhuǎn)換并將溫度值存儲(chǔ)到單片機(jī)的RAM里,本章主要討論采用比較廉價(jià)的通信方式—RS232來(lái)實(shí)現(xiàn)多點(diǎn)溫度監(jiān)控系統(tǒng)的上位機(jī)(PC機(jī))向下位機(jī)(單片機(jī))發(fā)送信息以及上位機(jī)接收下位機(jī)的溫度信息并加以處理。
1.1 串行通信及RS—232總線
多點(diǎn)溫度監(jiān)控系統(tǒng)下位機(jī)采集到的大量溫度信息,需要傳送至上位機(jī),為接下來(lái)的溫度分析處理提供數(shù)據(jù)。下位機(jī)只有一個(gè)單片機(jī)與PC機(jī)通信且兩者之間的距離不是很長(zhǎng),因此我們采用異步串行通信中應(yīng)用最廣的RS-232標(biāo)準(zhǔn)總線實(shí)現(xiàn)兩者之間的信息傳遞。本節(jié)將主要介紹串行通信的基本概念,數(shù)據(jù)傳送方式,RS-232總線標(biāo)準(zhǔn)等。
隨著計(jì)算機(jī)系統(tǒng)的應(yīng)用和微機(jī)網(wǎng)絡(luò)的發(fā)展,計(jì)算機(jī)的通信功能顯得尤為重要。從廣義上講,計(jì)算機(jī)通信可以分為并行通信和串行通信。并行通信速度快、實(shí)時(shí)性好,但占用的口線多、成本高、通信距離短,不適用于小型化產(chǎn)品。串行通信只需一根傳輸線即可完成通信功能,成本低,在通信中得到了廣泛應(yīng)用。計(jì)算機(jī)與外界的數(shù)據(jù)傳送大多數(shù)都是串行的,通常把計(jì)算機(jī)與外界的數(shù)據(jù)傳送稱之為通信,因此提到的通信大多數(shù)都是指串行通信。
1、串行通信的概念
串行通信是計(jì)算機(jī)與外部設(shè)備進(jìn)行信息交換的一種方式,是指數(shù)據(jù)一位一位地按順序在一根信號(hào)線上進(jìn)行傳輸?shù)耐ㄐ欧绞健4型ㄐ庞袃煞N基本工作方式:異步傳送和同步傳送。在單片機(jī)中使用的串行通信都是異步方式,因此本系統(tǒng)采用異步串行通信方式來(lái)實(shí)現(xiàn)上位機(jī)與下位機(jī)之間的通信。
異步串行通信是以字符為單位組成的禎傳送的,即一禎一禎地傳送。禎由發(fā)送端一禎一禎地發(fā)送,通過(guò)傳輸線被接收一禎一禎地接收。發(fā)送端何時(shí)開(kāi)始發(fā)送以及何時(shí)結(jié)束發(fā)送是由禎格式規(guī)定的。通信線上沒(méi)有數(shù)據(jù)傳送時(shí)為邏輯高電平,每當(dāng)接收端檢測(cè)到傳輸線上發(fā)送來(lái)的邏輯低電平(禎起始位)時(shí)就知道發(fā)送端已開(kāi)始發(fā)送,每當(dāng)接收端接收到禎的停止位時(shí)就知道一禎字符信息已發(fā)送完畢。
禎是一個(gè)字符的完整通信格式,由起始位、數(shù)據(jù)位、奇偶校驗(yàn)位和停止位等四部分組成。字符傳送的禎格式如圖3.1所示:
圖3.1 異步通信的禎格式
禎中各部分結(jié)構(gòu)和功能如下:
1)起始位:位于字符禎開(kāi)頭,始終為邏輯“0”低電平。用于向接收設(shè)備表示發(fā)送端開(kāi)始發(fā)送一禎信息。
2)數(shù)據(jù)位:緊跟起始位之后,數(shù)據(jù)位的個(gè)數(shù)可以是5、6、7、8或9位。PC機(jī)中經(jīng)常采用7位或8位數(shù)據(jù)傳送,8051串行口采用8位或9位數(shù)據(jù)傳送。傳送時(shí),數(shù)據(jù)位從最低有效位開(kāi)始發(fā)送,依次在接收設(shè)備中被轉(zhuǎn)換為并行數(shù)據(jù)。
3)奇偶校驗(yàn)位:位于數(shù)據(jù)位后,用于對(duì)字符傳送作正確性檢查,因此奇偶校驗(yàn)位是可選擇的,共有3種可能,即奇校驗(yàn)、偶校驗(yàn)和無(wú)校驗(yàn),由用戶根據(jù)需要選定。
4)停止位:位于字符禎末尾,為邏輯“1”高電平,用于標(biāo)志一個(gè)字符傳送的結(jié)束。可取1、1.5或2位。
2、串行通信的數(shù)據(jù)傳送方式
在串行通信中,數(shù)據(jù)通常是在發(fā)送端和接收端之間進(jìn)行傳送,根據(jù)數(shù)據(jù)傳送的方向,可分成三種基本的傳送形式:?jiǎn)喂ぁ⑷p工和半雙工。
單工形式的數(shù)據(jù)傳送是單向的,只需要一根數(shù)據(jù)線,通信線的一端固定為發(fā)送端,另一端固定為接收端。半雙工形式的數(shù)據(jù)傳送是雙向的,但任何時(shí)刻只能由其中的一方發(fā)送數(shù)據(jù),另一方接收數(shù)據(jù)。雖然半雙工形式比單工形式靈活,但它的效率依然較低,從發(fā)送方式轉(zhuǎn)換到接收方式所需要的時(shí)間大約為數(shù)個(gè)毫秒,這個(gè)時(shí)間延遲在時(shí)間較為敏感的系統(tǒng)是無(wú)法忍受的。全雙工形式下,采用了信道劃分技術(shù),避免了半雙工形式的缺點(diǎn),數(shù)據(jù)傳送是雙向的,且可以同時(shí)發(fā)送和接收數(shù)據(jù)。本系統(tǒng)采用了效率較高的全雙工通信形式。
3、串行通信的傳送速率
在串行通信中,用“波特率”來(lái)描述數(shù)據(jù)的傳輸速率。所謂波特率,即每秒鐘傳送的二進(jìn)制位數(shù),其單位為bps。它是衡量串行數(shù)據(jù)傳輸快慢的重要指標(biāo)。接收方的波特率和發(fā)送方的波特率可以分別設(shè)置,但接收方的波特率必須與發(fā)送方的波特率相同。
1.1.2 RS-232總線標(biāo)準(zhǔn)
在串行通信時(shí),要求雙方都采用一個(gè)標(biāo)準(zhǔn)接口,使不同的設(shè)備可以方便地連接起來(lái)進(jìn)行通信。RS-232C是美國(guó)電子工業(yè)協(xié)會(huì) EIA公布的串行通信標(biāo)準(zhǔn),RS是Recommended Standard的字頭縮寫(xiě),代表推薦,232是標(biāo)識(shí)號(hào),C表示修改的次數(shù)。RS-232C適用于短距離或帶調(diào)制解調(diào)器的通信場(chǎng)合,目前已廣泛應(yīng)用于計(jì)算機(jī)與外圍設(shè)備的串行異步通信接口中。
1、機(jī)械特性
RS-232C的機(jī)械特性主要指兩個(gè)通信裝置如何實(shí)現(xiàn)機(jī)械對(duì)接。RS-232C是數(shù)據(jù)終端設(shè)備DTE與數(shù)據(jù)通訊設(shè)備DCE之間的接口,RS-232C的機(jī)械標(biāo)準(zhǔn)規(guī)定DTE應(yīng)配置DB25插頭,即25針連接器,DEC應(yīng)配置DB25的插座,即25孔連接器。
表3.1 計(jì)算機(jī)DB-9連接器引腳信號(hào)功能
引腳號(hào) |
信號(hào)名稱 |
方向 |
信號(hào)功能 |
1 |
DCD |
PC機(jī)←對(duì)方 |
PC機(jī)收到遠(yuǎn)程信號(hào)(載波檢測(cè)) |
2 |
RXD |
PC機(jī)←對(duì)方 |
PC機(jī)接收數(shù)據(jù) |
3 |
TXD |
PC機(jī)→對(duì)方 |
PC機(jī)發(fā)送數(shù)據(jù) |
4 |
DTR |
PC機(jī)→對(duì)方 |
PC機(jī)準(zhǔn)備就緒 |
5 |
GND |
—— |
信號(hào)地 |
6 |
DSR |
PC機(jī)←對(duì)方 |
對(duì)方準(zhǔn)備就緒 |
7 |
RTS |
PC機(jī)→對(duì)方 |
PC機(jī)請(qǐng)求發(fā)送數(shù)據(jù) |
8 |
CTS |
PC機(jī)←對(duì)方 |
對(duì)方已切換到接收狀態(tài)(清除發(fā)送) |
9 |
RI |
PC機(jī)←對(duì)方 |
通知PC機(jī),線路正常(振鈴指示) |
實(shí)際應(yīng)用中,DB-25型連接器中的許多信號(hào)用不上,對(duì)于一般的雙工通信,僅需幾條信號(hào)線就可實(shí)現(xiàn),包括一條發(fā)送線、一條接收線和一條地線。因此普遍采用DB9插頭,即9針連接器。表3.1給出了DB9連接器的信號(hào)引腳功能。
本系統(tǒng)采用DB9型連接器,通過(guò)三根線實(shí)現(xiàn)系統(tǒng)連接,即接收數(shù)據(jù)引腳與發(fā)送數(shù)據(jù)引腳彼此交叉相連,信號(hào)地對(duì)應(yīng)相接。這是最常用的全雙工最簡(jiǎn)單系統(tǒng)連接法。
2、電氣特性
RS-232標(biāo)準(zhǔn)的電氣特性如表3.2所示。
表3.2 RS-232標(biāo)準(zhǔn)的電氣特性
不帶負(fù)載時(shí)驅(qū)動(dòng)器輸出電平 |
-25V~25V |
負(fù)載電阻 |
3~7k歐 |
驅(qū)動(dòng)器輸出電阻 |
<300歐 |
負(fù)載電容(包括線間電容) |
<2500pF |
邏輯“0”時(shí)驅(qū)動(dòng)器輸出電平 |
5~15V |
邏輯“0”時(shí)負(fù)載端接收電平 |
>+3V |
邏輯“1”時(shí)驅(qū)動(dòng)器輸出電平 |
-15~-5V |
邏輯“1”時(shí)負(fù)載端接收電平 |
<-3V |
輸出短路電流 |
<500mA |
驅(qū)動(dòng)器轉(zhuǎn)換速率 |
<30 |
由表4.2可以看出RS-232C電平采用負(fù)邏輯,邏輯“0”:+5~+15V,邏輯“1”:-5~-15V。在計(jì)算機(jī)和智能儀器內(nèi),通用的信號(hào)是正邏輯的TTL電平。而RS-232C電平是負(fù)邏輯的,與TTL電平不兼容,必須進(jìn)行電平轉(zhuǎn)換。電平轉(zhuǎn)換通常可以使用MC1488、MC1489、MAX232等芯片來(lái)實(shí)現(xiàn)。本系統(tǒng)是采用MAX232芯片實(shí)現(xiàn)電平轉(zhuǎn)換的。
RS-232標(biāo)準(zhǔn)規(guī)定的波特率為:50、75、100、150、300、600、1200、4800、9600和19200bps。本系統(tǒng)波特率采用9600bps。
1.2 Visual Basic6.0中的串行通信控件MSComm
Visual Basic是一種可視化的編程語(yǔ)言,利用可視化技術(shù)進(jìn)行編程,可使應(yīng)用程序的開(kāi)發(fā)簡(jiǎn)單、快捷,可編寫(xiě)出界面友好、功能強(qiáng)大的應(yīng)用程序。MSComm控件全稱為Microsoft Communications Control,是Microsoft公司提供的ActiveX控件,目的是為了簡(jiǎn)化Windows下串行通信編程,它既可以用來(lái)提供簡(jiǎn)單的串口端口通信功能,也可以用來(lái)創(chuàng)建功能完備的、事件驅(qū)動(dòng)的高級(jí)通信工具。
MSComm控件在串口編程時(shí)非常方便,程序員不必花時(shí)間去了解較為復(fù)雜的API函數(shù),而且在Visual Basic、Visual C++、Delphi等語(yǔ)言中均可以使用。使用它可以建立與串行端口的連接,通過(guò)串行端口連接到其它通信設(shè)備(如調(diào)制解調(diào)器),發(fā)出命令,交換數(shù)據(jù),以及監(jiān)視和響應(yīng)串行連接中發(fā)生的事件和錯(cuò)誤。
1.2.1 MSComm控件處理通信的方式
MSComm控件通過(guò)串行端口傳輸和接收數(shù)據(jù),為應(yīng)用程序提供串行通信功能。
它提供下列兩種處理通信的方式。
1、事件驅(qū)動(dòng)方式
事件驅(qū)動(dòng)通信是處理串行端口交互作用的一種非常有效的方法。在許多情況下,在事件發(fā)生時(shí)程序得到通知,例如,在串口接收緩沖區(qū)中有一個(gè)字符到達(dá)或一個(gè)變化發(fā)生時(shí),程序都可以利用MSComm控件的OnComm事件捕獲并處理這些通信事件,OnComm事件還可以檢查和處理通信錯(cuò)誤。在程序設(shè)計(jì)中,可以在OnComm事件處理函數(shù)中加入自己的處理代碼,一旦事件發(fā)生即可自動(dòng)執(zhí)行該段程序。這種方法的優(yōu)點(diǎn)是程序響應(yīng)及時(shí),可靠性高。
2、查詢方式
在程序的每個(gè)關(guān)鍵功能完成之后,可以通過(guò)檢查CommEvent屬性的值來(lái)查詢事件和錯(cuò)誤。適用于自保持的應(yīng)用程序較小的編程。查詢方式的編程可用計(jì)時(shí)器或Do…Loop程序?qū)崿F(xiàn)。其實(shí),查詢方式實(shí)質(zhì)上還是事件驅(qū)動(dòng),但在有些情況下,這種方式顯得更為便捷。
1.2.2 MSComm控件的常用屬性
對(duì)控件編程首先需要了解它的屬性和事件。下面介紹MSComm控件的一些主要屬性,如表3.3所示。
表3.3 MSComm控件的主要屬性
屬性 |
描述 |
Commport |
設(shè)置并返回通信串口號(hào) |
Settings |
以字符串的形式設(shè)置并返回串口波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止位。格式為:MSComm1.Settings=”BBBB,P,D,S” |
Portopen |
設(shè)置并返回串口狀態(tài),也可以打開(kā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時(shí),分別表示通過(guò)Input屬性以文本方式和二進(jìn)制方式取回?cái)?shù)據(jù) |
OutBufferSize |
設(shè)置并返回發(fā)送緩沖區(qū)的大小,缺省值為512字節(jié) |
OutBufferCount |
設(shè)置并返回發(fā)送緩沖區(qū)中等待計(jì)算機(jī)發(fā)送的字符數(shù) |
Output |
向發(fā)送緩沖區(qū)發(fā)送數(shù)據(jù),該屬性設(shè)計(jì)時(shí)無(wú)效,運(yùn)行時(shí)只讀 |
Rthreshold |
在MSComm控件設(shè)置ConunEvent屬性為comEvReceive并產(chǎn)生OnComm之前,設(shè)置并返回要接收的字符數(shù) |
其中CommEvent屬性是一個(gè)非常重要的屬性。一旦串口發(fā)生通信事件或產(chǎn)生錯(cuò)誤,依據(jù)產(chǎn)生的事件和錯(cuò)誤,MSComm控件為CommEvent屬性賦以不同的代碼,同時(shí)產(chǎn)生OnComm事件。用戶程序就可在OnComm事件處理程序中針對(duì)不同的代碼,進(jìn)行相應(yīng)的處理。CommEvent屬性的事件代碼、常數(shù)以及含義參見(jiàn)表3.4和表3.5。
表3.4 CommEvent通信事件代碼、常數(shù)及含義表
事件代碼 |
常值 |
含義 |
1 |
ComEvRecive |
接收到Rthreshold個(gè)字符。該事件將連續(xù)產(chǎn)生,直到用Input屬性從接收緩沖區(qū)中讀取并刪除字符 |
2 |
ComEvSend |
發(fā)送緩沖區(qū)中數(shù)據(jù)少于Sthreshold個(gè),說(shuō)明串口已經(jīng)發(fā)送了一些數(shù)據(jù),程序可以用Output屬性繼續(xù)發(fā)送數(shù)據(jù) |
3 |
ComEvCTS |
Clear To Send信號(hào)線的狀態(tài)發(fā)生變化 |
4 |
ComEvDSR |
Data Set Ready信號(hào)線從1變到0 |
5 |
ComEvCD |
Carrier Detect信號(hào)線的狀態(tài)發(fā)生變化 |
6 |
ComEvRing |
檢測(cè)到振鈴信號(hào) |
7 |
ComEvEOF |
接收到文件結(jié)束符 |
表3.5 ComEventnt通信錯(cuò)誤代碼、常數(shù)及含義表
事件代碼 |
常數(shù) |
含義 |
1001 |
ComEvntBreak |
接收到一個(gè)中斷信號(hào) |
1002 |
ComEvntCTSTO |
Clear To Send信號(hào)超時(shí) |
1003 |
ComEvntDSRTO |
Data Set Ready信號(hào)超時(shí) |
1004 |
ComEvntFrame |
禎錯(cuò)誤 |
1006 |
ComEvntOverrun |
串口超速 |
1007 |
ComEvntCDTO |
載波檢測(cè)超時(shí) |
1008 |
ComEvntRxOver |
接收緩沖區(qū)溢出,緩沖區(qū)中已沒(méi)有空間 |
1009 |
ComEvntRxParity |
奇偶校驗(yàn)錯(cuò) |
1010 |
ComEvntTxFull |
發(fā)送緩沖區(qū)溢出,緩沖區(qū)中已沒(méi)有空間 |
1011 |
ComEvntDCB |
檢測(cè)串口的設(shè)備控制塊時(shí)發(fā)生錯(cuò)誤 |
1.2.3 MSComm控件的使用
MSComm控件通信的流程圖如圖3.2所示。編寫(xiě)程序時(shí),只需要按照下面流程圖,即可實(shí)現(xiàn)通信功能。
圖3.2 MSComm控件通信的流程圖
1.3 PC機(jī)與AT89S51單片機(jī)的通信
PC機(jī)與單片機(jī)之間的串行通信主要實(shí)現(xiàn)下位機(jī)的溫度數(shù)據(jù)的采集和傳輸。下位機(jī)程序用匯編語(yǔ)言編寫(xiě),固化在AT89SC51單片機(jī)中。單片機(jī)是測(cè)量系統(tǒng)的數(shù)據(jù)采集端,它主要完成對(duì)多個(gè)測(cè)溫傳感器DS18B20的控制和溫度數(shù)據(jù)的讀取以及同上位機(jī)的數(shù)據(jù)通信。上位機(jī)軟件用VB編寫(xiě),主要完成通信參數(shù)設(shè)置和溫度數(shù)據(jù)的轉(zhuǎn)換。
通信參數(shù)設(shè)置主要用來(lái)完成對(duì)系統(tǒng)通信參數(shù)的設(shè)置,包括設(shè)定通信端口、波特率、數(shù)據(jù)位、奇偶校驗(yàn)位和停止位。溫度數(shù)據(jù)的轉(zhuǎn)換主要實(shí)現(xiàn)對(duì)接受到的溫度數(shù)據(jù)由十六進(jìn)制到十進(jìn)制的轉(zhuǎn)換,同時(shí)這一步也為后面的數(shù)據(jù)庫(kù)的生成及溫度信息管理工作做好了準(zhǔn)備。
PC機(jī)與單片機(jī)之間的通信通過(guò)串口實(shí)現(xiàn)。由于RS232電平與TTL電平不兼容,本系統(tǒng)通過(guò)MAX232芯片實(shí)現(xiàn)TTL電平到RS232電平的轉(zhuǎn)換,MAX232芯片是包含兩路接收器和驅(qū)動(dòng)器的RS232電平轉(zhuǎn)換芯片,適用于各種232通信接口。如圖3.3所示。
圖3.3 PC與硬件單片機(jī)的連接電路圖
為使數(shù)據(jù)在PC和單片機(jī)之間無(wú)差錯(cuò)的傳送,本文采用通信協(xié)議來(lái)規(guī)約數(shù)據(jù)的傳輸。PC機(jī)與單片機(jī)雙方的通信協(xié)議如下:
波特率:9600bps;
數(shù)據(jù)格式:8位數(shù)據(jù)位,1位停止位,無(wú)奇偶校驗(yàn);
傳送方式:PC機(jī)和單片機(jī)都采用查詢方式收發(fā)數(shù)據(jù),傳送的數(shù)據(jù)格式為二進(jìn)制格式。DS18B20轉(zhuǎn)換出的溫度信息包含兩個(gè)字節(jié),經(jīng)過(guò)處理后,一個(gè)字節(jié)為溫度的整數(shù)部分,另一個(gè)字節(jié)為溫度的小數(shù)部分。每個(gè)DS18B20共傳送三個(gè)字節(jié),第一個(gè)字節(jié)為傳感器所在的行列號(hào),第二個(gè)字節(jié)是溫度的整數(shù)部分,第三個(gè)字節(jié)是溫度的小數(shù)部分。單片機(jī)收到PC機(jī)發(fā)送的握手信號(hào)“S”后,就依次命令DS18B20進(jìn)行溫度轉(zhuǎn)換;PC機(jī)依次接收單片機(jī)上傳過(guò)來(lái)的數(shù)據(jù),并顯示在特定區(qū)域。
1.3.3 VB程序編制
本系統(tǒng)串行通信的界面如圖3.4所示:
圖3.4 串行通信的界面
因?yàn)橄到y(tǒng)采用的是事件驅(qū)動(dòng),所以具體程序的編制必須圍繞相應(yīng)的事件進(jìn)行。本系統(tǒng)中,有關(guān)通信的工作過(guò)程主要有:通信參數(shù)初始化、發(fā)送握手信號(hào)、接收數(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 '打開(kāi)串口
MSComm1.PortOpen = True
End If
End Sub
初始化完成后,PC機(jī)就可以與單片機(jī)進(jìn)行通信了。點(diǎn)擊“開(kāi)始接收”按鈕即可完成向單片機(jī)發(fā)送握手信號(hào)功能。
發(fā)送程序?yàn)椋?/font>
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
單片機(jī)接收到PC機(jī)發(fā)送的握手信號(hào)S后,就依次命令總線上的DS18B20進(jìn)行溫度轉(zhuǎn)換并向PC機(jī)發(fā)送轉(zhuǎn)換后的溫度信息。我們?cè)?/span>OnComm事件里進(jìn)行溫度數(shù)據(jù)的接收和轉(zhuǎn)換。在轉(zhuǎn)換后的溫度之間加上一個(gè)空格,且在單個(gè)DS18B20溫度信息末尾加上回車和換行符,目的是為PC機(jī)接收到的溫度信息保存的文本文件轉(zhuǎn)換成數(shù)據(jù)庫(kù)作好準(zhǔn)備。如果系統(tǒng)初始化不正常或DS18B20的端脫開(kāi)未接好時(shí),轉(zhuǎn)換出的溫度為默認(rèn)初始值+85℃,溫度高低字節(jié)為05H和50H。系統(tǒng)檢測(cè)到DS18B20轉(zhuǎn)換的溫度值為上面兩種情況時(shí),我們?cè)诮邮諈^(qū)顯示該測(cè)點(diǎn)出現(xiàn)“測(cè)量有誤”字樣,提醒我們對(duì)系統(tǒng)進(jìn)行硬件線路檢查。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 + " " + "測(cè)量有誤" + " " + 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 單片機(jī)教程網(wǎng)