目录
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