打印
[应用相关]

曼彻斯特解码

[复制链接]
2568|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huanghuac|  楼主 | 2018-11-8 16:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我刚接手的一段程序,让更改一下曼彻斯特解码。这段程序的前导符是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;
        }
}
沙发
llljh| | 2018-11-8 16:20 | 只看该作者
居然什么注释也没有.
不过这段代码写得挺规范的, 比较容易看明白.
不过我没有看到  case 1:
先研究 曼彻斯特 吧

使用特权

评论回复
板凳
huanghuac|  楼主 | 2018-11-8 16:24 | 只看该作者
交接过来的就没有注释,所以导致我看着好乱。没有case1 .,曼彻斯特码算是了解了就是看程序的时候看不懂

使用特权

评论回复
地板
pengf| | 2018-11-8 16:28 | 只看该作者
那就先了解段曼彻斯特解码的原理,再慢慢分析代码

使用特权

评论回复
5
木木guainv| | 2018-11-8 16:29 | 只看该作者
硬件线路如何设计呢

使用特权

评论回复
6
huanghuac|  楼主 | 2018-11-8 16:34 | 只看该作者
还是请教别人改出来的。使用的是外部管脚中断,利用定时差得到的  计算1T 1.5T 2T 可以的到

使用特权

评论回复
7
huanghuac|  楼主 | 2018-11-8 16:37 | 只看该作者

结贴了,多谢大家讨论这么多哈,呵呵

使用特权

评论回复
8
yiy| | 2018-11-8 17:11 | 只看该作者
这个概念是什么时候学的,我怎么没印象了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

772

主题

8473

帖子

6

粉丝