序列槽1接收不定長資料
實驗闆是原子mini闆
一開始使用官方庫,隻能接受定長資料。把資料長度設定為1時,發送多位元組資料時又會丢數。是以自己重寫序列槽中斷處理函數。
首先搞一下Cube配置用法:Mode選異步,下邊設定好參數。
設定序列槽中斷
然後就配置完了。生成代碼
第一步在主函數初始化階段添加如下代碼(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或者空閑中斷,我都不太了解就沒用。我用标準庫的時候就是這麼寫的檢查非空,儲存資料,然後把非空标志清除。先用着等遇到其他問題的時候再解決。