本帖最后由 xu@xupt 于 2024-4-14 22:41 编辑
本帖最后由 xu@xupt 于 2024-4-14 22:40 编辑
本帖最后由 xu@xupt 于 2024-4-14 22:37 编辑
首先,感谢以下大神:
https://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=44318&extra=page%3D1
元件清单
- RP2040-pico
- RD03E
- Arduino
代码
// 定义一个名为FrameState的枚举类型,用于表示数据帧的接收状态
enum FrameState {
IDLE, // 空闲状态,等待接收新的数据帧
RECEIVING, // 正在接收数据帧
COMPLETE // 数据帧接收完成
};
void setup() {
// 设置串口1的RX引脚为1,TX引脚为0
Serial1.setRX(1);
Serial1.setTX(0);
// 初始化串口1,波特率为256000
Serial1.begin(256000);
// 初始化串口,波特率为9600
Serial.begin(9600);
// 设置内置LED引脚为输出模式
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
// 如果串口1有可用数据
if (Serial1.available() > 0) {
// 读取一个字节的数据
byte incomingByte = Serial1.read();
// 定义一个静态变量state,用于保存数据帧的接收状态,初始状态为IDLE
static FrameState state = IDLE;
// 定义一个静态数组frame,用于保存接收到的数据帧,最大长度为5
static byte frame[5];
// 定义一个静态变量frameIndex,用于记录当前接收到的数据帧字节数,初始值为0
static byte frameIndex = 0;
// 根据当前的接收状态进行不同的处理
switch (state) {
case IDLE:
// 如果接收到的字节是0xAA,表示一个新的数据帧开始
if (incomingByte == 0xAA) {
// 将接收状态切换为RECEIVING
state = RECEIVING;
// 重置frameIndex为0
frameIndex = 0;
// 将接收到的字节保存到frame数组中,并将frameIndex加1
frame[frameIndex++] = incomingByte;
}
break;
case RECEIVING:
// 如果frameIndex小于5,表示数据帧还未接收完成
if (frameIndex < 5) {
// 将接收到的字节保存到frame数组中,并将frameIndex加1
frame[frameIndex++] = incomingByte;
// 如果frameIndex等于5,并且最后一个字节是0x55,表示数据帧接收完成
if (frameIndex == 5 && frame[frameIndex - 1] == 0x55) {
// 将接收状态切换为COMPLETE
state = COMPLETE;
}
} else {
// 如果frameIndex大于等于5,表示接收到的数据帧长度超过了预期,将接收状态切换为IDLE
state = IDLE;
}
break;
case COMPLETE:
// 输出接收到的完整数据帧,以十六进制格式打印每个字节
Serial.print(frame[0], HEX);
Serial.print(frame[1], HEX);
Serial.print(frame[2], HEX);
Serial.print(frame[3], HEX);
Serial.println(frame[4], HEX);
// 调用processDataFrame函数处理接收到的数据帧
processDataFrame(frame);
// 将接收状态切换为IDLE,准备接收下一个数据帧
state = IDLE;
break;
}
}
}
void processDataFrame(byte* frame) {
// 解析数据帧
// 由于distance是小端字节序,我们直接组合两个字节 55 00 转存为 00 55
// 将第1个和第2个字节组合成一个16位的整数,表示距离值
int distance = frame[1] | (frame[2] << 8);
// 第4个字节表示手势信息
byte gesture = frame[3];
// 如果距离大于等于150
if (distance >= 150) {
// 点亮内置LED
digitalWrite(LED_BUILTIN, HIGH);
} else {
// 熄灭内置LED
digitalWrite(LED_BUILTIN, LOW);
}
// 输出解析后的数据
Serial.print("Received data frame: Distance = ");
Serial.print(distance);
Serial.print(" cm, Gesture = ");
Serial.println(gesture, HEX);
现象
[https://www.bilibili.com/video/BV1WE421T7rp?t=10.5]()