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

串口中断的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日

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?