放屁蛤蟆 2024-10-21 23:18 采纳率: 0%
浏览 28

stm32串口通信数据溢出

发送端数据,使用的是openmv

img

这是接收端数据,后两位经常会接收错误,前两位无异常

img


void USART1_IRQHandler(void)  
{  
    static uint8_t RxState = 0; // 状态机变量,跟踪接收状态  
    static uint8_t Serial_RxIndex = 0; // 存储接收到的字符索引  

    if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET) // 检查接收中断  
    {  
        char receivedChar = USART_ReceiveData(USART1); // 读取接收到的数据  

        // 状态机处理接收到的数据  
        switch (RxState)   
        {  
            case 0: // 初始状态  
                if (receivedChar == '[')   
                {  
                    Serial_RxIndex = 0; // 如果是 '[', 则开始新的接收  
                    RxState = 1; // 切换到接收状态  
                }  
                break;  

            case 1: // 接收数据状态  
                if (receivedChar == ']')   
                {  
                    Serial_RxBuffer[Serial_RxIndex] = '\0'; // 字符串结束符  
                    Serial_DataReady = 1; // 设置数据准备标志  
                    RxState = 0; // 切换回初始状态  
                }  
                else if (Serial_RxIndex < BUFFER_SIZE - 1) // 确保不会溢出  
                {  
                    Serial_RxBuffer[Serial_RxIndex++] = receivedChar; // 加入接收缓冲区  
                }  
                else  
                {  
                    // 缓冲区满,清空接收数据并重置状态  
                    Serial_RxIndex = 0; // 清空索引以重新开始接收  
                    RxState = 0; // 返回初始状态,丢弃接收到的数据  
                }  
                break;  

            default:  
                RxState = 0; // 处理意外状态,重置状态  
                break;  
        }  
        USART_ReceiveData(USART1);
        USART_ClearITPendingBit(USART1, USART_IT_RXNE); // 清除  
    }  
}
  • 写回答

1条回答 默认 最新

  • 无疆76 2024-10-21 23:20
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你提供的代码和描述来看,你在使用STM32的USART串口进行通信时遇到了数据溢出的问题。在接收端,后两位数据经常接收错误,而前两位数据没有问题。这个问题可能是由于以下几个原因导致的:

    1. 缓冲区大小不足:你的接收缓冲区可能不足以存储所有的数据。当缓冲区满时,新的数据可能会覆盖旧的数据,导致数据丢失或错误。你应该考虑增加缓冲区的大小以适应更大的数据。
    2. 中断处理逻辑问题:你的中断处理程序中,当接收缓冲区满时,你只是简单地重置了接收索引和状态,并没有清空接收缓冲区的数据。这可能会导致后续数据处理出错。你应该在缓冲区满时,彻底清空缓冲区并处理溢出的情况。
    3. 接收不完整的数据处理:在你的代码中,你正在寻找 '[' 和 ']' 字符来确定数据的开始和结束。如果接收的数据不包含这些字符,或者数据的格式与你预期的不一致,可能会导致数据处理出错。

    针对这些问题,你可以尝试以下解决方案:

    1. 增加缓冲区大小:确保你的接收缓冲区足够大,以存储你预期接收到的所有数据。
    2. 优化中断处理逻辑:在中断处理程序中,当接收缓冲区满时,不仅要重置接收索引和状态,还要清空缓冲区的数据。
    3. 更严格的数据处理:确保你的数据处理逻辑能够处理所有可能的数据格式和异常情况。

    另外,你还可以考虑使用其他方法优化串口通信,如使用DMA(直接内存访问)来减轻CPU在串口通信方面的负担,或者使用更高级别的通信协议来确保数据的完整性和正确性。

    最后,建议你使用调试工具(如串口调试助手)来监控通信过程,查看接收到的原始数据,以便更好地了解问题所在。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月21日