串口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或者空闲中断,我都不太了解就没用。我用标准库的时候就是这么写的检查非空,保存数据,然后把非空标志清除。先用着等遇到其他问题的时候再解决。