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

ESP NOW接收端获取的int值与发送端不符问题求助

问题分析

你遇到的核心问题是发送端错误地将int类型的模拟值转换成字符串(ASCII)存入结构体,而非直接存储二进制int值,导致接收端拿到的是数字字符的ASCII码,而非原始整数。

修正方案

1. 统一结构体定义(发送/接收端必须完全一致)

结构体要明确使用int类型成员,避免字符串相关的错误存储:

typedef struct struct_message {
  int analogValue; // 直接用int存储模拟读取值
} struct_message;

struct_message myData; // 发送端用这个变量存数据

2. 发送端正确赋值

直接将analogRead的结果赋值给结构体的int成员,不要做任何字符串转换:

// 错误示例:不要用itoa、String转换后存储(会存ASCII码)
// myData.analogValue = String(analogRead(A0)).c_str();

// 正确操作:直接赋值int类型的原始值
myData.analogValue = analogRead(A0);

3. 接收端正确解析数据

在接收回调里,直接将字节流转为结构体,然后打印int成员即可:

void OnDataRecv(const uint8_t * mac_addr, const uint8_t *incomingData, int len) {
  struct_message receivedData;
  memcpy(&receivedData, incomingData, sizeof(receivedData));
  
  // 直接打印int值,不要把数据当成字符数组处理
  Serial.print("收到模拟值:");
  Serial.println(receivedData.analogValue);
  Serial.print("数据字节数:");
  Serial.println(len); // 正常应为4字节(ESP8266的int占4字节)
}

关键注意事项

  • 发送、接收两端的结构体必须完全匹配(成员类型、顺序、大小一致),否则会出现解析乱码。
  • ESP-NOW传输的是二进制字节流,不是字符串,无需对int做任何字符串转换操作。
  • 你看到的4字节长度是正常的,因为ESP8266的int类型占用4字节内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:52:38