OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5756|回复: 4

51串口通信输入求和返回值不正确,求助

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2020-4-19
在线时间
1 小时
发表于 2020-4-19 21:51:58 | 显示全部楼层 |阅读模式
4金钱
#include "reg52.h"               

typedef unsigned int u16;
typedef unsigned char u8;

void UsartInit()
{
        SCON=0X50;        //设置为工作方式1
        TMOD=0X20;        //设置计数器工作方式2  00100000 八位自动重装定时
        PCON=0X80;        //波特率加倍
        TH1=0XF3;        //计数器初始值设置,注意波特率是4800的
        TL1=0XF3;
        ES=1;            //打开串口中断允许
        EA=1;                //打开总中断
        TR1=1;            //打开计数器
}

void delay(u16 y)
{
  while(y--);
}


void main()
{       
        UsartInit();  //        串口初始化
        while(1);               
}

void Usart() interrupt 4
{
        u8 receiveData[2] ;
        u8 h;
        u8 i;
        u8 dat;
   for(h=0;h<2;h++)
        {
          
          receiveData[h]=SBUF;    //出去接收到的数据
          RI = 0;                 //清除接收中断标志位  SBUF置零
          delay(500000);
        }
            RI=0;          
       
        dat=receiveData[0]+receiveData[1];
        for(i=0;i<3;i++)
        {
                  SBUF=dat;   //将接收到的数据放入到发送寄存器
       
                while(!TI);                        //等待发送数据完成
                TI=0;
           }
            TI=0;                                //清除发送完成标志位

}

我是想要通过串口调试助手分开发送两个十六进制数给单片机处理求和之后在返回来三次,转十进制(但是我不会转,我刚刚才学了几天),然后我输入的数01 ,0A, 08,0F这样前面是0的数才发一次就自动给我求和了(也就是x2),然后我的数字改了第一位不是0之后就错的,比如我输入16  就会给我2c 6c 2c ,6c 2c 6c,这样三个不一样的数,还是变化的,就很尴尬,我还继续研究这个东西,但是我还没看懂,求指导一下,最好是能告诉我怎么改一下程序,我好回去对着在自己想想是为什么,看着比较清楚,,,谢谢!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

78

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1590
金钱
1590
注册时间
2018-10-11
在线时间
224 小时
发表于 2020-4-20 13:29:11 | 显示全部楼层
本帖最后由 spritels 于 2020-4-20 13:32 编辑

你在串口中断里面delay那么长的时间,不会漏掉好多数么.....再说了,500000用u16放不下嘛....
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2020-4-19
在线时间
1 小时
 楼主| 发表于 2020-4-20 15:32:17 | 显示全部楼层
spritels 发表于 2020-4-20 13:29
你在串口中断里面delay那么长的时间,不会漏掉好多数么.....再说了,500000用u16放不下嘛....

哈?我不清楚,但是那个延时我加不加都是这样,不能达到我要东西,我朋友说是我中断次数只有一次?我两改了半天也没整出来
回复

使用道具 举报

6

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2019-9-24
在线时间
69 小时
发表于 2020-4-22 08:50:54 | 显示全部楼层
串口每次只能接受8个字节,进来一次中断一次,所以你的数据都是在receiveData【1】,receiveData【2】没有数据。每发送一次也会进入一次中断,你的receiveData【1】又会取BUSF的值,整个思路大概是这样,你的程序很乱,逻辑也不对。
回复

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2020-5-9
在线时间
18 小时
发表于 2020-5-15 02:23:38 | 显示全部楼层
代码写得很得意,看着接收一次、接收二次,然后相加并发送回去,道理流程都正确,只是单片机根本不会理会。原因是:代码处于中断例程,是因为串口有数据来,所以进入中断,才有机会运行这个代码。进入中断后单片机就不再理会串行口是否有数据,也不会命令串行口发送数据,代码里的接收,第一次、第二次恐怕接收到的就是同一个数据,然后相加再发送也不会马上执行,只有退出中断后才会被执行。。。可能会有好多奇怪的现象奇怪的问题,天外来客都可能出现。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 09:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表