浔阳打水人 2022-03-21 22:49 采纳率: 0%
浏览 90
已结题

esp8266连接stm32每次发送数据时上次发送的数据生效

问题遇到的现象和发生背景

通过手机发送数据,控制led灯

问题相关代码,请勿粘贴截图

void USART3_IRQHandler(void) //串口3中断服务程序
{
u8 Res;

if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
    {
    Res =USART_ReceiveData(USART3);    //读取接收到的数据
        if(Res == ':'||USART_RX_STA>0)
        {
            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++;      
                        }         
                    }
                }
        }                
    }

}

下面是主函数里的循环部分
while(1)
{
if((USART_RX_STA&0x8000)==0x8000) //接收完成
{
switch(USART_RX_BUF[1])
{
case 'A':LED1_on();break;
case 'B':LED2_on();break;
case 'C':LED_off();break;
default:break;
}
USART_RX_STA = 0;
memset(USART_RX_BUF,0x00,sizeof(USART_RX_BUF));
}
}

运行结果及报错内容

大概就是
开机连接
发送A,无响应
发送B,响应A
发送B,响应B
每次发送就响应上次的数据

我的解答思路和尝试过的方法

这样可以暴力解决,但是我还是不懂为什么上面就不行
//void USART3_IRQHandler(void) //串口3中断服务程序
//{
// u8 Res;
//
// if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
// {
// Res = USART_ReceiveData(USART3); //读取接收到的数据
// if(Res == ':'||USART_RX_STA>0)
// {
// USART_RX_STA++;
// switch(Res)
// {
// case 'A':LED1_on();USART_RX_STA=0;break;
// case 'B':LED2_on();USART_RX_STA=0;break;
// case 'C':LED_off();USART_RX_STA=0;break;
// default:break;
// }
// }
// }
//
//}

我想要达到的结果

补充,换了个app把指令结尾的/n换成/r就解决了,可能和esp8266具体接受的指令格式有关,或者说手机发送指令的格式有关。具体我也不知道

  • 写回答

2条回答 默认 最新

  • lfq21 2022-03-22 10:14
    关注

    switch(USART_RX_BUF[1])
    {
    case 'A':LED1_on();break;
    case 'B':LED2_on();break;
    case 'C':LED_off();break;
    default:break;
    }
    改成----------------
    switch(USART_RX_BUF[0])
    {
    case 'A':LED1_on();break;
    case 'B':LED2_on();break;
    case 'C':LED_off();break;
    default:break;
    }

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月11日
  • 修改了问题 3月22日
  • 创建了问题 3月21日

悬赏问题

  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络