LoRa开发6:接收数据帧

来源:互联网 发布:捕鱼刷分软件 编辑:程序博客网 时间:2024/06/11 19:30

接收数据帧

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


1 0
原创粉丝点击