Arduino接收端:如何创建未知大小数组并存储筛选后的十六进制值
解决Arduino接收端动态存储符合条件的十六进制值问题
看起来你已经搞定了数据接收的部分,现在卡在了动态存储符合条件的元素上——毕竟事先不知道要存多少个,固定大小的数组肯定不够灵活。下面给你两种实用的方案,都是Arduino上常用的:
方案1:用std::vector(推荐,简单安全)
Arduino IDE从1.6版本开始支持C++标准模板库(STL),std::vector是专门用来处理动态大小数组的容器,它会自动帮你管理内存扩容,不用手动操心。
步骤:
- 首先在代码顶部引入头文件(如果你的IDE版本较新,可能已经默认支持,不用额外安装库):
#include <vector>
- 定义一个全局或局部的
vector,用来存符合条件的十六进制值(这里用uint8_t,因为十六进制值是单字节的):
std::vector<uint8_t> filteredValues;
- 修改你的接收循环,把符合条件的值添加进去:
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来动态调整数组大小,不过要注意内存泄漏的问题。
步骤:
- 定义全局变量(或者在函数内定义,记得要初始化):
uint8_t* filteredArray = nullptr; // 指向动态数组的指针 int storedCount = 0; // 已存储的元素数量 int arrayCapacity = 0; // 当前数组的容量(能存多少个元素)
- 修改接收循环,实现动态扩容和存储:
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
相关产品推荐
相关产品推荐

