Rd-03D串口协议-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
帧头部帧内数据帧尾部
AA FF 03 00目标 1 信息 目标 2 信息 目标 3 信息55 CC

其中单个目标具体包含的信息:

目标 x 坐标目标 y 坐标目标速度像素距离值
signed int16 类型最高位 1 对应正坐标0 对应负坐标其余 15 位代表 x 坐标绝对值单位 mmsigned int16 类型最高位 1 对应正坐标0 对应负坐标其余 15 位代表 y 坐标绝对值单位 mmsigned int16 类型最高位 1 对应正向速度0 对应负向速度其余 15 位代表速度绝对值单位cm/sUint16 类型单个像素距离值单位mm。

数据示例:AAFF0300 OE03 B186 1000 6801 00 00 00 00 00 00 00 00 00 00000000 00 00 00 55 CC

该组数据表示雷达跟踪到了一个目标即目标 1(示例中蓝色字段)目标2 和目标3(分别对应示例中的红色和黑色字段)不存在故其相应数据段为Ox00。模组将目标1 的数据转换为相关信息的过程展示如下:

目标 1x 坐标:OxOE+Ox03256= 782
0-782= -782 mm;
目标 1y 坐标:OxB1+Ox86
256 = 34481
34481-2^15= 1713 mm;
目标 1 速度:0x10 + OxO0 * 256= 16
0-16=-16 cm/s;
目标 1 距离分辨率:Ox68+Ox01*256= 360 mm。

前3个数字就是前6个字节都是2字节符号数但不是正常的符号数无法直接作为int16用很不合理需要特殊处理。而且浪费了-0这么一个有效数字。
这里提供一个转换函数为

int16_t parseData(uint8_t *data, int index) {
    # 移除符号位合并为一个数字
    int16_t x = (((uint8_t)(data[index] << 1)) << 7) | data[index + 1];
    // 加上符号位首位为1是正数首位为0是负数
    if (data[index] >> 7 == 0) {
        x = -x;
    }
    // printf(" %d , %02X, %02X", x, x, -x);
    return x;
}

距离计算勾股定理

float dd = powf(powf(x, 2) + powf(y, 2), 0.5f);
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6