我正在构建一个可以在车辆ECU、Arduino和Android设备之间进行通信的设备。最终的目标是从汽车到用户的手机获取信息。
我现在有以下Arduino代码,它通过OBD-II端口收集车辆数据,并以JSON的形式发送串行数据:
#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设备上调用的方法:
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:
{"vin":"3VWJM71K89M02","distance":"19478","speed":"0","runtime":"216"}
接下来,我尝试使用前面在Arduino上构造的确切字符串构建一个JSONObject
,如下所示:
try {
driveData = new JSONObject("{\"vin\":\"3VWJM71K89M02\",\"distance\": \"19478\",\"speed\":\"0\",\"runtime\":\"216\"}");
updateVehicle(driveData);
} catch(JSONException e) {
e.printStackTrace();
}
这使我一点也不犯错误。那么,如果通过USB发送的原始数据不像到达的实际数据那样有效,我做错了什么?
更新:根据请求,我有一些来自设备的错误代码。不幸的是,这似乎是一种连锁反应,所以我提供了一些第一批:
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: ...
发布于 2018-03-15 03:32:06
正如gre_gor在注释中提到的,接收USB数据的事件没有在单个调用中捕获来自Arduino的整个消息。我发现,如果您保持所有USB数据的运行字符串,并检查该字符串的JSON语法,那么最终您将得到一个有效的JSON对象。然后重新设置字符串并继续监听。
所以,我的新代码看起来是:
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();
}
}
https://stackoverflow.com/questions/49166399
复制相似问题