串列埠接收中斷和連續傳送的矛盾!

2021-07-05 17:31:19 字數 1127 閱讀 7692

出現的問題:為什麼我配置的串列埠中斷,只能接收到資料頭和尾?pc傳送123,我接收到13;pc傳送12345,我接收到15。 波特率也是匹配的呀,怎麼就漏接了中間部分呢?

暫時想到的原因:因為串列埠接收中斷服務程式也是需要時間來執行的,所以試想一下: mcu的串列埠外設在接收到二個資料的時候,mcu的主核正在執行第乙個資料觸發的中斷服務程式,所以第二個資料觸發的中斷函式並未執行!如果波特率很高,那麼中斷服務程式就相對時間很長,這樣,mcu接收到第三個資料,mcu仍在第乙個中斷函式裡執行,但串列埠接收暫存器被覆蓋了!直到mcu接收到最後乙個資料,串列埠接收暫存器穩定為最後乙個資料(因為沒有下乙個資料來覆蓋它),這是等待第乙個中斷服務函式結束,執行最後乙個中斷服務程式。  這就是為什麼只接收到資料頭和資料尾的假象了,實際是都接收到了,但中斷服務程式並沒有全部執行!!

解決辦法: 1、降低波特率,留下充裕的時間給中斷服務程式來執行(治標)

2、簡化串列埠接收中斷服務程式,盡量以最短的時間結束第乙個中斷服務程式,be ready immedately for the next isr。 當然,最後乙個資料觸發的中斷服務函式可以很長,因為無需等待下乙個資料了。

比如這樣:

#pragma vector=usart0rx_vector//to display what the mcu just received

__interrupt void usart0_rx()

i=0;

txbuf0=0xf5;

while((utctl0 & 0x01)==0);

txbuf0=0x09;

while((utctl0 & 0x01)==0);

txbuf0=0x00;

while((utctl0 & 0x01)==0);

txbuf0=0x00;

while((utctl0 & 0x01)==0);

txbuf0=0x00;

while((utctl0 & 0x01)==0);

txbuf0=0x00;

while((utctl0 & 0x01)==0);

txbuf0=0x09;

while((utctl0 & 0x01)==0);

txbuf0=0xf5;

while((utctl0 & 0x01)==0);}}

串列埠的中斷和接收

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

串列埠傳送和接收訊息

stm32f4開發板搭載乙個usb串列埠,2個rs232串列埠,部落格內容介紹usb串列埠和電腦通訊 步驟 1 串列埠和io口使能 rcc apb2periphclockcmd rcc apb2periph usart1,enable rcc ahb1periphclockcmd rcc ahb1p...

C51 串列埠接收和傳送,查詢與中斷方法

假設要傳送一組資料 send 10 一般採用查詢傳送 迴圈傳送 方式 unsigned char send 10 傳送量 unsigned char i 迴圈量 for i 0 i 10 i 採用中斷傳送方式 unsigned char send 10 傳送量 unsigned char num 傳...