Arduino字符串转ASCII十六进制字节数组函数实现求助
解决Arduino中字符串转ASCII十六进制字节数组的问题
嘿,我来帮你搞定这个需求!你的思路方向是对的,但在C语言和Arduino String类的使用上踩了几个小坑,咱们一步步理清楚:
先说说原代码里的问题
你写的代码里有几个关键错误,导致没法得到想要的结果:
- 多余的
char mensaje[message.length()];:这个数组完全没用到,而且定义时也没考虑C语言字符串末尾的\0(不过这里没用就无所谓,但建议删掉) - 致命错误:
final[i]= buf;——你这里把char数组的内存地址赋值给了uint16_t类型的变量,而不是字符对应的ASCII数值,这完全不是你想要的结果 - 绕远路的字符串转换:你把单个字符转成
"0xXX"格式的字符串再处理,其实完全没必要,因为char本身就是ASCII数值 - 局部数组的生命周期:
uint16_t final[30];是函数内部的局部变量,函数执行完就会被销毁,如果你想在函数外面用这个数组,根本拿不到
简化的修正代码
其实这个需求非常简单,因为char类型本质就是存储ASCII数值的8位整数,比如字符'A'的char值就是0x41,直接取出来赋值给数组就行:
void enviarMsj(const String& message) { // 用uint8_t足够,因为ASCII是0-127,单字节就够了 uint8_t final[30]; int msgLength = message.length(); // 防止数组越界,最多处理29个字符(或者根据你的需求调整数组大小) int processLength = min(msgLength, 29); for(int i = 0; i < processLength; i++){ // 直接取字符的ASCII值,强制转成uint8_t更严谨 final[i] = static_cast<uint8_t>(message.charAt(i)); // 可以打印验证结果,比如输入"AAA"会输出0x41三次 Serial.print("0x"); Serial.println(final[i], HEX); } // 这里添加你要发送这个数组的逻辑,比如用Serial.write发送: // Serial.write(final, processLength); }
如果需要把数组传递到函数外部
上面的代码里final是局部数组,函数结束就没了。如果要让调用者拿到结果,可以让调用者传入一个外部数组:
// 参数说明: // message:输入字符串 // output:存储结果的外部数组 // maxSize:output数组的最大容量 void enviarMsj(const String& message, uint8_t* output, int maxSize) { int msgLength = message.length(); int processLength = min(msgLength, maxSize); for(int i = 0; i < processLength; i++){ output[i] = static_cast<uint8_t>(message.charAt(i)); } // 如果你需要,可以返回实际处理的字符数 // return processLength; } // 调用示例: // uint8_t result[30]; // enviarMsj("AAA", result, 30); // 此时result里就是{0x41, 0x41, 0x41, ...}
关键知识点总结
- 不要把简单问题复杂化:char本身就是ASCII数值,不需要转成
"0xXX"字符串再解析 - 局部数组的局限性:函数内部定义的数组不能直接返回给外部,要么用外部传入的数组,要么用动态内存(Arduino里尽量少用动态内存,避免内存碎片)
- 类型匹配:ASCII值是单字节的,用
uint8_t(或者byte,Arduino里的别名)比uint16_t更合适,节省内存
内容的提问来源于stack exchange,提问作者Alejandro Castaño
相关产品推荐
相关产品推荐

