国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

單片機(jī)模擬串口數(shù)據(jù)接收程序的實(shí)現(xiàn)及優(yōu)化

2016-09-15 07:03郟正學(xué)李煒
關(guān)鍵詞:接收數(shù)據(jù)子程序字節(jié)

郟正學(xué),李煒

(浙江省空間結(jié)構(gòu)重點(diǎn)實(shí)驗(yàn)室,杭州 310058)

?

單片機(jī)模擬串口數(shù)據(jù)接收程序的實(shí)現(xiàn)及優(yōu)化

郟正學(xué),李煒

(浙江省空間結(jié)構(gòu)重點(diǎn)實(shí)驗(yàn)室,杭州 310058)

進(jìn)行單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)開發(fā)時(shí),往往碰到單片機(jī)自身攜帶的串口不夠用,這時(shí)就需要通過I/O口模擬串口通信。本文簡單介紹了串口通信的基礎(chǔ)知識,分析了模擬串口接收數(shù)據(jù)的過程,介紹了模擬串口接收數(shù)據(jù)的實(shí)現(xiàn)方法,以ATmega64A單片機(jī)為例,詳細(xì)介紹了模擬串口數(shù)據(jù)接收程序的實(shí)現(xiàn)及優(yōu)化方法。

ATmega64A單片機(jī);串口通信;接收程序

引 言

圖1 串口通信數(shù)據(jù)幀格式

隨著信息技術(shù)的發(fā)展,單片機(jī)的應(yīng)用越來越廣泛,尤其是在儀器儀表、物聯(lián)網(wǎng)、自動化、智能化等領(lǐng)域,應(yīng)用非常多。近年來,各類傳感器不斷出現(xiàn),為了提高系統(tǒng)自動化、智能化程度,往往需要單片機(jī)與多個(gè)傳感器等外圍器件進(jìn)行連接通信。這類外圍器件中,串口通信用得比較多。因此,在嵌入式應(yīng)用系統(tǒng)設(shè)計(jì)開發(fā)時(shí),會經(jīng)常需要多個(gè)串口,而一般的單片機(jī)自身只有一個(gè)或兩個(gè)串口,串口不夠用,這時(shí)就需要利用單片機(jī)的I/O口模擬串口通信,以滿足應(yīng)用要求。

1 串口通信

在工業(yè)上,串口通信用得比較多的是RS232、RS485通信,本文所講的串口通信是指RS232。RS232串口通信數(shù)據(jù)幀由起始位、數(shù)據(jù)位、校驗(yàn)位、停止位組成,數(shù)據(jù)幀格式如圖1所示。St為起始位,1位,低電平;(n)為數(shù)據(jù)位,數(shù)據(jù)位可以是5~9位,具體多少位由串口通信協(xié)議設(shè)定;P為校驗(yàn)位,1位,可以是奇校驗(yàn)或偶校驗(yàn),也可以是無校驗(yàn)位,是否有校驗(yàn)位,由串口通信協(xié)議設(shè)定;Sp為停止位,1位或2位,停止位為高電平,停止位是1位還是2位,由串口通信協(xié)議設(shè)定。

當(dāng)串口通信協(xié)議設(shè)定為8個(gè)數(shù)據(jù)位、無校驗(yàn)位、1個(gè)停止位時(shí),1個(gè)數(shù)據(jù)幀即由1位的起始位、8位的數(shù)據(jù)位、1位的停止位組成,幀長度為10位。在串口通信協(xié)議中,除了前面的參數(shù)設(shè)定外,還有1個(gè)比較重要的參數(shù)——波特率,波特率為串口通信傳輸數(shù)據(jù)的速度,單位為bps,即每秒傳輸?shù)谋忍財(cái)?shù)。在串口通信中,可以設(shè)定的波特率有2 400、4 800、9 600、14 400、19 200、38 400等等。由于不同參數(shù)的串口通信,在編寫模擬串口程序時(shí)會稍有不同,因此本文以9 600波特率、8位數(shù)據(jù)位、無校驗(yàn)位、1個(gè)停止位為例進(jìn)行介紹。另外本文所講的是三線制串口通信,即RxD(接收)、TxD(發(fā)送)、GND三線。

