LoRa开发6:接收数据帧

1 引言

接收LoRa数据帧比发送稍复杂一些,接收是一个异步动作—-不知道下一帧什么时候到来;因为干扰或信号微弱等,接收可能会出错;甚至,当多次接收错误后,RF可能会宕机—-再也无法接收任何数据帧。

本章,我们继续基于Contiki和SX1278,开发接收数据帧的代码。

2 整体逻辑流程

接收数据帧的整体逻辑流程如下所示,特别注意的是,添加了处理异常的代码:如果RF接收错误(硬件自检payloadcrc16失败)或数据帧错误(用户CRC16失败),进程会重启动RF的接收,以防止陷入宕机(根据我们多年的经验,这种缺陷是可能发生的)。

3 进程时序

t0时刻:进程启动RF接收;

t1时刻:SX1278接收到数据帧,中断服务程序poll进程;

t2时刻:进程检验数据帧的CRC16,闪烁LED,打印计数、SNR和RSSI;

4 代码剖析

PROCESS_THREAD(RxPrintSNRRSSI, ev, data)

{

/*ATTENTION: stack variables can NOT cross any “XX_YIELD()”. */

bool    bFrameOK;                                                                                                            1

RF_FRAME_RAND_DATA    *p_stFrameData;

staticint32_t    s_lRxRandCnt = 0;

 

PROCESS_BEGIN();                                                                                                       2

InitSetLoRa();                                                                                                                   3

SX1278Receive(0);/* Explain: 0 means RX forever */                                                      4

while(1)

{

PROCESS_YIELD(); /* Yield until receive aframe. */                                                     5

bFrameOK = FALSE;

if (RF_Rx_Done == s_tRFResult)                                                                                   6

{

/* Check CRC16 of this received frame. */

s_stParseRFBuf.bySize = GetRadioBuf(s_stParseRFBuf.a_byBuf,RF_FIFO_SIZE);  7

p_stFrameData = (RF_FRAME_RAND_DATA *)s_stParseRFBuf.a_byBuf;

if ( p_stFrameData->wCRC16 ==util_CRC16( p_stFrameData,

GET_ST_FLD_OFFSET(RF_FRAME_RAND_DATA, wCRC16)) )                         8

{

bFrameOK = TRUE;

chip_LEDToogle();

++s_lRxRandCnt;

RIME_DBG( RIME_DBG_ON,

“Rx Rand Cnt=%ld, SNR=%d,RSSI=%d.\r\n”,

s_lRxRandCnt, s_chPacketSnr, s_nPacketRssi );                         9

}

}

/*EXPLAIN: Restore the RX of RF if Rx-Error or frame is NOT integrity.*/

if(!bFrameOK)                                                                                                              10

{

SX1278SetSleep();

SX1278Receive(0);

}

}

PROCESS_END();                                                                                                         11

}

Line#1:小心!在Contiki系统自动变量不能跨越阻塞语句,详细原因请链接:

http://blog.csdn.net/jiangjunjie_2005/article/details/44725997

Line#2:Contiki进程的第一条语句,详解请链接:

http://blog.csdn.net/jiangjunjie_2005/article/details/44600365

Line#3:初始化SX1278,详解请链接:

http://blog.csdn.net/jiangjunjie_2005/article/details/52824184

Line#4:启动RF接收,参数为0代表关闭超时定时器,即持续接收;

Line#5:阻塞进程,等待RF中断唤醒;

Line#6:判断RF是否接收一帧数据;

Line#7:从RF缓冲区复制数据帧到解析工作区;

Line#8:检测数据帧的CRC16是否正确;

Line#9:打印接收次数、SNR和RSSI,RIME_DBG()的原理和使用,请链接:

http://blog.csdn.net/jiangjunjie_2005/article/details/51869953

Line#10:如果接收错误或数据帧CRC16错误,重启动RF接收,防止宕机;

Line#11:Contiki进程的最后一条语句,详解请链接:

http://blog.csdn.net/jiangjunjie_2005/article/details/44600365

说明:LPWA物联网应用站(LPWAP.com)通过公开互联网收集、整理并转载有关LPWA物联网应用解决方案,以供广大LPWA应用开发者和爱好者共同学习交流和参考运用到实际生产生活中。本站所有转载的文章、图片、音频、视频等资料的版权归版权所有人所有并衷心感谢您的付出,由于本站采纳的非本站原创文章及图片等内容无法一一联系确认版权者,如果本网所选内容的文章原创作者认为其作品不宜放在本站,请及时通过以下留言功能通知我们采取适当措施,避免给双方造成不必要的经济损失。如果您希望保留文章在本站,但希望文章末尾提供对作者的致谢或者产品、网站交换链接的,也请将需求写入以下留言栏中,谢谢您的支持。让我们共同努力,打造万物互联的未来美好生活!

您的留言或需求: