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

C语言如何将char*数据转换为uint16_t数组适配Arduino sendRaw接口

实现方案

你可以通过分割字符串、逐段转换数字、动态分配内存的方式实现转换,完整可直接在ESP8266 Arduino环境运行的实现如下:

// 入参:message 是收到的char*格式的WebSocket消息
// 出参:*outLen 存储转换后的raw数组长度
// 返回值:动态分配的uint16_t数组指针,用完必须调用free()释放
uint16_t* convertMessageToRaw(const char* message, size_t* outLen) {
  // 第一步统计数字总个数:数换行符数量+1
  size_t count = 0;
  const char* p = message;
  while (*p != '\0') {
    if (*p == '\n') count++;
    p++;
  }
  count++;
  if (count == 0) {
    *outLen = 0;
    return NULL;
  }

  // 第二步分配对应长度的uint16_t数组
  uint16_t* rawData = (uint16_t*)malloc(count * sizeof(uint16_t));
  if (rawData == NULL) {
    *outLen = 0;
    return NULL;
  }

  // 第三步分割字符串逐段转数字
  char* tmpStr = strdup(message); // 复制原字符串避免strtok修改原消息内容
  if (tmpStr == NULL) {
    free(rawData);
    *outLen = 0;
    return NULL;
  }
  char* token = strtok(tmpStr, "\n");
  size_t index = 0;
  while (token != NULL && index < count) {
    rawData[index] = (uint16_t)atoi(token);
    index++;
    token = strtok(NULL, "\n");
  }
  free(tmpStr);
  *outLen = count;
  return rawData;
}

调用示例

char* messageFromWebSocket = "4692\n4408\n656\n358\n662\n356\n658\n376\n656\n358\n662\n1394\n660\n1392\n636\n378\n632\n382\n638\n1418";
size_t rawLen = 0;
uint16_t* rawData = convertMessageToRaw(messageFromWebSocket, &rawLen);
if (rawData != NULL && rawLen > 0) {
  // 第三个参数为红外载波频率,单位kHz,默认红外遥控多为38kHz,可根据实际协议调整
  irsend.sendRaw(rawData, rawLen, 38);
  // 用完必须释放内存,否则会出现内存泄漏导致设备重启
  free(rawData);
  rawData = NULL;
}

注意事项

  • 如果收到的WebSocket消息可能包含非数字、空行等异常内容,可在atoi转换前添加合法性校验,避免生成错误的红外信号
  • 不需要保留原WebSocket消息的情况下,可以去掉strdup复制字符串的步骤,直接传入原字符串到strtok减少内存占用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:15:03