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
相关产品推荐
相关产品推荐

