[应用相关] 关于一段曼彻斯特解码的问题

[复制链接]
1462|4
 楼主| 749120145 发表于 2017-7-10 16:11 | 显示全部楼层 |阅读模式
我刚接手的一段程序,让更改一下曼彻斯特解码。这段程序的前导符是0X00 0X01,现在让我更改成0X00 0XEE。看了好久没有看懂是什么意思所以想请教一下大家这段程序改如何修改成我需要的。这使用的是STM32F1的TIM4定时器中断。波特率我算的是9600.麻烦有知道的给点提示谢谢啦
void Manchester_decode_for_fsk(uint16_t sign)
{
        uint8_t code_type;
        uint16_t delt_time;
        static uint16_t timer=0;
        static uint8_t syn_count=0;
        static uint8_t rev_count=0;
        static uint16_t rev_data=0;
        static uint8_t last_bit=0;
        static uint8_t skip_bit=0;
        static uint8_t strt_bit=0;
//------------------------
        delt_time=sign-timer;
        timer=sign;       
//------------------------bit=104,208,312,417
        if((delt_time>156)&&(delt_time<250))
        {
                if(strt_bit!=0)
                        code_type=2;
                else
                {
                        syn_count++;
                        code_type=0;
                }
        }
        else if((delt_time>250)&&(delt_time<360))
        {
                if(syn_count>8)
                {
                        strt_bit=1;
                        code_type=3;
                }
        }
        else if((delt_time>360)&&(delt_time<480))
        {
                if(strt_bit!=0)
                        code_type=4;
                else
                        code_type=0;
        }
        else
        {
                syn_count=0;
                strt_bit=0;
                code_type=0;
                rev_count=0;
                rev_data=0;
                last_bit=0;
                return;
        }
//--------------------------------------
        switch(code_type)
        {
        case 2:
                rev_data<<=1;
                rev_count+=1;
                if(last_bit!=0)
                        rev_data+=1;       
        break;
        case 3:
                if(last_bit!=0)
                {
                        rev_data<<=1;
                        last_bit=0;
                        rev_count+=1;
                }
                else
                {
                        rev_data<<=2;
                        rev_data+=1;
                        last_bit=1;
                        rev_count+=2;
                }       
        break;
        case 4:
                rev_data<<=2;
                rev_data+=1;
                last_bit=1;
                rev_count+=2;
        break;
        default:
                strt_bit=0;
                rev_count=0;
                rev_data=0;
        return;
//        break;               
        }
//-------------------------------------
        if(rev_count==2)
        {
                rev_count=8;
        }
        if(rev_count%8==0)
        {
                Rev_buff[rev_count/8-1]=rev_data;
                rev_data=0;
                skip_bit=1;
        }
        else if(rev_count%8==7)
                skip_bit=0;
        else if((rev_count%8==1)&&(skip_bit==0))
        {
                Rev_buff[rev_count/8-1]=rev_data>>1;
                rev_data&=1;
        }
        if(rev_count>=72)
        {
                //Rev_buff[0]<<=1;
                Rev_flag=1;
                rev_count=0;
                rev_data=0;
                last_bit=0;
        }
}

airwill 发表于 2017-7-10 16:56 | 显示全部楼层
居然什么注释也没有.
不过这段代码写得挺规范的, 比较容易看明白.
不过我没有看到  case 1:
先研究 曼彻斯特 吧
 楼主| 749120145 发表于 2017-7-10 17:33 | 显示全部楼层
airwill 发表于 2017-7-10 16:56
居然什么注释也没有.
不过这段代码写得挺规范的, 比较容易看明白.
不过我没有看到  case 1:

交接过来的就没有注释,所以导致我看着好乱。没有case1 .,曼彻斯特码算是了解了就是看程序的时候看不懂。版主能否指点一二
mmuuss586 发表于 2017-7-10 17:47 | 显示全部楼层
那就先了解段曼彻斯特解码的原理,再慢慢分析代码
 楼主| 749120145 发表于 2017-9-7 14:40 | 显示全部楼层
还是请教别人改出来的。使用的是外部管脚中断,利用定时差得到的  计算1T 1.5T 2T 可以的到
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

46

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部