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

2019-07-20 23:48发布

本帖最后由 时间继电器 于 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]




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
猎人123
1楼-- · 2019-07-21 14:53
一、你修改的for循环次数是没变的 for循环次数是8次
二、你的右移次数从原先的7次变成了8次。所以才会接收的数据错误。也就是说你接收8位数据只需要右移7次,因为最后一位已经是在最高位上了,不需要再右移了。
simms01
2楼-- · 2019-07-21 18:05
这个简单 把每一次移位的数据 printf出来看看 不就一清二楚了么  .  i=0 开始是移动了多少次 i=1又是移动了多少次i  清清楚楚 明明白白
时间继电器
3楼-- · 2019-07-21 20:52
a5820736 发表于 2019-6-16 20:09
hr_dat>>=1;这一行问题吧,原来移了7次,现在好像移了8次

嗯嗯嗯  是的,就是和你说的一样,原来那种写法是移动了7次,我更该后移动了8次,我注意力全集中在for循环上了,没留意这个问题。
时间继电器
4楼-- · 2019-07-22 02:05
 精彩回答 2  元偷偷看……
时间继电器
5楼-- · 2019-07-22 07:02
simms01 发表于 2019-6-17 11:03
这个简单 把每一次移位的数据 printf出来看看 不就一清二楚了么  .  i=0 开始是移动了多少次 i=1又是移动了 ...

一言难尽啊,我也尝试串口打印调试信息,但是这个是老板买的一个东西,东西不符合他要求,叫我改重新写个程序,板子是成型的,没办法串口打印。
时间继电器
6楼-- · 2019-07-22 07:41
 精彩回答 2  元偷偷看……

一周热门 更多>