5825 2022-04-03 21:41 采纳率: 100%
浏览 35
已结题

串口中断的if elseif else语句一直都是执行最后

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

程序烧录后,在串口调试助手中发送任何数字,单片机传回的数据都是“Error!”

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

void main()
{        
    inti();     
    while(1)
    {
        if(flag_uart==1)
        {
            flag_uart=0;
            ES=0;
            TI=1;
            switch(flag_on)
            {
                case 0:    puts("Turn on ad!\n");
                            TR0=1;
                            break;
                case 1:    printf("Turn off ad!\n");
                            TR0=0;
                            break;
                case 2:    puts("Error!\n");
                            break;
            }
            while(!TI);
            TI=0;
            ES=1;
        }
        if(flag_time==1)
        {
            flag_time=0;
            ad_val=Read_AD_Data(0x94);
            ad_vo=(float)ad_val*5.0/256.0;
            ES=0;
            TI=1;
            printf("The voltage is %fV\n",ad_vo);
            while(!TI);
            TI=0;            
            ES=1;
        }
        datapros();     //数据处理函数
        display();//数码管显示函数        
    }    
}
void ser() interrupt 4                   //串口中断函数
{
    RI=0;
    a=SBUF;
    flag_uart=1;
        if(a==1)                    
            flag_on=0;                
         else if(a==2)               
            flag_on=1;                    
        else
            flag_on=2;
                  
}

运行结果及报错内容

img

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

试过将中断函数中的if语句表达改成
if-if-if形式,电脑收到的还是“Error!”。

试过if-else形式,只保留第一句和第二句,将第三句注释掉,收到的是“Turn off ad!”。

试过将if语句改过很多不同的形式都不行。

也试过在中断语句中将if语句改成switch语句控制,结果也不行。

下面尝试了将后两句注释掉,结果在调试窗口里输入任何数字,AD检测都会开启

void ser() interrupt 4
{
    RI=0;
    a=SBUF;
    flag_uart=1;
        if(a==1)                    
            flag_on=0;                
/*        else if(a==2)               
            flag_on=1;                    
        else
            flag_on=2;          */
                  
}

img

我想要达到的结果

想要实现在串口调试助手发送命令“1”,单片机返回“Turn on ad!”,并间隔1秒读取一次电位器的值,然后将值返回给电脑,显示“The voltage is %fV”

“2”是停止,返回“Turn off ad!”

“其他数值”,返回“Error!”

  • 写回答

2条回答 默认 最新

  • 生如~夏花 2022-04-04 09:49
    关注

    你发的5是字符,要发HEX
    作为调试,你可以把收到的数据打印出来

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月12日
  • 已采纳回答 4月4日
  • 创建了问题 4月3日

悬赏问题

  • ¥15 关于#web项目#的问题,请各位专家解答!
  • ¥15 vmtools环境不正常
  • ¥15 请问如何在Ubuntu系统中安装使用microsoft R open?
  • ¥15 jupyter notebook
  • ¥30 informer时间序列预测
  • ¥20 SSR引物多态性分析
  • ¥15 大漠插件在Win11易语言注册调用和免注册灵异事件,VS上注册调用完全没问题
  • ¥15 Addressable缓存机制做热更新的问题
  • ¥15 微信开发者工具vant组件
  • ¥15 iPhone iCloud云盘资料删除,MAC丢失50多G桌面资料