使用stm2cumx生成的串行通信USART)
在前一篇文章中提到,在stm32cumx中打开串口中断后,系统每次接收到一个字符都会进入中断一次。
使用HAL_UART_Receive_IT函数,可以为我们设置进入回调函数的条件,这样就可以处理回调函数中的一大段字符。
但是,有一个问题。HAL_UART_Receive_IT设置的接收字符数是固定的。如果我们每次收到的字符串长度不是固定的,我们就无法在我们的单片机中进入及时处理传入数据的功能。除非每次接收的字符长度都是固定的,否则这个方法还是有点难用。
这里,我们使用第二个箭头的函数HAL_UARTEx_ReceiveToIdle_IT,它使用串行端口寄存器的Idle标志位。
先说说RXNE。RXNE标志位表示每次接收到1位数据时,都会触发一个串行端口中断。
空闲意味着空闲中断,也就是说,只有在接收到一帧数据后才会触发中断。
比如主机一次向MCU发送8个字节,就会产生8个RXNE中断和1个IDLE中断。
该函数中箭头处设置的标志位与上一篇文章中的不同。
然后在串口接收功能UART_Receive_IT中,有一个地方可以判断。
因为我没有重写这个回调函数,所以第一个没有编译。
可以看到,这个回调函数有一个参数,就是串口对象的接收长度。通过这个参数,我们可以在回调函数中处理指定长度的字符串而不会越位。
void HAL _ UARTEx _ RxEventCallback(UART _ HandleTypeDef * huart,uint16_t Size)
{
if(huart-Instance==USART1)
{
连环杀手。框架长度=尺寸;
HAL_UART_Transmit(huart1,串行。Rx_Data_Buf,串行。帧长度,串行。FramLength);
HAL _ UARTEx _ ReceiveToIdle _ IT(huar t1,串行。Rx_Data_Buf,RX _ Buf _ MAX _ LEN);
}
}
同时,请注意,这也需要在回调函数中重新打开(启用)。
消除标志位的方法,但是stm32cumx已经为我们做了,所以我们不需要自己做。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/124347.html