串列埠中斷接收的常見處理方法(檢測中斷是否設定正確)

2021-09-26 18:24:05 字數 1749 閱讀 8009

本例程通過pc機的串列埠除錯助手將資料傳送至stm32,接收資料後將所接收的資料又傳送至pc機,具體下面詳談。

void

usart1_irqhandler

(u8 getdata)

}

這是最基本的,將資料接收完成後又傳送出去,接收和傳送在中斷函式裡執行,main函式裡無其他要處理的。

優點:簡單,適合很少量資料傳輸。

缺點:無快取區,並且對資料的正確性沒有判斷,資料量稍大可能導致資料丟失 。

void

usart2_irqhandler()

if((uart2_buffer[0]

==0x5a)&&

(uart2_buffer[uart2_rx_num-1]

==0xa5))

//判斷最後接收的資料是否為設定值,確定資料正確性

uart2_sta=1;

if(usart_getflagstatus

(usart2

,usart_flag_ore)==

set)

//溢位}if

( uart2_sta )

這是加了資料頭和資料尾的接收方式,資料頭和尾的個數可增加,此處只用於除錯之用。中斷函式用於接收資料以及判斷資料的頭尾,第二個函式在main函式裡按照查詢方式執行。

優點:較簡單,採用快取區接收,對提高資料的正確行有一定的改善 。

缺點:要是第一次資料接收錯誤,回不到初始化狀態,必須復位操作 。

vvoid usart2_irqhandler()

if(usart_getflagstatus

(usart2

,usart_flag_ore)==

set)

//溢位 }if

( uart2_tx != uart2_rx )

採用fifo方式接收資料,由0x3f可知此處最大接收量為64個,可變,中斷函式只負責收,另一函式在main函式裡執行,fifo方式傳送。

優點:傳送和接收都很自由,中斷占用時間少,有利於mcu處理其它。

缺點:對資料的正確性沒有判斷,一概全部接收。

void

usart2_irqhandler()

if(uart2_buffer[uart2_rx-1]

==0x5a

)//頭

uart2_tx = uart2_rx-1;

if((uart2_buffer[uart2_tx]

==0x5a)&&

(uart2_buffer[uart2_rx-1]

==0xa5))

//檢測到頭的情況下檢測到尾 if(

usart_getflagstatus

(usart2

,usart_flag_ore)==

set)

//溢位 }if

( uart2_sta )

資料採用資料報的形式接收,接收後存放於快取區,通過判斷資料頭和資料尾(可變)來判斷資料的「包」及有效性,中斷函式用於接收資料和判斷頭尾以及資料報長度,另一函式在main函式裡執行,負責傳送該段資料。

優點:適合打包傳輸,穩定性和可靠性很***,可隨意傳送,自動挑選有效資料。

缺點:快取區資料長度要根據「包裹」長度設定, 要是多次接收後無頭無尾,到有頭有尾的那一段資料恰好跨越快取區最前和最後位置時,可能導致本次資料丟失,不過這種情況幾乎沒有可能。

串列埠中斷接收資料方式

微控制器中斷能夠及時響應外部觸發事件,在中斷函式中處理外部事件,處理完成之後退回到中斷點。中斷服務函式應該能最快速的解決觸發事件,快速退出中斷,不宜在中斷中處理複雜的執行演算法。所以中斷函式的編寫盡量簡單明瞭快速,下面以串列埠接收中斷為例來說明中斷處理函式的寫法。1.設定乙個全域性標誌,觸發中斷之後...

STM32串列埠中斷方式接收

經過除錯在stm32f101cbt6中實現通訊。注意還要配乙個ttl轉usb介面,才能進行通訊。實現字串回發 include stm32f10x it.h include stm32f10x conf.h void rcc configuration void 時鐘配置 void usart con...

串列埠的中斷和接收

前面介紹了串列埠的查詢方式,沒看過的童鞋可以檢視我之前的部落格。今天我們來介紹怎麼利用終端接收串列埠的資料。關於串列埠中斷沒有繁雜的初始化。只需新增幾句話就能實現串列埠中斷了。直接上 吧。uartinit 只需要這三句化,就開啟了中斷,和接收允許了。接下來我們寫寫串列埠的中斷函式。pragma ve...