解決方法:開啟中斷之前,先清除標志位【1】。
串口清除標志位:
__HAL_UART_CLEAR_PEFLAG(&huart1);
HAL_UART_Receive_IT(&huart1,&RxUart, 1);
定時器清除標志位:
__HAL_TIM_CLEAR_FLAG(&htim3,TIM_FLAG_UPDATE);
HAL_TIM_Base_Start_IT(&htim3);
1、問題描述
編程任務:STM32串口接收上位機不定長數組
思路:使用串口中斷接收數據,每接收完一個字節就把計時器清零;計時器每65ms進一次中斷,如果計時器進中斷說明一幀數據結束了【2】。
1.1、MAIN函數
uint8_t RxData[60]={0},RxUart=0;
uint8_t FLAG_RX_DONE=0;//Serial port receive complete flag, no new data received within 65.5ms(TIM3), this flag will be set
uint8_t RX_DATA_idx=0,RX_DATA_LEN=0;int main(void)
{uint8_t projectName[]="a1223_protocol";uint8_t i=0;printf("****** %s ******\r\n\r\n",projectName);HAL_UART_Receive_IT(&huart1,&RxUart, 1);//開啟接受中斷while (1){if(FLAG_RX_DONE!=0)//如果接收完成{FLAG_RX_DONE=0;printf("RX_DATA_LEN=%d\r\n",RX_DATA_LEN);RX_DATA_LEN=0;printf("RX=");for(i=0;i<RX_DATA_LEN;i++){printf("%02X ",RxData[i]);}printf("\r\n");memset(RxData,0,sizeof(RxData));//清除接收寄存器}HAL_Delay(1000);HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
1.2、串口接收中斷處理程序
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance==USART1){__HAL_TIM_SET_COUNTER(&htim3,0);//定時器清零if(RX_DATA_idx==0)//If it is the first character, the timer is started{HAL_TIM_Base_Start_IT(&htim3);//開啟定時器}RxData[RX_DATA_idx++]=RxUart;HAL_UART_Receive_IT(&huart1,&RxUart,1);//開啟接收中斷,準備接收下一個字節}
}
1.3、計時器中斷處理程序
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3){//If no new data is received for 65.5ms, the reception is overRX_DATA_LEN=RX_DATA_idx;FLAG_RX_DONE=1;RX_DATA_idx=0;//Start writing data againHAL_TIM_Base_Stop_IT(&htim3);//接收完成,關閉定時器中斷}
}
1.4、實驗結果?
可以看到第一次接收的數據中缺少“01”。
2、解決方法
在開啟中斷之前,先清除標志位
2.1、串口的處理方法
HAL_UART_Receive_IT(&huart1,&RxUart, 1);
修改成
__HAL_UART_CLEAR_PEFLAG(&huart1);
HAL_UART_Receive_IT(&huart1,&RxUart, 1);
2.2、定時器的處理方法
?HAL_TIM_Base_Start_IT(&htim3);
修改成
__HAL_TIM_CLEAR_FLAG(&htim3,TIM_FLAG_UPDATE);
HAL_TIM_Base_Start_IT(&htim3);
?2.3、實驗結果?
?
3、參考資料
【1】STM32串口第一字節消失或者誤碼的原因和解決方案_stm32單片機串口通訊 接收的字節錯誤-CSDN博客https://blog.csdn.net/Backspace110/article/details/52737441
??【2】HAL庫教程9:串口接收不定長數據_hal庫接收串口不定長數據-CSDN博客https://blog.csdn.net/geek_monkey/article/details/89326199