关于stm2cumx生成的串口通信USART的使用(2)

上面一篇文章讲到在stm32cumx开启串口中断后,系统每接收一个字符就会进入中断一次

而使用HAL_UART_Receive_IT函数,可以设置我们进入回调函数的条件,这样我们就可以在回调函数里进行一大段字符的处理了

关于stm2cumx生成的串口通信USART的使用(2)

但有一个问题,HAL_UART_Receive_IT设置的接收字符数量是固定的,若我们每次接收的字符串长度是不固定时,我们单片机内就无法及时进入处理传来数据的函数,除非每次接收的字符长度是固定的,这个方法还是有点不好用

 

这里就用到第二个箭头的函数HAL_UARTEx_ReceiveToIdle_IT,这个函数用到了串口寄存器的IDLE标志位

关于stm2cumx生成的串口通信USART的使用(2)

关于stm2cumx生成的串口通信USART的使用(2)

关于stm2cumx生成的串口通信USART的使用(2)

 先说说RXNE,RXNE标志位是每接收到1bit数据,就会触发一次串口中断

而IDLE是空闲中断的意思,即接收完1帧数据才会触发一个中断

比如给上位机给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。

 

关于stm2cumx生成的串口通信USART的使用(2)

 这个函数里面箭头处设置的标志位,与上一篇里面是不一样的

 

然后在串口接收函数里UART_Receive_IT,有个判断的地方

关于stm2cumx生成的串口通信USART的使用(2)

 因为我还没有重写这个回调函数,所以第一个是不编译的

可以看出,这个回调函数,有个参数是串口对象的接收长度,通过这个参数,我们就可以在回调函数中处理指定长度的字符串,而不会越位

 

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
    if(huart->Instance==USART1)
    {
        serial.FramLength=Size;
        HAL_UART_Transmit(&huart1,serial.Rx_Data_Buf,serial.FramLength,serial.FramLength);    
        HAL_UARTEx_ReceiveToIdle_IT(&huart1,serial.Rx_Data_Buf,RX_BUF_MAX_LEN);
    }
}

同时要注意,这个也是需要在回调函数中重新开启(使能?)该中断的

 

关于stm2cumx生成的串口通信USART的使用(2)

 消除标志位的方法,但stm32cumx已经帮我们做好了,所以不用自己来弄了

 

上一篇:[日常] Go语言圣经-竞争条件习题


下一篇:STM32重定向