首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >串口中的字符串数据不能被解析为JSON

串口中的字符串数据不能被解析为JSON
EN

Stack Overflow用户
提问于 2018-03-08 05:59:33
回答 1查看 198关注 0票数 0

我正在构建一个可以在车辆ECU、Arduino和Android设备之间进行通信的设备。最终的目标是从汽车到用户的手机获取信息。

我现在有以下Arduino代码,它通过OBD-II端口收集车辆数据,并以JSON的形式发送串行数据:

代码语言:javascript
运行
复制
#include <Wire.h>
#include <OBD.h>

COBDI2C obd;

char vin[64];
int distance;
int velocity;
int runtime;

String json;

void setup() {
  Serial.begin(9600);
  obd.begin();
  while(!obd.init());
}

void loop() {
  obd.getVIN(vin, sizeof(vin));
  delay(100);
  obd.readPID(PID_DISTANCE, distance);
  delay(100);
  obd.readPID(PID_SPEED, velocity);
  delay(100);
  obd.readPID(PID_RUNTIME, runtime);
  delay(100);

  json = "{\"vin\":\"";
  json.concat(vin);
  json.concat("\",\"distance\":\"");
  json.concat(distance);
  json.concat("\",\"speed\":\"");
  json.concat(velocity);
  json.concat("\",\"runtime\":\"");
  json.concat(runtime);
  json.concat("\"}");

  Serial.print(json);
  delay(5000);
}

这将在与安卓设备的USB连接上打印一个字符串(如"{\"vin\":\"3VWJM71K89M02\",\"distance\": \"19478\",\"speed\":\"0\",\"runtime\":\"216\"}" )。当USB活动发生时,我有一个在Android设备上调用的方法:

代码语言:javascript
运行
复制
public void onReceivedData(byte[] result) {
     String dataStr;
     try {
         dataStr = new String(result, "UTF-8");
         dataStr = dataStr.replaceAll("[\\n\\r\\s]+", "");
     } catch (UnsupportedEncodingException e) {
         e.printStackTrace();
     }
     try {
         driveData = new JSONObject(dataStr);
         updateVehicle(driveData);
     } catch(JSONException e) {
         e.printStackTrace();
     }
}

由于某些原因,可以将产生的字节数组转换为没有错误的字符串,但奇怪的是使用随机换行和空格填充,这就是我使用replaceAll()删除这些字符串的原因。当我尝试从字符串(使用JSONObject库)创建一个org.json时,我会得到错误。但是,当我将原始字符串附加到textView时,我得到了一些看起来非常有效的JSON:

代码语言:javascript
运行
复制
{"vin":"3VWJM71K89M02","distance":"19478","speed":"0","runtime":"216"}

接下来,我尝试使用前面在Arduino上构造的确切字符串构建一个JSONObject,如下所示:

代码语言:javascript
运行
复制
 try {
     driveData = new JSONObject("{\"vin\":\"3VWJM71K89M02\",\"distance\": \"19478\",\"speed\":\"0\",\"runtime\":\"216\"}");
     updateVehicle(driveData);
 } catch(JSONException e) {
     e.printStackTrace();
 } 

这使我一点也不犯错误。那么,如果通过USB发送的原始数据不像到达的实际数据那样有效,我做错了什么?

更新:根据请求,我有一些来自设备的错误代码。不幸的是,这似乎是一种连锁反应,所以我提供了一些第一批:

代码语言:javascript
运行
复制
org.json.JSONException: Unterminated string at character 4 of {"vi
org.json.JSONException: End of character input at character 0 of
org.json.JSONException: Value n" of typejava.lang.String cannot be converted to JSONObject
org.json.JSONException: End of character input at character 0 of
org.json.JSONException: Unterminated string at character 7 of "3VMJM7
org.json.JSONException: ...
EN

Stack Overflow用户

回答已采纳

发布于 2018-03-15 03:32:06

正如gre_gor在注释中提到的,接收USB数据的事件没有在单个调用中捕获来自Arduino的整个消息。我发现,如果您保持所有USB数据的运行字符串,并检查该字符串的JSON语法,那么最终您将得到一个有效的JSON对象。然后重新设置字符串并继续监听。

所以,我的新代码看起来是:

代码语言:javascript
运行
复制
public String usbStr = "";
public JSONObject driveData;

...

public void onReceivedData(byte[] result) {
     String dataStr;
     try {
         dataStr = new String(result, "UTF-8");
         dataStr = dataStr.replaceAll("[\\n\\r\\s]+", "");
         usbStr = usbStr.concat(dataStr);
     } catch (UnsupportedEncodingException e) {
         e.printStackTrace();
     }
     try {
         driveData = new JSONObject(dataStr);
         usbStr = "";
         updateVehicle(driveData);
     } catch(JSONException e) {
         e.printStackTrace();
     }
}
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49166399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档