發布日期:2022-05-25 點擊率:27
線數據包外,還需要驅動射頻和響應多種中斷信號。為此,我們列出該進程的邏輯,并且剖析它的代碼。
有2個特別注意的地方:
1. 如果RF_Rx_Error,需要重新啟動RF接收功能,以避免引發宕機錯誤;
2. RF緩沖區中有多個數據包時,給自身發poll消息,讓其他進程有機會運行。
PROCESS_THREAD(NetworkProcess, ev, data)
{
uint8_t byDataSize;
uint16_t wCalcCRC16;
uint16_t wSrcCRC16;
PROCESS_BEGIN();
SX1278Receive(0);
while(TRUE)
{
PROCESS_YIELD();
if (NETWORK_EVENT_TX_RF_PACKAGE == ev) 1
{
wCalcCRC16= util_CRC16( s_stTxRFPackage.a_byBuf,
s_stTxRFPackage.byRFTxSize );
*(uint16_t *)&s_stTxRFPackage.a_byBuf[s_stTxRFPackage.byRFTxSize] =
wCalcCRC16;
SX1278SetSleep(); 2
SX1278Send( s_stTxRFPackage.a_byBuf,
s_stTxRFPackage.byRFTxSize +sizeof(uint16_t)); 3
PROCESS_YIELD_UNTIL( RF_Tx_Done == s_tRFResult ||
RF_Tx_Timeout ==s_tRFResult ); 4
SX1278Receive(0); 5
}
else 6
{
if (RF_Rx_Error == s_tRFResult)
{
SX1278SetSleep(); 7
SX1278Receive(0);
}
if (!IsRadioBufEmpty())
{
s_stParseRFBuf.bySize = GetRadioBuf(s_stParseRFBuf.a_byBuf,RF_FIFO_SIZE); 8
if (sizeof(uint16_t) < s_stParseRFBuf.bySize)
{
byDataSize = s_stParseRFBuf.bySize – sizeof(uint16_t);
wSrcCRC16 = *(uint16_t *)&s_stParseRFBuf.a_byBuf[byDataSize];
wCalcCRC16 = util_CRC16(s_stParseRFBuf.a_byBuf, byDataSize);
if (wSrcCRC16 == wCalcCRC16) 9
{
comm2trm_RxRFPackage(s_stParseRFBuf.a_byBuf, byDataSize); 10
}
else
{
SX1278SetSleep(); 11
SX1278Receive(0);
}
}
if (!IsRadioBufEmpty()) 12
{
process_poll(&NetworkProcess);
}
}
}
}
PROCESS_END();
}
Line#1:用戶需要發送RF數據包;
Line#2:將處于持續接收的RF設置休眠狀態;
Line#3:通過SX1278發送該RF數據包;
Line#4:阻塞進程,直到RF發送數據包完畢;
Line#5:將RF切換到持續接收模式;
Line#6:射頻中斷服務程序發來消息:接收到數據包,或,接收錯誤;
Line#7:RF接收出錯,重新啟動RF接收功能,避免宕機錯誤;
Line#8:從RF緩沖區復制數據包到解析工作區;
Line#9:檢查接收數據包的CRC16是否正確;
Line#10:交付接收數據給Comm2Trm進程;
Line#11:如果數據包的CRC16錯誤,重新啟動RF接收功能,避免宕機錯誤;
Line#12:如果RF緩沖區還有數據包,給自身發poll消息,允許Contiki調度其他進程運行。
下一篇: PLC、DCS、FCS三大控
上一篇: NB-IoT和LoRa使用頻譜