OpenEdv-开源电子网

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

最近编程发现自己真的真的很菜,写红外遥控器解码的程序,耗时好久,最后参考别人的代码,但是有一处程序不理解,求指教。

[复制链接]

20

主题

69

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5486
金钱
5486
注册时间
2018-3-25
在线时间
16 小时
发表于 2019-6-16 19:32:27 | 显示全部楼层 |阅读模式
25金钱
本帖最后由 时间继电器 于 2019-6-16 19:49 编辑

下面代码中在第二个for循环的地方,把for(j=1;j<=8;j++)改成for(j=0;j<8;j++),并且这样改动后,同时把程序里的if(j<8)判断语句也删除,因为我认为都是执行8次,没必要这样判断,但是实际程序出错,而且经过好几次测试就是由于这样修改才导致运行出错的,但是我不明白这个是为何?按照我的改动,应该是没影响吧。求指点!(具体描述可能不清楚,所以我附上改动前后的图)
                                                  

改动前

改动前

改动后

改动后



下面是整段程序的代码:
[mw_shl_code=c,true]/************************************红外按键解码********************************/
void VS_1838B_decoding(void)                                                                //红外信号解码程序
{
        static unsigned int USER_DATA=0;                                                //用于在重发模式下 返回上一次的用户码
        static unsigned char KEY_DATA=0;                                                //用于在重发模式下 返回上一次的按键码
        
    unsigned char i,j,k;                                                                                //用于循环采集红外输出的数据
        unsigned char hr_time=0;                                                                //用于提取每个电平的保持时间
        unsigned char hr_dat=0;                                                                        //用于保存红外信号中的单个字节数据
    unsigned char IR_data[4];                                                                //用于存放红外遥控器的数据 16位用户码 8位按键码 8位按键反码

        if(Receive_completion_flag)                                                                //判断红外遥控信息是否已经捕获完成
        {
                k=1;                                                                                                //开始解码(这里跳过对引导码的处理,即从时间捕获数组的第二个成员开始处理)
                for(i=0;i<4;i++)                                                                        //每次红外发送四个字节的数据
                {
                        for(j=1;j<=8;j++)                                                                //每个字节有8位
                        {
                                hr_time=HR_time_data[k];                                        //提取每一个电平的保持时长
                                if(hr_time>7)                                                                //周期大于(7*250=1.750ms)的信号为“1”信号,正常红外“1”信号周期为2.25ms
                                {                                                                                        //如果周期小于1.750ms,则为“0”信号,正常红外的“0”信号周期为1.12ms
                                        hr_dat|=0x80;                                                        //写“1”
                                }
                                if(j<8)
                                {
                                        hr_dat>>=1;                                                                //右移一位,准备接收下一位信号,(写“0”也在这里完成)
                                }
                                k++;
                        }
                        IR_data=hr_dat;                                                                //完成一个字节的解码后,数据保存在IR_data数组里
                        hr_dat=0;                                                                                //变量清除,准备接收下一个字节数据
                }
                Receive_completion_flag=0;                                                        //完成一次红外数据解码后,清除标志位,准备下一轮按键的解码
               
                if ((IR_data[2] | IR_data[3])==0xff)                                //4组数据接收完毕 校验按键码是否正确
                {
                        User_code=(((unsigned int)IR_data[1]<<8)|IR_data[0]);//获取用户码
                        Key_code=IR_data[2];                                                        //获取按键码
                        Key_code_F=IR_data[3];                                                        //获取按键反码
               
                        Infrared_flag=1;                                                                //建立红外按下的标志位
                        USER_DATA=User_code;                                                        //静态变量保持本次用户码
                        KEY_DATA=Key_code;                                                                //静态变量保持本次按键码
                }
        }
}[/mw_shl_code]




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

使用道具 举报

20

主题

69

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5486
金钱
5486
注册时间
2018-3-25
在线时间
16 小时
 楼主| 发表于 2019-6-16 19:51:51 | 显示全部楼层
插入的代码行间距好大,还望大神们看一眼,我很纳闷。想知道原因。
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2019-6-16 20:09:45 | 显示全部楼层
  hr_dat>>=1;这一行问题吧,原来移了7次,现在好像移了8次
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-6-16
在线时间
0 小时
发表于 2019-6-16 20:13:01 | 显示全部楼层
首先就是第一个if上面那行数据读取,读的数据已经不一样了,还有就是楼上说的,原来移7次,现在移8次
回复

使用道具 举报

5

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2018-6-13
在线时间
63 小时
发表于 2019-6-16 20:28:58 来自手机 | 显示全部楼层
就是楼上说的if语句执行的次数多了
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-6-16 21:01:27 | 显示全部楼层
把for(j=1;j<=8;j++)改成for(j=0;j<8;j++)没问题  if(j<8)必须要,改后if(j<7) 意思是最后一次就不移位了
回复

使用道具 举报

14

主题

314

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1116
金钱
1116
注册时间
2011-10-19
在线时间
256 小时
发表于 2019-6-17 09:55:06 | 显示全部楼层
如果只是做东西的话,找个函数拿来就用。。
哥们的小店:http://shop103291259.taobao.com
回复

使用道具 举报

14

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2018-7-12
在线时间
31 小时
发表于 2019-6-17 10:56:39 | 显示全部楼层
一、你修改的for循环次数是没变的 for循环次数是8次
二、你的右移次数从原先的7次变成了8次。所以才会接收的数据错误。也就是说你接收8位数据只需要右移7次,因为最后一位已经是在最高位上了,不需要再右移了。
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1815
金钱
1815
注册时间
2011-10-9
在线时间
230 小时
发表于 2019-6-17 11:03:40 | 显示全部楼层
这个简单 把每一次移位的数据 printf出来看看 不就一清二楚了么  .  i=0 开始是移动了多少次 i=1又是移动了多少次i  清清楚楚 明明白白
回复

使用道具 举报

20

主题

69

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5486
金钱
5486
注册时间
2018-3-25
在线时间
16 小时
 楼主| 发表于 2019-6-17 12:01:39 | 显示全部楼层
a5820736 发表于 2019-6-16 20:09
hr_dat>>=1;这一行问题吧,原来移了7次,现在好像移了8次

嗯嗯嗯  是的,就是和你说的一样,原来那种写法是移动了7次,我更该后移动了8次,我注意力全集中在for循环上了,没留意这个问题。
回复

使用道具 举报

20

主题

69

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5486
金钱
5486
注册时间
2018-3-25
在线时间
16 小时
 楼主| 发表于 2019-6-17 12:03:05 | 显示全部楼层
yuyang 发表于 2019-6-17 09:55
如果只是做东西的话,找个函数拿来就用。。

就是做东西,也顺便学习一下。
回复

使用道具 举报

20

主题

69

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5486
金钱
5486
注册时间
2018-3-25
在线时间
16 小时
 楼主| 发表于 2019-6-17 12:05:30 | 显示全部楼层
simms01 发表于 2019-6-17 11:03
这个简单 把每一次移位的数据 printf出来看看 不就一清二楚了么  .  i=0 开始是移动了多少次 i=1又是移动了 ...

一言难尽啊,我也尝试串口打印调试信息,但是这个是老板买的一个东西,东西不符合他要求,叫我改重新写个程序,板子是成型的,没办法串口打印。
回复

使用道具 举报

20

主题

69

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5486
金钱
5486
注册时间
2018-3-25
在线时间
16 小时
 楼主| 发表于 2019-6-17 12:05:59 | 显示全部楼层
猎人123 发表于 2019-6-17 10:56
一、你修改的for循环次数是没变的 for循环次数是8次
二、你的右移次数从原先的7次变成了8次。所以才会接收 ...

谢谢大神,感谢指点。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-26 18:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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