stm32F103C8T6标准库串口型雷达模块协议基础(RD03)

目录

1.任务描述

原本在多串口应用中,通过串口1模拟设备1,串口3模拟设备2,打开两个上位机,上位机1和上位机2分别与串口1和串口3通信建立连接。上位机1发送数据,通过串口1接收数据到C8T6,然后C8T6从串口3发送数据给上位机2,在上位机2可以查看由上位机1发送的数据,这个过程相当于由A设备发送数据,经过C8T6中转,再有设备B接收这么一个多串口通信过程。

同时也可以相反,由上位机2发送数据,串口3接收数据到C8T6,然后C8T6将接收到的数据通过串口1发送给上位机1,这个过程设备B发送数据,经过C8T6中转,再由设备A接收的一个过程。

整个过程是:

设备A发数据------->经过C8T6中转---------->设备2收数据查看

设备B发数据------->经过C8T6中专---------->设备1收数据查看

此次实验将设备2由原来的上位机替换成RD03雷达。

上位机是设备1--------->C8T6中转----------->设备2是RD03雷达

2.为什么需要中转(C8T6)

设备1连接的串口1(上位机),设备2连接串口3(RD03雷达模块)

串口1:     串口3:

PA9:发送   PB10:发送

PA10:接收   PB11:接收

当RD03检测到目标时候会通过PB10发送数据,数据内容比如是"ON,Range 23",意思是当前检测有目标,距离是23厘米。吧这个字符串通过数组保存起来,通过串口1,PA9发送给上位机,在上位机显示RD03雷达发送过来的数据。

但是如果有了C8T6作为中转的话,虽然RD03雷达发送的数据比如是"ON,Range 23",但是我通过中转的C8T6接收后,吧数据进行处理,比如它这个格式可以看到,第二行是ON,第三行是Range 23,我是不是可以将数据格式进行处理后,然后通过串口1的PA9发送。有了这个中转,我可以吧RD03数据接收过来后可以自己处理数据给数据加工,处理完后再发送,而不是说RD03发过来什么数据,我必须按照它发送过来的数据完完整整接收,我如果需要在RD03发送过来的数据进行格式修改呀,以及数据修改呀等等进行加工处理然后再通过串口1发送给上位机,这就是为什么需要C8T6中转。

3.数据处理

c 复制代码
/**
  * @brief  RD03串口 运行模式数据
  * @param  buffer:待处理的数据 size:元素的个数
  * @retval 无
  */
void RD03_Running_Handle(uint8_t* buffer, uint32_t size)
{
    char state0[] = "ON";
    char state1[] = "OFF";
    char symbol[] = "Range ";
    
    if (size < strlen("OFF"))
    {
        return;
    }
    if (strstr((char *)buffer, state0) != NULL)
    {
        char* temp = NULL;
        if ((temp = strstr((char *)buffer, symbol)) != NULL)
        {
            uint32_t range = atoi(temp + strlen(symbol));  //获取整数值
            printf("有人,距离:      %d cm\n", range);
        }
    }
    else if (strstr((char *)buffer, state1) != NULL)
    {
        printf("无人\n");
    }
}

buffer是存储了RD03雷达发送过来的数据,size是数组字符的个数

strstr("主串",""子串)

第一个参数是主串,第二个参数是子串,函数功能在主字符串中去寻找子字符串的位置,并且在主串中去返回子字符串起始地址

例如主字符串123abc,子字符串是abc

那么在主字符串123abc中,返回的是a的地址

如果字串在主串查找不到就返回NULL。

atoi()里面的参数是char类型字符串,将数字字符串转换成整数

例如字符串char* p = "123456789"

uint32_t range = atoi§ 最终range保存的是int类型的123456789

atoi函数例子

c 复制代码
#include <stdio.h>
#include <stdlib.h>  // atoi 函数依赖的头文件

int main()
{
    // 定义不同格式的数字字符串
    char str1[] = "12345";
    char str2[] = "-6789";
    char str3[] = "   42abc";  // 前导空格+数字+非数字
    char str4[] = "abc123";    // 非数字开头
    char str5[] = "";          // 空字符串

    // 调用 atoi 转换
    int num1 = atoi(str1);
    int num2 = atoi(str2);
    int num3 = atoi(str3);
    int num4 = atoi(str4);
    int num5 = atoi(str5);

    // 输出结果
    printf("str1 转换结果:%d\n", num1);  // 12345
    printf("str2 转换结果:%d\n", num2);  // -6789
    printf("str3 转换结果:%d\n", num3);  // 42(遇到'a'停止转换)
    printf("str4 转换结果:%d\n", num4);  // 0(无有效数字)
    printf("str5 转换结果:%d\n", num5);  // 0(空字符串)

    return 0;
}

这部分代码主要将保存的RD03发送的数据换成我自己想要的格式进行输出,对字符串处理的一些操作。

运行结果

最后通过任务函数去调用

c 复制代码
/**
  * @brief  RD03串口 任务
  * @param  无
  * @retval 无
  */
void RD03_Task(void)
{
    if (rd03_receive.read_flag)
    {
     //   USART_SenString(DEBUG_USARTX, "MCU已经接收Rd03雷达模块串口数据\n");
        RD03_Running_Handle(rd03_receive.buffer, rd03_receive.len);
        
        
        
        RD03_ReadBufferReset();
    }
    
}

RD03

RX引脚(接收)连接PB10(串口3发送)

ot1引脚(发送)连接PB11(串口3接收)

3V3连接3V电源

GND连接GND

相关推荐
集芯微电科技有限公司1 小时前
集芯微电科技推出5.5V/10A集成功率MOSFET降压DC/DC转换器
人工智能·科技·单片机·嵌入式硬件·神经网络·生成对抗网络
送外卖的工程师1 小时前
STM32智能家居语音系统(ASRPRO版)
stm32·单片机·嵌入式硬件
硅基手札1 小时前
SPI技术系列 13 · SPI 调试与排查
linux·运维·stm32·单片机·嵌入式硬件·bug
我不管我就要叫小猪1 小时前
stm32——CAN总线通信
stm32·单片机·嵌入式硬件
Yiran_G1 小时前
ZigBee通信正常,数据却是错的?嵌入式开发中的数据链路排查
网络·嵌入式硬件·物联网·智能家居
深圳老胡2 小时前
STM32C5A3ZG开发板:基于STM32CubeMX与VSCode的按键检测与LED闪烁实战
笔记·stm32·单片机·代码规范
像枫一样2 小时前
STM32串口轮询收发实战教程
arm开发·c++·stm32·单片机·嵌入式硬件·fpga开发·51单片机
糖糖单片机设计2 小时前
基于 STM32 的智能书桌控制系统
stm32·单片机·嵌入式硬件
逐步前行2 小时前
嵌入式图形库-LVGL v9.6-环境搭建(Windows+VSCode模拟)
单片机·嵌入式硬件