Springboot SpringApplication LeetCode webserver plot cmd hyperlink sas mui Uploadify vue代码规范 react视频教程 matlab根号怎么打出来 删除数组第一个元素 hbase端口 cad怎么重复上一次命令 android调试工具 js对象添加元素 linux撤销 python迭代 python打开文件 python基础练习 python函数内定义函数 python怎么下载 java发邮件 java接口实现 java语言代码大全 java正则匹配数字 javascript源代码 opengl编程指南 考试练习系统 winterboard 微信昵称找人的软件 js刷新页面 联发科mt6750 流程图工具 亚索刀光 挑战程序设计竞赛 极限防守图 视频字幕制作软件
当前位置: 首页 > 学习教程  > 

LoRa开发6:接收数据帧

2020/10/16 17:46:09 文章标签: lora开发

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

接收数据帧

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



本文链接: http://www.dtmao.cc/news_show_300107.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?