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

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至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);
    
  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6