RP2040+RD03E控制LED灯

[复制链接]
查看129 | 回复7 | 2024-4-14 22:33:00 | 显示全部楼层 |阅读模式

本帖最后由 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);

现象

image.png

[https://www.bilibili.com/video/BV1WE421T7rp?t=10.5]()

回复

使用道具 举报

1084504793 | 2024-4-15 08:08:26 | 显示全部楼层
回复

使用道具 举报

1055173307 | 2024-4-15 08:21:26 | 显示全部楼层
学习学习
回复

使用道具 举报

18350766600@139 | 2024-4-15 08:26:22 | 显示全部楼层
学习一下
回复

使用道具 举报

hdydy | 2024-4-15 09:02:21 | 显示全部楼层
学习学习
回复

使用道具 举报

WT_0213 | 2024-4-15 09:12:07 | 显示全部楼层
不错
回复

使用道具 举报

爱笑 | 2024-4-15 09:18:29 | 显示全部楼层
补考通过!
用心做好保姆工作
回复

使用道具 举报

lazy | 2024-4-15 10:49:10 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则