串口通信發(fā)送或接收數(shù)據(jù)時(shí),都是按照數(shù)據(jù)幀格式一位一位發(fā)送或接收的。發(fā)送數(shù)據(jù)時(shí),數(shù)據(jù)低位先發(fā)送,高位后發(fā)送;接收數(shù)據(jù)時(shí),數(shù)據(jù)低位先接收,高位后接收。

2 模擬接收

使用單片機(jī)自身的串口功能接收數(shù)據(jù)時(shí),可以采用查詢方式或中斷方式接收數(shù)據(jù)。使用查詢方式接收數(shù)據(jù)時(shí),單片機(jī)要不停地查詢控制和狀態(tài)寄存器的相應(yīng)標(biāo)志位,以判斷是否需要接收數(shù)據(jù)。一旦有數(shù)據(jù)需要接收,單片機(jī)即運(yùn)行接收程序接收數(shù)據(jù)。當(dāng)沒有數(shù)據(jù)需要接收時(shí),單片機(jī)需要處于不定時(shí)查詢狀態(tài),否則就不能及時(shí)獲知接收數(shù)據(jù)信息,造成數(shù)據(jù)丟失。即使查詢方式因單片機(jī)一直忙于查詢而不能處理其他事務(wù),降低了單片機(jī)的利用率。使用中斷方式接收數(shù)據(jù)時(shí),當(dāng)串口沒有接收到數(shù)據(jù)時(shí),單片機(jī)可以處理其他事情;當(dāng)串口接收到數(shù)據(jù)時(shí)單片機(jī)立即產(chǎn)生中斷,通過中斷程序接收數(shù)據(jù),這樣單片機(jī)接收數(shù)據(jù)比較實(shí)時(shí),利用率也高。因此在實(shí)際應(yīng)用中,比較多的是利用中斷方式接收數(shù)據(jù)。

用I/O口模擬串口接收數(shù)據(jù)時(shí),為了實(shí)現(xiàn)中斷接收數(shù)據(jù),需要選擇具有外部中斷功能的I/O口作為RxD引腳。之所以使用具有外部中斷功能的I/O口,是因?yàn)榇谕ㄐ艛?shù)據(jù)幀的起始位為低電平,利用低電平產(chǎn)生外部中斷功能,以實(shí)現(xiàn)中斷接收數(shù)據(jù)的目的。

未發(fā)生數(shù)據(jù)通信時(shí),RxD引腳處于高電平狀態(tài)。當(dāng)外部有數(shù)據(jù)發(fā)送過來時(shí),RxD引腳會接收到數(shù)據(jù)幀格式的二進(jìn)制數(shù)據(jù)序列。當(dāng)接收到1個(gè)字節(jié)的數(shù)據(jù)時(shí),RxD引腳接收到1個(gè)數(shù)據(jù)幀;當(dāng)接收到多個(gè)字節(jié)的數(shù)據(jù)時(shí),RxD引腳接收到多個(gè)數(shù)據(jù)幀。接收到數(shù)據(jù)幀時(shí),RxD引腳首先接收到起始位,由于起始位是低電平,只要事先將外部中斷定義成低電平中斷,此刻即產(chǎn)生外部中斷,單片機(jī)轉(zhuǎn)入外部中斷處理程序,由外部中斷程序?qū)Πl(fā)送來的二進(jìn)制數(shù)據(jù)序列按照數(shù)據(jù)幀的格式進(jìn)行一位一位地接收,先接收到是數(shù)據(jù)的低位,后接收到的是數(shù)據(jù)的高位。接收到1個(gè)數(shù)據(jù)幀的停止位后,如果緊接著接收到低電平信號,則認(rèn)為有新的數(shù)據(jù)幀需要接收,此低電平信號是新數(shù)據(jù)幀的起始位;如果緊接著接收到高電平信號,則判斷為沒有新的數(shù)據(jù)幀需要接收,接收數(shù)據(jù)結(jié)束。

