基站主要 接收同步節點發來的同步信號,代碼里定義為S信息。 以及標簽節點發來的定位信號,代碼中定義為T信號。
代碼中使用中斷以及幀過濾功能,對模塊只接收自己關心設定好的信息,通過中斷告知上層,而不是長時間輪訓方式。
幀過濾參考博文:https://www.cnblogs.com/tuzhuke/p/10503052.html
如下為基站核心代碼:
1 使能接收中斷
dwt_setinterrupt(DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO /*| DWT_INT_RXPTO*/), 1);
2 接收信息並記錄自己的接收時間戳和 信息發送的時間戳
switch(msg_f->messageData[0]) { case 'S': //save seq //save rx timestamp last_rx_ts = get_rx_timestamp_u64();//獲取接收時間戳 // last_rx_ts =0x123456789A;測試數字 //對64位數據移位成兩個數字,用來液晶顯示 l8_timestamp = last_rx_ts&0xFF; h32_timestamp= last_rx_ts>>8; sprintf(lcd_display_str, "%08X%02X",h32_timestamp,l8_timestamp); OLED_ShowString(0,4,(uint8_t *)lcd_display_str); //toggle LED 指示接收成功 ledValue = ~ledValue; GPIO_WriteBit(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3, ledValue); //save delayed tx timestamp //獲取信息中Sync 節點的發送時間戳 //信息起始位置位2,分別在2 3 4 5 6 last_rx_ts=0; final_msg_get_ts(&msg_f->messageData[2],&last_rx_ts); //對64位數據移位成兩個數字,用來液晶顯示 l8_timestamp = last_rx_ts&0xFF; h32_timestamp= last_rx_ts>>8; sprintf(lcd_display_str, "%08X%02X",h32_timestamp,l8_timestamp); OLED_ShowString(0,6,(uint8_t *)lcd_display_str); break;
上述代碼只是簡單接收了同步節點發送來的時間信號,通過液晶顯示出來,與同步節點顯示對比,實際需要做的工作還有很多,總結如下
3 基站接收邏輯功能
除了上面部分,需要實現的邏輯
A. 由原理部分得知,需要接收到連續兩個同步信號以及中間的標簽定位信號 才能算一個完整的接收序列。
對於接收同步節點信號S來說,需要記錄前后兩次同步信號的sequence號,兩者只能差1,如果出現丟包,需要做丟棄處理
B 對於定位信號,同樣由原理部分,定位信號應該夾在同步信號之內,而且需要記錄定位信號的sequence。
C 當收到一個同步信號S后,開始接受序列啟動,下一個應該接收的信號是定位信號T,如果有,再下一個是其它節點的定位信號T。最后是同步信號S, 標記一個完整的接收序列,通過串口或者網口送給定位引擎。 同時需要將最后一個同步信號用作下一個序列的開始。