chenyonken 2016-08-30 09:17 采纳率: 0%
浏览 1720
已结题

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

我想从调试助手里发送一个多位数到单片机上,然后单片机处理加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;
    }   
}

  • 写回答

2条回答 默认 最新

  • 许三少 2016-08-30 13:17
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog