51单片机串行通信中SBUF的值该如何判断

想根据接收到的不同信息进行相应的动作,就写了以下中断

void UART_Routine() interrupt 4
{
    
    if(RI==1)                    //如果接收标志位为1,接收到了数据
    {
        switch(SBUF) //根据接收到的数据执行相应操作
        {
            case 'a':
                            LCD_Init();
            LCD_ShowString(1,1,"OPEN");    
            
            Delay(2000);
            LCD_Init();    
                 
                break;
            case 'b':
                       LCD_Init();
            LCD_ShowString(1,1,"SUCCESS");    
            
            Delay(2000);
            LCD_Init();    
                break;
            default:
               LCD_Init();
            LCD_ShowString(1,1,"error");    
            
            Delay(2000);
            LCD_Init(); //如果接收到其他字符,则
                break;
        
                            
        
        }
            RI=0;        
}
}

但是通过发送信息后都始终是进入到default,用if语句判定也不对,想请问一下SBUF的值该如何判断
由于所给的lcd例程无法显示SBUF的数据格式,就不知道该如何获取SBUF的值,请问该如何来判断SBUF,我看了传送的时候传的是ascii值,但是把a改为0x61依旧无法判定成功,所以该如何解决呢

1,不建议在中断里做太耗时的操作
2,建议先读出SBUF到一个变量,然后对这个变量做分支判断。
3,试试用串口跟踪工具确定你到底发送的是什么。有可能你发送的不止一个,有些串口调试工具会自动带上换行

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    如果您无法获取SBUF的具体值,就无法正确地判断SBUF的值。因此,您需要寻找一种方式来获取SBUF的数据。

    下面是一种可能的方法:

    1. 使用proteus仿真工具,将单片机与LCD模块连接起来,然后运行仿真。

    2. 在LCD模块的实时显示区域中,可以看到单片机发送的所有数据。

    3. 在单片机程序中添加一个中断服务程序,在此中断程序中读取SBUF,并将其发送到LCD模块上。

    4. 在主程序中使用if语句来比较SBUF的值,并根据SBUF的值来执行相应的操作。

    下面是一个示例代码:

    #include <stdio.h>
    #include <reg51.h>
    
    // LCD模块端口定义
    sbit RS=P3^0;
    sbit RW=P3^1;
    sbit EN=P3^2;
    sbit BUSY=P3^3;
    
    // 定义中断服务程序
    void serial_ISR() interrupt 4 {
        char c = SBUF; // 读取SBUF
        // 将字符c发送到LCD模块上
        fprintf(stdout, "%c", c);
    } 
    
    void main() {
        // 初始化串口
        TMOD |= 0x20;
        TH1 = 0xFD;
        TR1 = 1;
    
        // 初始化LCD模块
        lcd_init();
    
        while(1) {
            // 判断SBUF的值并执行相应的操作
            if(SBUF == 0x61) {
                // SBUF的值为字符a,执行操作1
                operation1(); 
            }
            else if(SBUF == 0x62) {
                // SBUF的值为字符b,执行操作2
                operation2();
            }
            else {
                // SBUF的值为其他字符,执行默认操作
                default_operation();
            }
        }
    }
    
    // 初始化LCD模块函数
    void lcd_init() {
        // 初始化部分略
    }
    
    // 操作1函数
    void operation1() {
        // 操作1的代码
    }
    
    // 操作2函数
    void operation2() {
        // 操作2的代码
    }
    
    // 默认操作函数
    void default_operation() {
        // 默认操作的代码
    }
    

    注:以上代码仅为示例,具体实现可能需要根据您的具体情况进行调整。如果您的程序仍然无法正确判断SBUF的值,请尝试使用其他方法来获取SBUF的数据。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^