stm32串列埠接收完整的資料報

2022-08-30 02:42:12 字數 1824 閱讀 5335

參考了文章:《stm32串列埠中斷接收方式詳細比較》

借鑑了第四種中斷方式

串列埠的配置這裡不做說明,僅對stm32接收中斷中的資料進行解析。

資料幀協議:

幀頭1幀頭2

資料長度

有效資料

crc_1

crc_2

b5 5b

0300

570b

幀頭1+幀頭2+資料長度(包含有效資料、crc_1、crc_2)+有效資料 + crc_1 + crc_2(校驗為幀頭到有效資料)

協議採用小端模式,低位元組在前,高位元組在後。

crc16校驗未深入學習,**也不是自己寫的,我僅是拿來用,所以未給出,也可以選擇其他校驗方法。

crc16函式宣告:uint16_t crc16(uint8_t * buf, uint16_t len); 返回值為uint16_t校驗值

**如下:

/*

***************************

函式名稱: usart2_irqhandler

功 能:串列埠2接收中斷

參 數:無

返 回 值:無

作 者:yao

***************************

*/uint8_t uart2_buffer[

256]; //

接收緩衝區

uint8_t uart2_rx = 0; //

uart2_buffer下標

uint8_t uart2_head1; //

幀頭1uint8_t uart2_head2; //

幀頭2uint8_t uart2_len; //

資料長度(第三位元組以後包含crc)

uint16_t uart2_temp; //

crc16()返回值

uint8_t uart2_sta; //

資料幀正確標誌

uint8_t uart2_tx2; //

傳送計數

uint16_t crc16(uint8_t * buf, uint16_t len); //

crc16函式宣告,定義未給出。返回uint16_t校驗值

void

usart2_irqhandler()

if(uart2_buffer[uart2_rx-1] == 0xb5) //

判斷幀頭1

uart2_head1 = uart2_rx-1

;

else

if((uart2_rx-1 == uart2_head1+1)&&(uart2_buffer[uart2_rx-1] == 0x5b)) //

判斷幀頭1資料後是否為幀頭2

uart2_head2 = uart2_rx-1;

else

if(uart2_rx-1 == uart2_head2+1) //

得到資料長度

uart2_len = uart2_buffer [uart2_rx-1

];

else

if(uart2_rx-1 == uart2_head1 + uart2_len+2) //

確保接收一幀資料

}if(usart_getflagstatus(usart2,usart_flag_ore) ==set)

if(uart2_sta) //

檢測到標誌

}

STM32串列埠接收策略

如果我們需要接收乙個序列協議,怎麼做呢?先放到緩衝區然後再檢查標誌位是一種思路。道理簡單,關鍵要看怎麼設計。這裡介紹的方法是巧妙利用定時器,與串列埠中斷進行耦合,得到一種魯棒的接收方法。具體 開啟定時器與串列埠中斷 首先用示波器檢視完整幀所需要的時間,並且設定為timmax。定時器以適當的中斷頻率開...

STM32串列埠接收中斷BUG

除錯串列埠時,發現串列埠會出現頻繁跳中斷,導致無法執行主迴圈的問題!除錯發現是串列埠中斷硬體bug 1.usart itconfig usart 1,usart it rxne,enable 使能了接收中斷,那麼ore中斷也同時被開啟了。2.ore中斷只能使用usart getflagstatus ...

STM32串列埠通訊中斷接收

串列埠的時序和工作原理就不寫了,主要寫如何應用 串列埠的設定除了gpio外,需要設定的引數有波特率 資料位 停止位,校驗方式 gpio輸出配置af pp復用推挽輸出 gpio出入配置in flaoting浮空輸入 usart的配置為115200的波特率,8位資料長度,1位停止位,無校驗,無硬體流控制...