3 程序?qū)崿F(xiàn)

根據(jù)上面的描述,編寫模擬串口通信數(shù)據(jù)接收程序就是對外部中斷程序的編寫。因?yàn)椴ㄌ芈适? 600 bps,所以每位數(shù)據(jù)占用的時(shí)間為104 μs。在實(shí)現(xiàn)每位數(shù)據(jù)接收時(shí),接收到一位數(shù)據(jù)后,需要延時(shí)104 μs后再接收另一位數(shù)據(jù)。在單片機(jī)編程時(shí),可以用語句循環(huán)實(shí)現(xiàn)延時(shí),也可以用定時(shí)器實(shí)現(xiàn)延時(shí)。定時(shí)器定時(shí)比較精確,因此本文采用定時(shí)器延時(shí)。

3.1定時(shí)器定時(shí)子程序

這里以ATmega64A單片機(jī)為例,單片機(jī)外接晶振為8 MHz。ATmega64A單片機(jī)有多個(gè)定時(shí)器,這里選用定時(shí)器TIMER0進(jìn)行定時(shí),以實(shí)現(xiàn)延時(shí)之目的。TIMER0為8位定時(shí)器/計(jì)數(shù)器,定時(shí)方法是給TCNT0寄存器賦初值,由初值開始計(jì)數(shù),TIMER0每計(jì)數(shù)一個(gè)時(shí)鐘脈沖,TCNT0加1。當(dāng)TCNT0的值由0xFF變?yōu)?x00時(shí),TIMER0的溢出標(biāo)志位置1,通過該標(biāo)志位的值判斷定時(shí)是否已到。TIMER0的時(shí)鐘源可以由單片機(jī)的晶振分頻后提供,這里選擇8分頻,即TIMER0的時(shí)鐘頻率為1 MHz,每個(gè)時(shí)鐘脈沖的時(shí)間為1 μs,要實(shí)現(xiàn)104 μs定時(shí),給TCNT0賦初值0x98即可。為了使定時(shí)器定時(shí)子程序可以實(shí)現(xiàn)不同的定時(shí)時(shí)間,將該子程序設(shè)計(jì)成帶參數(shù),通過參數(shù)值改變定時(shí)時(shí)間,定時(shí)子程序如下:

void Timer0_Open(unsigned char value){

//通過參數(shù)value設(shè)定定時(shí)時(shí)間

TCCR0=0x00;//取消時(shí)鐘源,TIMER0停止工作

TIFR=0x01;//TIMER0溢出標(biāo)志清零

TCNT0=value;

//定時(shí)器初值,定時(shí)時(shí)間為(0xFF-value+1)μs

TCCR0=0x02;

//設(shè)置時(shí)鐘8分頻,TIMER0獲得時(shí)鐘源后即開始工作

}

3.2接收程序流程圖

為了實(shí)現(xiàn)中斷接收數(shù)據(jù),接收數(shù)據(jù)前RxD引腳開啟外部中斷功能,一旦有數(shù)據(jù)起始位到即產(chǎn)生中斷,此時(shí)立即將該引腳的外部中斷功能關(guān)閉,同時(shí)將該引腳設(shè)置為輸入,以開始接收數(shù)據(jù)流,接收程序按照數(shù)據(jù)幀的格式一位一位地接收數(shù)據(jù),數(shù)據(jù)接收結(jié)束后再將此引腳的外部中斷功能開啟,以等待下一次接收數(shù)據(jù)。接收多個(gè)字節(jié)數(shù)據(jù)的接收程序流程圖如圖2所示。

4 程序優(yōu)化

圖2 接收程序流程圖

