如何将ESP8266发送的MPU陀螺仪字节数组转为整数?
解决ESP8266通过MQTT发送MPU数据时的字节数组转数值问题
看起来你这里的核心问题出在对myResultAcc的处理上——你直接把这个MPU加速度结果对象传给了sprintf,而不是提取里面的实际数值,导致发送的是无效的字符串内容,JS那边收到的自然是这些错误字符串对应的字节数组。
问题根源分析
你之前的代码里:
sprintf(str, "%d", myResultAcc);
myResultAcc是一个MPU加速度结果的类实例(比如包含x/y/z轴数据的对象),不是单个整数。当你把它传给%d格式符时,sprintf会把对象的内存地址转换成十进制数字,输出成字符串。比如如果地址对应的十进制是32,那字符串就是"32",对应的ASCII字节就是51('3')和50('2')——这就是你在JS控制台看到Buffer [51, 50]的原因,完全不是你想要的加速度数值。
修正方案
首先要明确:myResultAcc内部应该包含x、y、z三个轴的具体加速度数值(比如成员变量ax、ay、az,具体名称取决于你使用的MPU9250库),你需要提取这些数值再格式化发送。
方案1:发送单个轴的数值(比如x轴)
修改代码提取具体轴的数值,再格式化字符串:
if (myMPU.readByte(MPU9250_ADDRESS, INT_STATUS) & 0x01) { myMPU.readAccelData(&myResultAcc); } myMPU.updateTime(); // 提取x轴加速度的具体数值(假设ax是int16_t类型的成员变量) int16_t accelX = myResultAcc.ax; char str[12]; sprintf(str, "%d", accelX); Serial.println(str); client.publish("esp/gyro", str); Serial.println(); delay(600);
方案2:发送所有轴的JSON格式数据(更推荐)
如果想一次性发送x/y/z三个轴的数据,用JSON格式会更方便JS端解析:
// 先安装ArduinoJson库 #include <ArduinoJson.h> if (myMPU.readByte(MPU9250_ADDRESS, INT_STATUS) & 0x01) { myMPU.readAccelData(&myResultAcc); } myMPU.updateTime(); // 创建JSON文档并填充数据 StaticJsonDocument<128> doc; doc["ax"] = myResultAcc.ax; doc["ay"] = myResultAcc.ay; doc["az"] = myResultAcc.az; // 把JSON转换成字符串 char str[128]; serializeJson(doc, str); Serial.println(str); client.publish("esp/gyro", str); Serial.println(); delay(600);
JS端解析数据
- 如果用方案1,收到字符串后直接转数字即可:
client.onMessageArrived = function(topic, message) { const accelValue = parseInt(message.payloadString); console.log("加速度值:", accelValue); };
- 如果用方案2,直接解析JSON:
client.onMessageArrived = function(topic, message) { const accelData = JSON.parse(message.payloadString); console.log("X轴加速度:", accelData.ax); console.log("Y轴加速度:", accelData.ay); console.log("Z轴加速度:", accelData.az); };
内容的提问来源于stack exchange,提问作者Lennard
相关产品推荐
相关产品推荐

