天天看點

HAL庫實踐記錄之序列槽接收不定長資料

序列槽1接收不定長資料

實驗闆是原子mini闆

一開始使用官方庫,隻能接受定長資料。把資料長度設定為1時,發送多位元組資料時又會丢數。是以自己重寫序列槽中斷處理函數。

首先搞一下Cube配置用法:Mode選異步,下邊設定好參數。

HAL庫實踐記錄之序列槽接收不定長資料

設定序列槽中斷

HAL庫實踐記錄之序列槽接收不定長資料

然後就配置完了。生成代碼

第一步在主函數初始化階段添加如下代碼(HAL F4 序列槽中斷不響應可能就是這裡沒開)

__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);//開序列槽1中斷

第二步,删除官方庫函數,添加自己的中斷函數(如果再生成代碼的話要再删除一次官方函數的調用)

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	user_Uart1Handler();
	//stm32Mxcube重新配置生成代碼後需要注釋掉函數void USART1_IRQHandler(void)中的HAL_UART_IRQHandler(&huart1);就是下面這句
  /* USER CODE END USART1_IRQn 0 */
  //HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
		
  /* USER CODE END USART1_IRQn 1 */
}
           

第三步,重寫函數,如下

void user_Uart1Handler(void)
{
	//接收寄存器非空
	if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)!=RESET))  
	{
		USART1_RX_BUF[USART1_RX_BUF_Index]=(uint8_t)(huart1.Instance->DR & (uint8_t)0x00FF);
		USART1_RX_BUF_Index++;

		__HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);
	}
	else
	{
		
	}		
		  
	
}
           

這樣就能就收了。

我也是借鑒了其他文章,一般都是用DMA或者空閑中斷,我都不太了解就沒用。我用标準庫的時候就是這麼寫的檢查非空,儲存資料,然後把非空标志清除。先用着等遇到其他問題的時候再解決。