基站主要 接收同步节点发来的同步信号,代码里定义为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, 标记一个完整的接收序列,通过串口或者网口送给定位引擎。 同时需要将最后一个同步信号用作下一个序列的开始。