串口通信返回数据出错问题

我想从调试助手里发送一个多位数到单片机上,然后单片机处理加1返回到电脑,结果我发1,返回1;发123,返回24;发12,返回2,这是什么问题啊,我发一段代码,大家能帮我看一下吗

 #include<reg52.h>
#include"bstv51.h"
unsigned char num=0;    

void Uart_Init();

void main()
{
    Uart_Init();
    while(1);
}

void Uart_Init()
{
    TMOD=0X20;//设置定时器1工作方式为2,8位重装定时器
    TH1=0XFD;
    TL1=0XFD; //设置波特率为9600
    SCON=0X50;//设置串口工作方式为1,8位元uart,开启接受允许
    PCON=0X00;//波特率不加倍
    EA=1;
    ES=1;
    TR1=1;
}

void Uart_Isr() interrupt 4
{
    if(TI)
    {
        TI=0;
        REN=1;
    }
    if(RI)
    {
        RI=0;
        num=SBUF;
        num++;
        SBUF=num;
        REN=0;
    }   
}

从你的程序看,SBUF应为单片机串口的读写寄存器。然而,由于串口寄存器是外设,在单片机CPU内可能有读写CACHE,导致你既未真正读到SBUF,也未真正写到SBUF,所以上位机获取的只能是些不可预知的数据。
解决方法:在读、写SBUF之前,调用相关函数t同步D-CACHE。

这个要看编程手册了,可能就是invalidate, update之类的