上一篇讲了如何通过usb转ttl连接雷达板子并通过串口命令设置雷达板子的灵敏度等操作,这一篇来讲如何使用esp8266来获取雷达传过来的数据并控制板载led灯亮灭,并对需要的数据进行截取为下一篇显示到SSD1306的i2c协议的led屏幕上做准备。
首先需要一块esp8266开发板,看图可知有UART0和USRT1两个串口,UART1直接连接flash的只可以烧写程序,不可以发送数据。所以我们用UATR0也就是默认的串口来和电脑通信,进行数据发送和接收。然后还需要一个串口需要和雷达板进行通信,但是只有uart1了还不可以发送数据,这该咋办呢?


我们可以在库管理中搜索espsoftwareserial进行安装,这库可以把常规引脚模拟成串口引脚,如果以后项目上有串口资源不够的情况可以使用这个库模拟一下。

现在问题解决了可以连接开发板进行操作了。ttl串口连接开发板,然后再把雷达板和开发板连接,连线不清楚可以对照上面引脚图看一下。


连接完没问题就可以开始编写代码了,下面是实现代码,功能为实现雷达板信息传到esp8266,esp8266获取到信息后开始处理,获取v的值和str的值,并连同原始值一起传到电脑,如果有人时雷达out引脚输出低电平并点亮板载led。代码注释写的很详细,能力强的朋友可以跳过,能力弱一些的可以学习一下。
#include <SoftwareSerial.h>
// 定义软件串口的 RX 和 TX 引脚
#define MYPORT_RX 4
#define MYPORT_TX 5
//定义IO状态判断引脚,直接接到雷达out引脚设置led_iflag=1就可以实现有人灯亮无人灯灭了
#define M11_START 16
SoftwareSerial M11 (MYPORT_RX, MYPORT_TX);
void setup() {
// 启动硬件串口
Serial.begin(115200);
// 启动软件串口
M11.begin(115200);
}
void loop() {
// 从雷达模块读取数据并发送到8266
if (M11.available()) {
// 读取一行数据,直到遇到换行符'\n'
String data = M11.readStringUntil('\n');
//打印到串口监视器
Serial.println("data: "+data);
//定义v str
float v;
int str;
// 查找并提取 v 的值
/**
*************方法说明*************
*data.indexOf() 是 Arduino String 类中的一个成员函数,用于查找指定子字符串或字符在字符串中首次出现的位置。
*它返回的是子字符串或字符的起始索引(从0开始计数),如果未找到,则返回 -1。
*用法一 int index = data.indexOf(substring);参数可以是字符也可以是字符串
*用法二 int index = data.indexOf(substring, fromIndex);第一个参数一样可以是字符也可以是字符串;第二个参数是从该索引位置开始查找写整数。
*
*data.substring() 是 Arduino String 类中的一个成员函数,用于从字符串中提取子字符串。
*用法一 String Str = data.substring(from); 提取从指定索引 from 开始直到字符串末尾的所有字符。
*用法二 String Str = data.substring(from, to) 提取从索引 from 开始到(但不包括)索引 to 的所有字符。
*
*vStr.toFloat()将截取的值转换为float类型,不想转换v设置为String类型直接赋值也行。
*/
//例:v=1.0 km/h, str=2867
//获取到字符串v=的索引为0(开头就是)字符串v=的长度为2所以+2就是v的值的开始的索引
int vIndex = data.indexOf("v=") + 2;
//输出完 v的值后会有一个空格并且是第一个空格,直接获取空格的索引
int spaceIndex = data.indexOf(" ");
//然后对接受到的数据进行制定截取就获取到了v的值
String vStr = data.substring(vIndex, spaceIndex);
v = vStr.toFloat();
// 查找并提取 str 的值
int strIndex = data.indexOf("str=") + 4;
String strStr = data.substring(strIndex);
str = strStr.toInt();
// 打印结果到串口监视器
Serial.println("v: "+String(v));
Serial.println("str: "+String(str));
// 清除字符串对象以释放内存
data = String();
}
// 从8266接受数据发送到雷达模块
if (Serial.available()) {
M11.write(Serial.read());
}
}
下面是视频展示。

