OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 80|回复: 12

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

[复制链接]

66

主题

491

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2135
金钱
2135
注册时间
2015-11-14
在线时间
523 小时
发表于 4 天前 | 显示全部楼层 |阅读模式
1金钱
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;
        }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3343

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8458
金钱
8458
注册时间
2020-5-11
在线时间
3899 小时
发表于 4 天前 | 显示全部楼层
专治疑难杂症
回复

使用道具 举报

66

主题

491

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2135
金钱
2135
注册时间
2015-11-14
在线时间
523 小时
 楼主| 发表于 4 天前 | 显示全部楼层

是我描述得不清晰吗?433接收端会丢包,程序是接收函数
回复

使用道具 举报

12

主题

3343

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8458
金钱
8458
注册时间
2020-5-11
在线时间
3899 小时
发表于 4 天前 | 显示全部楼层
本帖最后由 LcwSwust 于 2025-2-18 11:03 编辑
单模先声 发表于 2025-2-18 10:47
是我描述得不清晰吗?433接收端会丢包,程序是接收函数

啥型号?是不是三个脚的那种模块?能确保别人没有同时在发送信号造成同频干扰?
看波形了吗?有没有噪声?有没有突然出现一个窄脉冲?
傲游截图20250218110223.jpg

专治疑难杂症
回复

使用道具 举报

0

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
372
金钱
372
注册时间
2013-11-27
在线时间
50 小时
发表于 4 天前 | 显示全部楼层
定时器的周期为100us,而信号的脉宽为400us和1200us,这意味着每个脉宽只能被采样4次或12次。这种采样率可能不足以准确捕捉信号的边沿变化。
建议尝试将定时器的周期缩短到50us或更低,以提高采样精度。

当前的状态机逻辑在判断高低电平的范围时,范围设置较为宽松(例如100us-600us和800us-1600us),这可能会导致误判。
建议缩小判断范围,使其更接近实际的信号脉宽。例如,将高电平的判断范围设置为300us-500us,低电平的判断范围设置为1100us-1300us。
回复

使用道具 举报

66

主题

491

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2135
金钱
2135
注册时间
2015-11-14
在线时间
523 小时
 楼主| 发表于 4 天前 | 显示全部楼层
LcwSwust 发表于 2025-2-18 11:00
啥型号?是不是三个脚的那种模块?能确保别人没有同时在发送信号造成同频干扰?
看波形了吗?有没有噪声 ...

MRF318R-SOP8,附近都没有做电子的,应该不会有人同时发送信号。我用逻辑分析仪看过丢包的波形,没问题没有毛刺
回复

使用道具 举报

12

主题

3343

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8458
金钱
8458
注册时间
2020-5-11
在线时间
3899 小时
发表于 4 天前 | 显示全部楼层
本帖最后由 LcwSwust 于 2025-2-18 11:45 编辑
单模先声 发表于 2025-2-18 11:11
MRF318R-SOP8,附近都没有做电子的,应该不会有人同时发送信号。我用逻辑分析仪看过丢包的波形,没问题没 ...

建议:1、用示波器对比一下收发波形是否一致;
2、测试去掉无线模块,飞线让收发直通,程序是否正常解析;
3、状态机的转换,我看你收数据时是:1、2、3、1、2、3...
可能第3步会造成延时,建议将3与2整合在一起。


再请确认一下,发送端不发送,接收端是否有波形。
专治疑难杂症
回复

使用道具 举报

12

主题

3343

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8458
金钱
8458
注册时间
2020-5-11
在线时间
3899 小时
发表于 4 天前 | 显示全部楼层
longdeng84 发表于 2025-2-18 11:10
定时器的周期为100us,而信号的脉宽为400us和1200us,这意味着每个脉宽只能被采样4次或12次。这种采样率可 ...

很有AI的风格               
专治疑难杂症
回复

使用道具 举报

66

主题

491

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2135
金钱
2135
注册时间
2015-11-14
在线时间
523 小时
 楼主| 发表于 3 天前 | 显示全部楼层
LcwSwust 发表于 2025-2-18 11:43
建议:1、用示波器对比一下收发波形是否一致;
2、测试去掉无线模块,飞线让收发直通,程序是否正常解析 ...

1、用示波器对比了波形无异常
2、直接飞线收发,无出现问题
3、步骤2和3整合了依然没有解决问题
回复

使用道具 举报

8

主题

550

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2861
金钱
2861
注册时间
2016-5-13
在线时间
180 小时
发表于 前天 11:09 | 显示全部楼层
433顾名思义就是空中载波频率是433Mhz. 据说通信速度能达到200k。
速度达不到吧。2.4G的能满足你。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

4

主题

97

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3684
金钱
3684
注册时间
2018-5-25
在线时间
850 小时
发表于 昨天 10:58 | 显示全部楼层
先测试一下解码波形,看看波形有没有问题,没有问题的话就是代码问题,先测波形
回复

使用道具 举报

66

主题

491

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2135
金钱
2135
注册时间
2015-11-14
在线时间
523 小时
 楼主| 发表于 昨天 14:29 | 显示全部楼层
zdes33ss 发表于 2025-2-21 10:58
先测试一下解码波形,看看波形有没有问题,没有问题的话就是代码问题,先测波形

用示波器看了出错时的波形没问题,但是串口打印出来的数据有问题,就不理解是什么原因。而且我把接收芯片去掉,飞线到发送引脚上不会出问题,是不是可以判断软件没问题?
回复

使用道具 举报

12

主题

3343

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8458
金钱
8458
注册时间
2020-5-11
在线时间
3899 小时
发表于 昨天 15:05 | 显示全部楼层
单模先声 发表于 2025-2-19 08:54
1、用示波器对比了波形无异常
2、直接飞线收发,无出现问题
3、步骤2和3整合了依然没有解决问题

建议:
1、receive里让某个IO输出一个脉冲,用于判断这个函数有没有按时执行。
2、用数组记录每个位的Count_Data_Hi、Count_Data_Lo,对比看是哪些位出了问题。
专治疑难杂症
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-22 02:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表