intellij idea下载 idea离线安装 JAVA学习 电力杆 正则表达式 centos7 object safari xsd progressjs vue开发文档 bootstrap管理模板 后台管理界面 jquery遍历子元素 ubuntu显示隐藏文件夹 docker保存镜像 mysql配置远程连接 python学习 郑州普通话 python的random函数 python命令 python支持中文 python位操作 java数据库 java输出数组 java实现队列 java判断文件是否存在 java创建目录 java怎么输出数组 java中long java多线程编程 linux系统命令大全 linux格式化命令 ip隐藏 mounted python队列 pdf拆分工具 vfloppy fdisk下载 混沌世界隐藏英雄密码
当前位置: 首页 > 学习教程  > 

LoRa开发7:PingPong系统

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

PingPong系统 1 引言 前2章介绍了SX1278的发送和接收,在此基础上,我们设计一个有趣的PingPong系统,更好地理解LoRa终端的收发逻辑。 该系统将LoRa终端自动定义成2种角色:master和slave。master主动发送ping数据帧,接收…

PingPong系统

1 引言

前2章介绍了SX1278的发送和接收,在此基础上,我们设计一个有趣的PingPong系统,更好地理解LoRa终端的收发逻辑。

该系统将LoRa终端自动定义成2种角色:master和slave。master主动发送ping数据帧,接收pong数据帧;slave如果接收到ping数据帧,回应pong数据帧。

2 整体逻辑流程


如上图所示,当LoRa终端上电后,在(2 * PingPongPeriod)周期内没有接收到ping数据帧,它就认为自己是master。Master节点每隔(1 * PingPongPeriod)周期主动发送ping数据帧,然后启动RF接收,可能接收到pong回应帧(正常通信),也可能接收超时(slave没有上电或通信失败)。


同理,当LoRa终端上电后,在(2 * PingPongPeriod)周期内接收到ping数据帧,它就认为自己是slave。Slave节点启动RF接收,如果接收到ping数据帧,它将发送pong回应帧。

一个节点从上电,判断自身角色,根据角色处理逻辑,如下流程图所示。


3 代码剖析

PROCESS_THREAD(PingPong, ev, data)

{

  #definePING    "ping, this is MASTER ofrime node."

  #definePONG    "pong, this is SLAVE of rimenode."

  #definePING_SIZE    34

  #definePONG_SIZE    33

 

  staticbool    s_bIsMaster;

  staticuint16_t    s_wPingPongPeriod;

  staticint32_t    s_lTxCnt = 0;

  staticint32_t    s_lRxCnt = 0;

  

  PROCESS_BEGIN();

 

  InitSetLoRa();

  s_wPingPongPeriod =

  SX1278GetTimeOnAir(4) + SX1278GetTimeOnAir(4) + 15;                   1

 

  /*Determine MASTER or SLAVE by RX "ping". */

  SX1278Receive(2 * s_wPingPongPeriod);                                              2

  PROCESS_YIELD(); /* Yield until receive or timeout. */                          3

  SX1278SetSleep(); /* MUST stop RxContinuous mode manually. */       4

 

  if(GetCompareRxFrame(PING, PING_SIZE))                                           5

  {

    s_bIsMaster = FALSE;

  }

  else

  {

    s_bIsMaster = TRUE;

  }

 

  if(s_bIsMaster) /* Is MASTER */

  {

    while (1)

    {

      /* TX "ping" */

      ++s_lTxCnt;

      SX1278Send(PING, PING_SIZE);                                                          6

      PROCESS_YIELD_UNTIL( (RF_Tx_Done == s_tRFResult) || 

                                                   (RF_Tx_Timeout ==s_tRFResult) );          7

 

      /* RX "pong" */

      SX1278Receive(s_wPingPongPeriod);                                                  8

      PROCESS_YIELD(); /* Yield until receive a frame or timeout. */

      SX1278SetSleep(); /* MUST stop RxContinuous mode manually. */

 

      if (GetCompareRxFrame(PONG, PONG_SIZE))                                    9

      {

        ++s_lRxCnt;

        RIME_DBG( RIME_DBG_ON,  

                             "TxCnt=%ld, Rx Cnt=%ld, SNR=%d, RSSI=%d.\r\n",

                             s_lTxCnt, s_lRxCnt, s_chPacketSnr,s_nPacketRssi );   10

      }

    }

  }

 else /* Is SLAVE */

  {

    while (1)

    {

      /* RX "ping" */

      SX1278Receive(0);                                                                                  11

      PROCESS_YIELD(); /* Yield until receive a frame or rx error. */

      SX1278SetSleep(); /* MUST stop RxContinuous mode manually. */

      if (GetCompareRxFrame(PING, PING_SIZE))                                          12

      {

        /* TX "pong" */

        ++s_lTxCnt;

        SX1278Send(PONG, PONG_SIZE);                                                      13

        PROCESS_YIELD_UNTIL( (RF_Tx_Done ==s_tRFResult) || 

                                                     (RF_Tx_Timeout == s_tRFResult) );         14

 

        ++s_lRxCnt;

        RIME_DBG( RIME_DBG_ON,

                             "Tx Cnt=%ld, RxCnt=%ld, SNR=%d, RSSI=%d.\r\n",

                             s_lTxCnt, s_lRxCnt,s_chPacketSnr, s_nPacketRssi ); 

      }

    }

  }

  PROCESS_END();

}

Line#1:计算PingPong通信空中时间,添加15ms做为收发准备时间;

Line#2:启动接收功能,超时时长为2倍PingPong通信空中时间;

Line#3:阻塞进程,直到接收数据帧或超时;

Line#4:设置SX1278为休眠,否则它将处于持续接收状态(那怕超时亦如此);

Line#5:GetCompareRxFrame()复制数据帧到解析工作区,比较是否为ping帧;

 

Master节点逻辑

Line#6:master节点发送ping数据帧;

Line#7:阻塞进程,直到发送ping数据帧完毕;

Line#8:启动接收功能,超时时长为PingPong通信空中时间;

Line#9:比较是否为pong回应帧;

Line#10:打印发送和接收数据帧个数,SNR和RSSI值;

 

Slave节点逻辑

Line#11:启动持续接收功能,为0表明关闭超时功能;

Line#12:比较是否为ping数据帧;

Line#13:slave节点发送pong回应帧;

Line#14:阻塞进程,直到发送pong回应帧完毕;



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

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?