STM32L4串口不定长接受数据

之前L4串口收到的数据要不有帧头、帧尾或者协议带帧长,纯不定长的想和之前F103一样用IDLE的方式,发现不行

都是用IDLE的方式,和之前用的F103还是有区别的,寄存器不一样,改了寄存器还是收不到正确数据,L4系列所提供的固件库中没有对该标志位的检测,需要我们自行添加

在stm32l4xx_hal_uart.c文件中添加以下代码:

STM32L4串口不定长接受数据_第1张图片

参考文章

思路也是借助IDLE的方式,但没有用RXNE,直接库函数HAL_UART_Receive_IT,所以用的时候要开一下串口中断

 

使用参考文章指针的方式,数据除了第一次,后面会错1位,没找到原因,就用数组的方式,程序如下:

/*要添加的函数*/
if(((isrflags & USART_ISR_IDLE) != 0U) && ((cr1its & USART_CR1_IDLEIE) != 0U))
 {
        HAL_UART_IdleCpltCallback(huart);
        return;
 }

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

struct master_data
{  
    uint8_t data[MASTER_RX_LEN];
	uint8_t length;
	uint8_t flag;
	uint8_t temp[1];
};
struct master_data  PIE_rx;

void USR_UartInit(void)
{
    PIE_rx.length = 0;      // 长度初始为0
    HAL_UART_Receive_IT(&huart1, PIE_rx.temp, 1);//开启串口1的接收中断
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);       // 使能 IDLE中断
    __HAL_UART_CLEAR_IDLEFLAG(&huart1);  //清除IDLE标志位
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    PIE_rx.data[PIE_rx.length] = USART1->RDR;   //另一种使用非指针方式保存数据
    PIE_rx.length++;   // 接收到上一个数据,长度要+1
    if(huart->Instance == USART1)
    {
        HAL_UART_Receive_IT(&huart1, PIE_rx.temp, 1);    // 继续使能RX中断,准备接收。
    }
		
}

void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
{
    __HAL_UART_CLEAR_IDLEFLAG(huart);//清除IDLE标志位
    PIE_rx.length = 0;         // 长度设置为0
	 //data handle
	
    HAL_UART_Receive_IT(&huart1, PIE_rx.temp, 1);
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);       // 使能 IDLE中断
}

 

 

你可能感兴趣的:(STM32,C)