TDOA 之 基站接收数据

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

猜你喜欢

转载自www.cnblogs.com/tuzhuke/p/11689881.html
今日推荐