您好!这几天一直在试用官方针对点对点的BasicRF点灯程序,普通开发板。但不知为何程序会不定期的死机,有时半天都没事,有时1个小时后就出现故障,只要手动复位一下发送端才正常,程序我也只是改动了不是用来点灯而是发射数据流。之前也有网友提出这个问题,说发射太有规律性照成,不解???
* 发送端 :以10MS的延时间隔把8个字节的有效载荷不间断发送出去,一旦收到接收端的成功应答帧后转入接收模式,延时循环等待接收端发来的有效载荷数据,在规定时间内收没收到接收端发来的数据都会重新进入发送循环。
* 接收端 :从上电一直处在接收状态,当收到发送端的8字节有效载荷数据后取反一次LED(收到指示)并通过串口打印出来,然后立即向发送端发送3个字节的有效载荷数据,在规定时间内收没收到发送端 的应答都会重新进入接收循环。
!!有时在发了几百万和字节后就出现收不到数据了,接收端的LED不闪,串口也无数据,用抓包看到发送端还不停地再发但接收端只做应答(它们的帧序号都一样),只有复位发送端其才又开始正常通讯,我这几天的大概想法是,因为发送端的BUG造成发送端帧序号的不变,也就造接收端不停地丢包不处理,这可以理解,但是什么原因照成发送端在成功发一帧后帧序号不++呢?
在发送端的接收中断里放入LED取反闪烁发现出故障时的发送端无法进接收中断,实验取消帧过滤后可以了,但同信道的任何信号都会让其频繁进中断,这样效率就低了啊。请前辈们指点如何在保证帧过滤的情况下又不死机呢?谢谢!
Wellin Zhang:
Ting
根据你的描述,发送帧序号与ACK帧序号是相等的,那么造成帧序号不改变的有两种可能,第一个可能是CRC校验失败,第二个就是数据发送失败。
请尝试一下禁止ACK。
另外,
在发送端的接收中断里放入LED取反闪烁发现出故障时的发送端无法进接收中断,实验取消帧过滤后可以了,但同信道的任何信号都会让其频繁进中断,这样效率就低了啊。请前辈们指点如何在保证帧过滤的情况下又不死机呢?谢谢!
该LED操作的是在中断的什么位置?你取消的帧过滤是哪一部分,发送端帧过滤还是接收端帧过滤?
能否展示一下对程序做过哪些改动?另外能否提供一下抓包数据?谢谢
Best regards
Wellin
TING LI1:
回复 Wellin Zhang:
LED是放在下面这个函数里
HAL_ISR_FUNCTION( rfIsr, RF_VECTOR ) //RF_VECTOR为RF射频通用中断向量
{ halLedToggle(4);}
帧过滤的取消我是放在这个函数里
uint8 halRfInit(void)
{ FRMFILT0 &= ~(1<<0); }//禁止帧过滤