我试图让STM32F103通过USART接收4个字节并将它们存储在一个值中。
到目前为止,如果我重置微控制器,则第一次发送正常接收到的4个字节,并且微控制器将它们存储在USART_RX_BUF中,但是,如果我再发送4个字节,则USART_RX_BUF保持不变,此外, USART_RX_BUF似乎没有按照我的意愿复制到dato中
USART中断例程的代码为:
void USART1_IRQHandler(void
{
u8 Res;
#if SYSTEM_SUPPORT_OS
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
Res =USART_ReceiveData(USART1);
if((USART_RX_STA&0x8000)==0)
{
if(USART_RX_STA&0x4000)
{
if(Res!=0x0a)USART_RX_STA=0;
else{
USART_RX_STA|=0x8000;
dato[0]= USART_RX_BUF[0];
dato[1]= USART_RX_BUF[1];
dato[2]= USART_RX_BUF[2];
dato[3]= USART_RX_BUF[3];
//USART_RX_STA= 0;
//memset(USART_RX_BUF,0,5);
}
}
else //No se recibio 0x0d todavia
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
}
}
}
}
如上所述,此代码仅接收4个字节,并忽略我在这4个字节之后发送的任何内容(接收的数据缓冲区无法覆盖),并将缓冲区中的数据写入名为dato的数组中。
感谢您的帮助
答案 0 :(得分:0)
最有可能,您只需在读取数据后清除USART_IT_RXNE
标志
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
答案 1 :(得分:0)
将代码从STM32G0移植到STM32F3时遇到了这个问题。显然,它已在G0 HAL库中修复,但在F3中未修复。搜寻了一个小时后,我没有找到任何简单的解决方案,因此我不得不提出自己的解决方案。尽管这更多是一种解决方法,然后是解决方案。
在处理接收到的数据后,我仅调用HAL_UART_Abort_IT(&huart)
和HAL_UART_Recieve_IT(&huart)
。这可能不是最干净的方法,但是最简单。