按照圖2接收程序流程圖用C語言編寫程序后,經(jīng)測試,發(fā)現(xiàn)可以連續(xù)接收到3個(gè)字節(jié)的數(shù)據(jù),前2個(gè)字節(jié)正確,但第3個(gè)字節(jié)數(shù)據(jù)是錯(cuò)誤的。通過對測試結(jié)果和程序進(jìn)行分析,發(fā)現(xiàn)產(chǎn)生錯(cuò)誤的原因是程序在接收相鄰位數(shù)據(jù)的間隔時(shí)間超過了104 μs,每接收1位會產(chǎn)生△t誤差,連續(xù)接收N 位后,產(chǎn)生的累積誤差為N△t,當(dāng)N△t達(dá)到104 μs時(shí)就會出錯(cuò)。每接收1位數(shù)據(jù)產(chǎn)生時(shí)間誤差的主要原因有:①定時(shí)器本身有誤差;②每次調(diào)用延時(shí)子程序、子程序返回、執(zhí)行子程序語句需要時(shí)間,設(shè)計(jì)延時(shí)子程序時(shí)未將這些時(shí)間予以減除;③接收數(shù)據(jù)之后,調(diào)用延時(shí)子程序之前執(zhí)行程序語句產(chǎn)生的時(shí)間。

為了降低△t,需要計(jì)算調(diào)用子程序及返回、執(zhí)行有關(guān)語句所需的時(shí)間,以便對延時(shí)子程序的延時(shí)時(shí)間作相應(yīng)調(diào)整。由于程序是用C語言編寫的,計(jì)算這些時(shí)間比匯編語言復(fù)雜一些。在精確度要求不是很高的情況下,可以用簡便的方法進(jìn)行估算,估算方法:接收第3個(gè)字節(jié)出錯(cuò),說明有可能在接收20位數(shù)據(jù)后產(chǎn)生的累積時(shí)間誤差達(dá)到104 μs,也有可能是在接收第30個(gè)字節(jié)時(shí)產(chǎn)生的累積誤差達(dá)到104 μs;假如接收20位數(shù)據(jù)后產(chǎn)生的累積誤差達(dá)到104 μs,則說明接收每位產(chǎn)生時(shí)間誤差為5.2 μs;假如接收30位數(shù)據(jù)后產(chǎn)生的累積誤差達(dá)到104 μs,則說明接收每位產(chǎn)生的時(shí)間誤差為3.47 μs;分別選取3、4、5、6 μs對延時(shí)子程序的延時(shí)時(shí)間作相應(yīng)調(diào)整,進(jìn)行調(diào)試測試,選取最佳的方案即可。

根據(jù)上述思路和方法對延時(shí)進(jìn)行調(diào)整,通過調(diào)試測試,選取結(jié)果較好的方案對延時(shí)時(shí)間進(jìn)行調(diào)整,以優(yōu)化程序,優(yōu)化后的接收程序語句如下:

EIMSK&=0xFE; //關(guān)閉外部中斷使能

DDRD&=0xFE; //PD0引腳設(shè)為輸入

while(ReceiveContinue){

//程序開始時(shí)已賦值為1,ReceiveContinue等于1,繼續(xù)接收

Timer0_Ooen(0x99) ;

//起始位延時(shí)103 μs

for( unsigned char i=0;i<8;i++){

//接收一個(gè)字節(jié)的 8個(gè)位

while( ! ( TIFR& 0x01) );

//前一位延時(shí)結(jié)束

ReceiveRegister>>= 1;

if(PIND&0x01)

//讀取PD0即RxD引腳的值

ReceiveRegiste|= 0x80;

//如果PD0為高電平,說明接收到二進(jìn)制1,否則為0

Timer0_Ooen(0x9C);

//延時(shí)100 μs

}

while( ! ( TIFR& 0x01) );

ReceiveBuffer[ReceiveCount]=ReceiveRegister;

//將接收到數(shù)據(jù)存放在接收緩存器

ReceiveCount++;

//接收到1個(gè)字節(jié)后該值加1

ReceiveRegister=0;

//賦值為0,以便接收下一個(gè)字節(jié)數(shù)據(jù)

StartTimer0(0x9B) ;

//延時(shí)101 μs

while( ! ( TIFR& 0x01) );

if(PIND&0x01)

//PD0為1,無起始位,接收結(jié)束

ReceiveContinue=0;

}

