LoRa开发6:接收数据帧
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
您的留言或需求: