单模先声 发表于 2025-2-18 08:57

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

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;
        }
}

晶美润科技 发表于 2025-4-17 14:27

用频谱仪扫扫板子看看是不是接收端还有其他干扰导致的,

晶美润科技 发表于 2025-4-17 14:27

用频谱仪扫扫板子看看是不是接收端还有其他干扰导致的,
页: [1]
查看完整版本: 关于433接收程序的丢包问题