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

Arduino如何将服务器返回的十六进制字符串转为const unsigned char数组供点阵屏使用

结论

该需求完全可以实现。

原有代码错误原因
  • C++为编译型语言,const unsigned char 数组的初始化值必须为编译期可确定的常量,你尝试将运行时从服务器获取的动态字符串直接拼接赋值给const数组的写法不符合语法规则,无法正常运行。
  • drawBitmap 接口参数的const修饰仅代表接口内部不会修改传入的数组内容,你传入运行时生成的普通uint8_t类型数组也可正常调用,不需要强制使用const类型数组。
实现步骤
  1. 根据位图的宽高计算总字节数,提前开辟对应大小的uint8_t数组作为缓存
  2. 将服务器返回的逗号分隔十六进制字符串,按逗号、空格分割为单个十六进制文本片段
  3. 将每个十六进制文本片段转换为对应uint8_t数值,依次存入缓存数组
  4. 将填充完成的缓存数组传入drawBitmap接口即可完成显示
示例代码
// 十六进制字符串转uint8_t数组函数
// 参数:hexStr 输入的逗号分隔十六进制字符串;outBuf 输出缓存数组;bufLen 缓存数组总长度
// 返回值:解析是否成功
bool parseHexBmp(String hexStr, uint8_t* outBuf, int bufLen) {
  int writePos = 0;
  // 按逗号+空格分割字符串
  char* part = strtok((char*)hexStr.c_str(), ", ");
  while (part != nullptr && writePos < bufLen) {
    // 十六进制字符串转数值,自动适配带0x前缀和无前缀的格式
    outBuf[writePos++] = (uint8_t)strtol(part, nullptr, 16);
    part = strtok(nullptr, ", ");
  }
  // 校验解析后的字节数是否和预期一致
  return writePos == bufLen;
}

// 业务调用示例
void displayBmpFromServer(String serverBmpStr, int startX, int startY, int bmpWidth, int bmpHeight) {
  // 计算位图总字节数,1bit per pixel的位图计算公式为 宽度*高度/8,根据你实际位图色深调整
  int bmpTotalBytes = bmpWidth * bmpHeight / 8;
  // 开辟缓存,如果字节数较大建议改用malloc动态申请内存
  uint8_t bmpBuf[bmpTotalBytes];
  
  if (parseHexBmp(serverBmpStr, bmpBuf, bmpTotalBytes)) {
    // 解析成功,调用显示接口
    display.drawBitmap(bmpBuf, startX, startY, bmpWidth, bmpHeight, GxEPD_WHITE);
  }
}
注意事项
  • 提前确认位图的色深和总字节数,避免缓存大小不足导致数组越界
  • 如果位图尺寸较大,栈内存不足时可改用uint8_t* bmpBuf = (uint8_t*)malloc(bmpTotalBytes)申请堆内存,使用完成后调用free(bmpBuf)释放内存避免泄漏
  • 服务器返回的字符串如果有多余的首尾空格、换行符,建议先做trim处理后再传入解析函数,避免解析错误

内容的提问来源于stack exchange,提问作者Coder06

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:57:03