当前位置: 首页 > 工业电子产品 > 其他电子产品 > IoT物联网 > IoT传感器

类型分类:
科普知识
数据分类:
IoT传感器

LoRa开发6:接收数据帧

发布日期:2022-05-25 点击率:38

干扰或信号微弱等,接收可能会出错;甚至,当多次接收错误后,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)

{

bool    bframeOK;                                                                                                            1

RF_frame_RAND_DATA    *p_stframeData;

staticint32_t    s_lRxRandCnt = 0;

 

PROCESS_BEGIN();                                                                                                       2

InitSetLoRa();                                                                                                                   3

SX1278Receive(0);                                                      4

while(1)

{

PROCESS_YIELD();                                                     5

bframeOK = FALSE;

if (RF_Rx_Done == s_tRFResult)                                                                                   6

{

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. ”,

s_lRxRandCnt, s_chPacketSnr, s_nPacketRssi );                         9

}

}

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

阅读更多: LoRa实验室, LoRa物联网技术实战

参考分类:

上一篇: LoRa开发5:发送随机数据

下一篇: LoRa开发7:PingPong系统

下一篇: PLC、DCS、FCS三大控

上一篇: LoRa开发7:PingPong

推荐产品

更多