刷脸支付 Scala java反射机制 map遍历 mfc delphi asynchronous text loam算法测试 flexbox get jtable sms 后台管理模板下载 arduino程序 mysql安装后怎么使用 增删改查sql语句 idea整理代码格式 linux获取当前时间 python使用教程 python代码示例 python开发界面 python函数的调用 python的开发工具 java重载和重写的区别 linux系统如何安装 马赛克软件 bat脚本 修改tomcat端口 ipad锁屏 免费书籍 dota改键工具 ram容量是什么意思 excel应用大全 司司网吧 奥法隐藏外观 eagle软件 asp编程 4k对齐是什么意思 画图3d
当前位置: 首页 > 学习教程  > 

LoRa开发5:发送随机数据

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

发送随机数据 1 引言 学习需要循序渐进,做开发也不例外。在LoRa终端开发中,最简单的代码是通过SX1278发送数据帧。因此,我们先从发送开始,了解初始化SX1278和建立Contiki进程的入门知识。 2 整体逻辑流程 发送数据帧的整体逻辑流…

发送随机数据

1 引言

学习需要循序渐进,做开发也不例外。在LoRa终端开发中,最简单的代码是通过SX1278发送数据帧。因此,我们先从发送开始,了解初始化SX1278和建立Contiki进程的入门知识。

2 整体逻辑流程

发送数据帧的整体逻辑流程如下所示,很明显,进程是一个无限循环:生成随机数据帧-> 发送 -> 生成随机数据帧 ->…

  

3 初始化SX1278

初始化SX1278的代码清单如下,它主要完成射频参数的配置。

static void InitSetLoRa(void)

{

   SX1278Init(&s_stRFEvents);                                                   1

   SX1278SetFreq(RADIO_FREQ);                                             2

   SX1278SetPAOutput(PA_OUTPUT_PIN_BOOST);                3

   SX1278SetTxPower(20);                                                          4

   SX1278SetPreambleLen(6);                                                     5

   SX1278SetLowDatarateOptimize(FALSE);                               6

   SX1278SetFixLen(FALSE);                                                       7

   SX1278SetCrcOn(TRUE);                                                         8

   SX1278SetRxContinuous(TRUE);                                             9

   SX1278SetBandwidth(RF_BW_500000);                                10

   SX1278SetSpreadingFactor(RF_SF_7);                                  11

   SX1278SetCodingRate(RF_FEC_4_5);                                   12

   SX1278SetLoRaSettings();                                                      13

   SX1278SetTxTimeout(SX1278GetTimeOnAir(255) + 10);       14

   return;

}

Line#1:传递一个回调函数指针数组给SX1278驱动,这样一来,当射频中断发生时,

               可以让调用者执行必需的动作 (一般用于给进程发消息)。该原理的解释,

               请链接:http://blog.csdn.net/jiangjunjie_2005/article/details/52798757

Line#2:设置频率为470MHz;

Line#3:使用PA(Power Amplifier,功率放大器)引脚输出;

Line#4:设置发射功率为最大值20dBm;

Line#5:设置preamble(前导码,用于接收同步)长度为6,根据我们多年的测试经验,

               6是最小值,低于该值将会导致接收误码率上升;

Line#6:关闭低速率优化功能:当symbol驻空时间超过16ms时,打开此选项可以提高

              LoRa链路健壮性。注意:发送和接收双方必须设置一致!

Line#7:允许发射数据帧长度可变;

Line#8:使能SX1278对接收数据帧payload进行CRC16校验;

Line#9:使能持续接收;

Line#10:设置BW为500kHz;

Line#11:设置扩频因子为7,即1symbol(每bit用户payload),LoRa扩频到

                 2^7=128 chip(实际发射信号);

Line#12:设置前向纠错码,每发送4symbol,添加1symbol纠错码;

Line#13:将设置参数写入SX1278寄存器(批量操作提高效率);

Line#14:设置发送超时为最大值(使用MCU定时器避免SX1278发送宕机);

4 进程时序

t0时刻:进程生成随机数据帧,并发送;

t1时刻:SX1278启动发送;

t2时刻:SX1278发送完毕,中断服务程序poll进程;

t3时刻:进程打印发送次数,再次生成随机数据帧和发送;


5 代码剖析

PROCESS_THREAD(TxRandData, ev, data)

{

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

  RF_FRAME_RAND_DATA    *p_stFrameData;                                                            1

  staticint32_t    s_lTxRandCnt = 0;

  PROCESS_BEGIN();                                                                                                    2

  InitSetLoRa();                                                                                                                3

  while(1)                                                                                                                         4

  {

    /* Makethe frame of random data, TX it. */

    p_stFrameData= (RF_FRAME_RAND_DATA *)s_abyTxRFBuf;

    MakeRandData(p_stFrameData->a_byBuf, sizeof(p_stFrameData->a_byBuf));        5

    p_stFrameData->wCRC16= util_CRC16( p_stFrameData,

        GET_ST_FLD_OFFSET(RF_FRAME_RAND_DATA, wCRC16));                         6

    SX1278Send(s_abyTxRFBuf, sizeof(RF_FRAME_RAND_DATA));                            7


    /* Block process until Tx Done or timeout. */

    PROCESS_YIELD_UNTIL( (RF_Tx_Done == s_tRFResult) ||

                                                 (RF_Tx_Timeout == s_tRFResult) );                              8

    ++s_lTxRandCnt;

    RIME_DBG(RIME_DBG_ON, "Tx Rand Cnt=%ld\r\n", s_lTxRandCnt);                      9

  }

  PROCESS_END();                                                                                                        10

}

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;

Line#4:一般而言,进程都是无限循环;

Line#5:生成随机数据;

Line#6:计算CRC16,宏GET_ST_FLD_OFFSET()用于取结构体中域的偏移;

Line#7:发送随机数据帧;

Line#8:阻塞进程,直到发送数据帧结束或超时;

Line#9:打印总发送次数,RIME_DBG()的原理和使用,请链接:

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

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

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



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

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?