EIMSK |= 0x01;

//開外部中斷 0

需要說明的是,上述程序的前提是ATmega64A單片機(jī)采用INT0引腳作為模擬串口通信的接收端口。

5 測試結(jié)果

分別對優(yōu)化前和優(yōu)化后的程序進(jìn)行了測試,優(yōu)化前的程序只能連續(xù)接收3個(gè)字節(jié)的數(shù)據(jù),接收到的前2個(gè)字節(jié)數(shù)據(jù)是正確的,第3個(gè)字節(jié)數(shù)據(jù)是錯(cuò)誤的。

優(yōu)化后的程序可以連續(xù)接收48個(gè)字節(jié)的數(shù)據(jù),接收到的數(shù)據(jù)是正確的,超過48個(gè)字節(jié)就容易出錯(cuò)。要使程序能連續(xù)接收更多字節(jié)的數(shù)據(jù),還需要進(jìn)一步優(yōu)化。

結(jié) 語

本文主要介紹了用單片機(jī)I/O口模擬串口通信接收數(shù)據(jù)的過程方法、數(shù)據(jù)接收程序的實(shí)現(xiàn)及優(yōu)化方法。通過優(yōu)化,數(shù)據(jù)接收程序連續(xù)接收數(shù)據(jù)的能力得到了大大的增強(qiáng),可以實(shí)現(xiàn)連續(xù)接收48個(gè)字節(jié)的數(shù)據(jù),能滿足較多場合的應(yīng)用要求。

在優(yōu)化過程中,提出了簡便地估算程序運(yùn)行產(chǎn)生時(shí)間誤差的方法,通過估算得到的誤差值,對程序的延時(shí)時(shí)間進(jìn)行調(diào)整調(diào)試,實(shí)現(xiàn)程序的優(yōu)化,這是本文的新穎之處。本文的不足之處:一是僅通過調(diào)整延時(shí)時(shí)間進(jìn)行程序優(yōu)化,未進(jìn)行其他優(yōu)化;二是優(yōu)化后的數(shù)據(jù)接收程序,連續(xù)接收數(shù)據(jù)能力有限,有待進(jìn)一步優(yōu)化提高。

[1] Atmel .Atmel-8160E-ATmega64A_Datasheet_Complete-09/2015[EB/OL].[2016-05].http://www.atmel.com/.

郟正學(xué)(工程師),主要從事嵌入式應(yīng)用系統(tǒng)設(shè)計(jì)開發(fā)。

Realization and Optimization of Serial Port Data Receiving Program Based on MCU

Jia Zhengxue,Li Wei

(Zhejiang Provincial Key Laboratory of Space Structures,Hangzhou 310058,China)

In the design,we often encounter the case that the quantity of the serial ports of MCU is not enough.In order to meet the application requirements,the serial communication can be simulated by using the I/O ports.In the paper,the basic knowledge of the serial communication is introduced.The process of simulating the serial ports receiving data is analyzed.The realization method of simulating the serial port receiving data is introduced.Taking ATmega64A MCU as the example,the realization and optimization of the receiving data program are introduced in detail.

ATmega64A MCU;serial port communication;receiving program

TP311

A

(責(zé)任編輯:楊迪娜2016-05-03)

猜你喜歡
接收數(shù)據(jù)子程序字節(jié)
No.8 字節(jié)跳動將推出獨(dú)立出口電商APP
基于稀疏對稱陣列的混合信源定位
No.10 “字節(jié)跳動手機(jī)”要來了?
低復(fù)雜度多輸入多輸出雷達(dá)目標(biāo)角度估計(jì)方法
基于LoRa的低能耗物聯(lián)網(wǎng)技術(shù)研究
簡談MC7字節(jié)碼
淺談子程序在數(shù)控車編程中的應(yīng)用
子程序在數(shù)控車加工槽中的應(yīng)用探索
西門子840D系統(tǒng)JOG模式下PLC調(diào)用并執(zhí)行NC程序
基于ESPRIT的ULA波達(dá)方向估計(jì)改進(jìn)算法