2151|5

302

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

什么原因导致的? [复制链接]

这是一个串口接收带校验的测试程序,在checksum中,当运行到return 1时就从头开始了而不是进入if,请问大家这是什么原因?
void main()
{
          char i=0;
    SCON=0x50;  
    PCON=0x00;       
    TMOD = 0x20;               
    TL1 = 0xfd;   
    TH1 = 0xfd;  //2¨ìØÂêÎa9600
          AUXR=0x00;
    TR1 = 1;                    
    ES = 1;                     
    EA = 1;
    while(1)
                {
                        SendData(0x01);
                        if(checksum(card)<0)
                                    SendData(0x02);
                        SendData(0x07);
                        for(i=0;i<14;i++)
            {
                                 SendData(card[i]);
                         }
                }
   //SendString("STC15F2K60S2\r\nUart Test !\r\n");

}

uchar Asc2Hex(char i)
{
          char temp1;
    if((i&0xf0)==0x30)temp1=i&0x0f;
                else if((i&0xf0)==0x40)temp1=(i&0x0f)|0x08;
                else if(((i&0xf0)!=0x30)&&((i&0xf0)!=0x40))
                        return 0;
                return temp1;
}
uchar checksum(volatile uchar *s)
{
   //s++;
         char i;       
   char arrayH[6],arrayL[6],arraysum[6];

         SendData(0x03);
         for(i=0;i<=5;i++)
         {
                  arrayH[i]=Asc2Hex(s[2*i+1])<<4;
         }
         SendData(0x05);
         for(i=0;i<=5;i++)
                {
       arrayL[i]=Asc2Hex(s[2*i+2]);
    }
                SendData(0x04);
                for(i=0;i<=6;i++)
                {
                  arraysum[i]=arrayH[i]+arrayL[i];
                }
                SendData(0x06);
                if(arraysum[5]==arraysum[0]^arraysum[1]^arraysum[2]^arraysum[3]^arraysum[4])
                        return 0;
                //while(busy);
                return 1;       
}

此帖出自51单片机论坛

最新回复

首先checksum的返回值永远不可能比0小,所以你这个比较毫无意义,第二如果是无缘无故的回到起点,你可以试一下关狗看一下。别的我也就不清楚了。  详情 回复 发表于 2016-3-23 09:58
点赞 关注
 

回复
举报

407

帖子

3

TA的资源

纯净的硅(初级)

沙发
 
if(checksum(card)<0)   这句话可能成立吗?没有报告警?重新开始是什么意思,你是怎么发现的!
此帖出自51单片机论坛

点评

ena
可以的,checksum的返回值与0比较呀。就是在用keil中的软件调试时,单步操作的情况下看到的。当执行完return 1后,应该是直接跳转到if中的。但现实却没有,而是将checksum函数执行完,再从main函数直接开始(即从头  详情 回复 发表于 2016-3-23 09:46
 
个人签名我在想
我知道什么
 
 

回复

302

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

可以的,checksum的返回值与0比较呀。就是在用keil中的软件调试时,单步操作的情况下看到的。当执行完return 1后,应该是直接跳转到if中的。但现实却没有,而是将checksum函数执行完,再从main函数直接开始(即从头开始)
此帖出自51单片机论坛

点评

首先checksum的返回值永远不可能比0小,所以你这个比较毫无意义,第二如果是无缘无故的回到起点,你可以试一下关狗看一下。别的我也就不清楚了。  详情 回复 发表于 2016-3-23 09:58
 
 
 

回复

407

帖子

3

TA的资源

纯净的硅(初级)

4
 
ena 发表于 2016-3-23 09:46
可以的,checksum的返回值与0比较呀。就是在用keil中的软件调试时,单步操作的情况下看到的。当执行完ret ...

首先checksum的返回值永远不可能比0小,所以你这个比较毫无意义,第二如果是无缘无故的回到起点,你可以试一下关狗看一下。别的我也就不清楚了。
此帖出自51单片机论坛

点评

ena
恩恩,现在只是测试,所以返回值就设为1 了。看门狗就没有开.  详情 回复 发表于 2016-3-23 10:01
 
个人签名我在想
我知道什么
 
 

回复

302

帖子

0

TA的资源

一粒金砂(高级)

5
 
zmsxhy 发表于 2016-3-23 09:58
首先checksum的返回值永远不可能比0小,所以你这个比较毫无意义,第二如果是无缘无故的回到起点,你可以 ...

恩恩,现在只是测试,所以返回值就设为1 了。看门狗就没有开.
此帖出自51单片机论坛
 
 
 

回复

302

帖子

0

TA的资源

一粒金砂(高级)

6
 
数组arraysum定义的为6个元素,实际上for时给了7个,估计是数组溢出
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表