小趴菜cai 2024-06-28 10:55 采纳率: 0%
浏览 7

stm32连续接收问题

使用串口助手发送数据:wr,1,0,100,0,1,1,3,0,3,0,1,100,0,100,0,100,0,65536,0,1,0,0,0,0,0,2,1,1,2,0,16,0,0,0,1,0,1,
单次发送一切正常,在间隔1s连续发送时出现接收出错的情况,该如何解决

正常情况:

img

出错情况:

img

中断函数如下:

void USART1_IRQHandler(void)                        //串口1中断服务程序
{
        u8 Res;
#if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntEnter();
#endif

        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { //接收中断(接收到的数据必须是0x0d 0x0a结尾)
                Res = USART_ReceiveData(USART1);        //读取接收到的数据
                //printf("%c", Res);

                if((USART_RX_STA & 0x8000) == 0) { //接收未完成
                        if(USART_RX_STA & 0x4000) { //接收到了0x0d
                                if(Res != 0x0a) //接收错误,重新开始
                                        USART_RX_STA = 0;
                                else USART_RX_STA |= 0x8000;        //接收完成了
                        }
                        else { //还没收到0X0D
                                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;
                                }
                        }
                }
        }

#if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntExit();
#endif
}

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-28 11:00
    关注

    引自免费微信小程序:皆我百晓生

    从你描述的问题来看,你在使用STM32连续接收数据时遇到了问题。当数据连续发送时,接收端出现了错误。这可能是由以下几个原因导致的:

    1. 缓冲区处理问题:连续发送的数据可能会导致接收缓冲区溢出或者接收中断的处理不及时。中断处理程序可能没有及时处理所有接收到的数据,导致数据丢失或混淆。
    2. 数据完整性检查:你的中断函数中有检查接收到的数据是否以0x0d 0x0a结尾的逻辑。在连续发送的情况下,如果数据间的时间间隔不够长,可能会导致这个检查失败,从而触发错误处理。

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

    修改中断函数

    首先,确保你的中断函数能够及时处理所有接收到的数据。你可以考虑移除或修改关于数据结尾检查的逻辑,改为在数据处理阶段进行完整性检查。

    增加缓冲区大小

    如果数据量大且发送速度快,可能需要增加接收缓冲区的容量,以避免数据丢失或溢出。

    优化数据处理逻辑

    对于连续接收的数据,你可能需要优化数据处理逻辑以确保数据的完整性。可以考虑为每个发送的数据包添加唯一的标识符或序列号,以便于在接收端进行识别和处理。

    调整串口参数

    检查串口的波特率、数据位、停止位和校验位等参数设置,确保发送和接收端的设置一致。有时候参数的不匹配也会导致接收错误。

    示例代码(简化版中断函数)

    以下是一个简化版的串口中断服务程序示例,你可以根据你的实际需求进行调整:

    void USART1_IRQHandler(void) {
        u8 Res;
        if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { 
            Res = USART_ReceiveData(USART1);        //读取接收到的数据
            USART_RX_BUF[USART_RX_IDX++] = Res;     //存入缓冲区,并更新索引
            if (USART_RX_IDX >= USART_REC_LEN) {    //如果缓冲区满,重置索引并处理数据
                USART_RX_IDX = 0;
                // 处理接收到的数据...
            }
        }
    }
    

    这个简化版的中断函数只是将接收到的数据存储到缓冲区中,并在必要时处理数据。你可以根据你的实际需求添加更多的逻辑来处理数据的完整性检查和错误处理。希望这些建议能帮助你解决问题!如果还有其他问题或需要进一步的帮助,请告诉我。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月28日

悬赏问题

  • ¥15 在国外文献网站里点击view pdf 加载异常缓慢甚至加载不出来。
  • ¥50 python批量提取发票的信息
  • ¥15 mysql安装,初始化数据库失败
  • ¥15 虚幻五引擎内容如何上传至网盘?
  • ¥15 使用mmpose库时出现了问题
  • ¥15 IRI2016模型matlab运行报错
  • ¥50 bat怎么设置电脑后台自动点击网页指定词运行脚本,输入指定网页链接,指定点击词,指定间隔时间,指定网页出现的词,指定网页出现词出现后后点击锁定,放在后台运行不影响前台鼠标工作
  • ¥20 20CrMnMo的高温变形抗力
  • ¥15 RTX3.6 5565驱动中断报错
  • ¥50 带防重放token(Antireplay-Token)的网站怎么用Python发送请求