将USB串口数据解析为可用变量:Android与Arduino通信问询
嘿,这个需求我刚好做过类似的,分两种格式给你一步步说清楚哈:
从JSON格式数据中提取变量
如果Arduino发过来的是JSON格式的字符串,处理起来会比较省心,Android里有现成的工具可以用。
首先假设你的data字符串长这样:
{"vin": "1HGCR2F3XFA000001", "speed": 65.5, "runtime": 12345, "distance": 45678.9}
方法一:用Android自带的JSONObject
这是最基础的方式,不需要额外依赖:
try { JSONObject jsonObject = new JSONObject(data); // 提取各个字段,注意类型匹配 String vin = jsonObject.getString("vin"); double speed = jsonObject.getDouble("speed"); long runtime = jsonObject.getLong("runtime"); double distance = jsonObject.getDouble("distance"); // 这里就可以用这些变量做后续处理啦 Log.d("CarData", "VIN: " + vin + ", Speed: " + speed); } catch (JSONException e) { // 解析出错,大概率是Arduino发的JSON格式有问题 e.printStackTrace(); Log.e("ParseError", "JSON解析失败:" + e.getMessage()); }
方法二:用Gson库(更优雅)
如果项目里已经引入了Gson(现在很多Android项目都会用),可以先定义一个数据类:
public class CarData { public String vin; public double speed; public long runtime; public double distance; }
然后一行代码搞定解析:
Gson gson = new Gson(); CarData carData = gson.fromJson(data, CarData.class); // 直接用carData.vin、carData.speed就行
从XML格式数据中提取变量
如果是XML格式,就得用XML解析工具了,Android自带的XmlPullParser就很好用,轻量高效。
假设你的data字符串是这样的:
<carData> <vin>1HGCR2F3XFA000001</vin> <speed>65.5</speed> <runtime>12345</runtime> <distance>45678.9</distance> </carData>
用XmlPullParser的代码示例:
XmlPullParserFactory factory = null; XmlPullParser parser = null; String currentTag = ""; String vin = ""; double speed = 0.0; long runtime = 0; double distance = 0.0; try { factory = XmlPullParserFactory.newInstance(); parser = factory.newPullParser(); parser.setInput(new StringReader(data)); int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { if (eventType == XmlPullParser.START_TAG) { currentTag = parser.getName(); } else if (eventType == XmlPullParser.TEXT) { switch (currentTag) { case "vin": vin = parser.getText(); break; case "speed": speed = Double.parseDouble(parser.getText()); break; case "runtime": runtime = Long.parseLong(parser.getText()); break; case "distance": distance = Double.parseDouble(parser.getText()); break; } } eventType = parser.next(); } // 解析完成,使用变量 Log.d("CarData", "VIN: " + vin + ", Distance: " + distance); } catch (Exception e) { e.printStackTrace(); Log.e("ParseError", "XML解析失败:" + e.getMessage()); }
几个关键注意事项
- 一定要确保Arduino发送的JSON/XML是标准格式,比如JSON的引号、逗号不能少,XML的标签要闭合,不然解析肯定报错。
- 转换字节数组到字符串的时候,要指定正确的编码(比如
new String(data, "UTF-8")),避免乱码导致解析失败。 - 如果字段可能为空,记得加非空判断,比如用
jsonObject.optString("vin")代替getString,避免空指针异常。
内容的提问来源于stack exchange,提问作者Benjamin Brownlee
相关产品推荐
相关产品推荐

