You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino接收端:如何创建未知大小数组并存储筛选后的十六进制值

解决Arduino接收端动态存储符合条件的十六进制值问题

看起来你已经搞定了数据接收的部分,现在卡在了动态存储符合条件的元素上——毕竟事先不知道要存多少个,固定大小的数组肯定不够灵活。下面给你两种实用的方案,都是Arduino上常用的:


方案1:用std::vector(推荐,简单安全)

Arduino IDE从1.6版本开始支持C++标准模板库(STL),std::vector是专门用来处理动态大小数组的容器,它会自动帮你管理内存扩容,不用手动操心。

步骤:

  1. 首先在代码顶部引入头文件(如果你的IDE版本较新,可能已经默认支持,不用额外安装库):
#include <vector>
  1. 定义一个全局或局部的vector,用来存符合条件的十六进制值(这里用uint8_t,因为十六进制值是单字节的):
std::vector<uint8_t> filteredValues;
  1. 修改你的接收循环,把符合条件的值添加进去:
for (int i = 0; i < len; i++) {
  if (receivedValue[i] == 0x60) {
    // 直接把值添加到vector末尾,自动扩容
    filteredValues.push_back(receivedValue[i]);
    
    // 可选:同步打印确认存储成功
    Serial.print("已存储值: 0x");
    Serial.println(filteredValues.back(), HEX);
  }
}

后续操作:

  • 查看存储的元素数量:filteredValues.size()
  • 访问第n个元素(从0开始):filteredValues[n]
  • 清空所有元素:filteredValues.clear()
  • 遍历所有存储的值:
for (int j = 0; j < filteredValues.size(); j++) {
  Serial.print("第");
  Serial.print(j+1);
  Serial.print("个存储值: 0x");
  Serial.println(filteredValues[j], HEX);
}

方案2:手动动态分配内存(适合不想用STL的场景)

如果你更倾向于手动管理内存,可以用malloc/realloc来动态调整数组大小,不过要注意内存泄漏的问题。

步骤:

  1. 定义全局变量(或者在函数内定义,记得要初始化):
uint8_t* filteredArray = nullptr; // 指向动态数组的指针
int storedCount = 0; // 已存储的元素数量
int arrayCapacity = 0; // 当前数组的容量(能存多少个元素)
  1. 修改接收循环,实现动态扩容和存储:
for (int i = 0; i < len; i++) {
  if (receivedValue[i] == 0x60) {
    // 如果当前数组已满,扩容(这里每次增加5个位置,你可以按需调整)
    if (storedCount >= arrayCapacity) {
      int newCapacity = arrayCapacity + 5;
      // 重新分配内存
      uint8_t* tempPtr = (uint8_t*)realloc(filteredArray, newCapacity * sizeof(uint8_t));
      
      // 检查内存分配是否成功
      if (tempPtr == nullptr) {
        Serial.println("内存分配失败!");
        return;
      }
      filteredArray = tempPtr;
      arrayCapacity = newCapacity;
    }
    
    // 存储当前符合条件的值
    filteredArray[storedCount] = receivedValue[i];
    storedCount++;
    
    // 可选:同步打印确认
    Serial.print("已存储值: 0x");
    Serial.println(filteredArray[storedCount-1], HEX);
  }
}

注意事项:

  • 当你不再需要这个动态数组时,一定要释放内存,避免内存泄漏:
free(filteredArray);
filteredArray = nullptr; // 避免野指针
storedCount = 0;
arrayCapacity = 0;
  • 扩容的步长可以根据你的实际需求调整,比如每次翻倍(newCapacity = arrayCapacity * 2),这样能减少扩容的次数,提升效率。

额外提示

  • 确保receivedValue是正确的接收缓冲区,len是实际接收到的字节数(比如用Serial.readBytes()返回的长度)。
  • 同步存储的需求已经满足:每次检测到符合条件的值就立即添加到容器/数组中,和接收过程同步。

内容的提问来源于stack exchange,提问作者S. Jamal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:08:47