打印
[国产单片机]

关于433接收程序的丢包问题

[复制链接]
254|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
单模先声|  楼主 | 2025-2-18 08:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
433发射端发送-20ms的400us方波+4ms低电平+24位数据。数据1为400us高电平+400us低电平,数据0为400us高电平+1200us低电平。

现在的问题是,接收端能收到发送端的数据,但是发送端几乎每发送十次,接收端就会丢包1~3次,不知道是不是我的程序问题,几百us的时间也很难做到避免毛刺,麻烦大佬们帮我看看是什么问题?


以下这个函数是接收函数,放在定时器里运行的,定时周期为100us
void receive()
{
        switch(Rf_Cnt)
        {
                case 0 :                                                           //4ms引导码
                        if(RF==0)                                                  //低电平累积次数
                        {
                                Count_Lead++;
                        }
                        else                                                       //高电平判断范围
                        {
                                if((Count_Lead >= 20) && (Count_Lead <= 60))           //2ms - 6ms
                                {
                                        Count_Lead=0;
                                        Recv_Data_Buf = 0x000000;                              //初始化参数
                                        Count_Data_Hi = 0;
                                        Count_Data_Lo = 0;
                                        Recv_Data_cnt = 0;
                                        Rf_Cnt=1;            
                                }
                                else                                                     //范围不对退出
                                {
                                        Count_Lead=0;
                                        Rf_Cnt=0;
                                }
                        }       
                break;

                case 1 :                                                                 //数据位高电平部分判断
                        if(RF==1)                                                  //高电平累积次数
                        {
                                Count_Data_Hi++;
                        }
                        else                                                       //低电平判断范围
                        {                       
                                if((Count_Data_Hi >= 1) && (Count_Data_Hi <= 6))       // 100us - 600us
                                {                    
                                        Count_Data_Hi = 0;
                                        Rf_Cnt=2;       
                                }
                                else
                                {               
                                        Rf_Cnt=0;
                                }
                        }                 
                break;

                case 2:                                                            //数据位低电平部分判断
                        if(RF==0)                                                   //低电平累积次数
                        {
                                Count_Data_Lo++;
                        }
                        else                                                        //高电平判断范围
                        {
                                if((Count_Data_Lo >= 1) && (Count_Data_Lo <= 6))       // 100us - 600us
                                {
                                        Count_Data_Lo = 0;
                                        bit_flag=1;                                        //判为高电平
                                        Rf_Cnt=3;
                                }
                                else if((Count_Data_Lo >= 8) && (Count_Data_Lo <= 16))       // 800us - 1600us
                                {
                                        Count_Data_Lo = 0;
                                        bit_flag=0;                                        //判为低电平
                                        Rf_Cnt=3;
                                }
                                else
                                {               
                                        Rf_Cnt=0;
                                }
                        }                 
                break;

                case 3 :               
                        Recv_Data_Buf <<= 1;
                        if(bit_flag)        Recv_Data_Buf|=0x000001;
                        else                        Recv_Data_Buf&=0xfffffe;
                        Recv_Data_cnt++;
                        if(Recv_Data_cnt>=24) {Rf_Cnt = 4;}//接收满24位,处理数据
                        else                  {Rf_Cnt = 1;}
                break;

                case 4 :                                                         //功能判断
                        if(LED1) LED1=0; else LED1=1;
                        key_mode=1;
                        Rf_Cnt = 0;                                                     //做完操作状态回零
                break;

                default:
                        Rf_Cnt = 0;
                break;
        }
}

使用特权

评论回复

相关帖子

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

本版积分规则

88

主题

578

帖子

1

粉丝