上面一篇文章讲到在stm32cumx开启串口中断后,系统每接收一个字符就会进入中断一次
而使用HAL_UART_Receive_IT函数,可以设置我们进入回调函数的条件,这样我们就可以在回调函数里进行一大段字符的处理了
但有一个问题,HAL_UART_Receive_IT设置的接收字符数量是固定的,若我们每次接收的字符串长度是不固定时,我们单片机内就无法及时进入处理传来数据的函数,除非每次接收的字符长度是固定的,这个方法还是有点不好用
这里就用到第二个箭头的函数HAL_UARTEx_ReceiveToIdle_IT,这个函数用到了串口寄存器的IDLE标志位
先说说RXNE,RXNE标志位是每接收到1bit数据,就会触发一次串口中断
而IDLE是空闲中断的意思,即接收完1帧数据才会触发一个中断
比如给上位机给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。
这个函数里面箭头处设置的标志位,与上一篇里面是不一样的
然后在串口接收函数里UART_Receive_IT,有个判断的地方
因为我还没有重写这个回调函数,所以第一个是不编译的
可以看出,这个回调函数,有个参数是串口对象的接收长度,通过这个参数,我们就可以在回调函数中处理指定长度的字符串,而不会越位
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); } }
同时要注意,这个也是需要在回调函数中重新开启(使能?)该中断的
消除标志位的方法,但stm32cumx已经帮我们做好了,所以不用自己来弄了