我需要一些帮助,将我从汽车中的OBD适配器获得的答案转换为十进制,然后将转换后的任何值添加到公式并打印出来。
private class ConnectedThread extends Thread {
private final InputStream mmInStream;
private final OutputStream mmOutStream;
private BluetoothSocket mmSocket;
private ObdMultiCommand multiCommand;
public ConnectedThread(BluetoothSocket socket) {
connectionStatus = true;
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) {
Log.v("e", "e");
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
OBDcmds();
try {
OdbRawCommand ANS= new OdbRawCommand("22 40 90");
while (!Thread.currentThread().isInterrupted()) {
Log.d("Log", "ANS: " + ANS.getFormattedResult());
try {
ANS.run(mmInStream, mmOutStream);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("inside catch before while");
}
}
private void OBDcmds() { // execute commands
try {
new TimeoutCommand(100).run(mmInStream, mmOutStream);
new EchoOffCommand().run(mmInStream, mmOutStream);
new LineFeedOffCommand().run(mmInStream, mmOutStream);
new SelectProtocolCommand(ObdProtocols.ISO_15765_4_CAN).run(mmInStream, mmOutStream); //ISO_15765_4_CAN
guiHandler(Constants.TOAST, Constants.SHORT, "Init Done");
} catch (Exception e) {
guiHandler(Constants.TOAST, Constants.SHORT, "Init Failed");
// handle errors
}
}
}
当被问到ANS时会返回类似“6240901F30”的内容,其中第一个 6个数字与答案无关( 624090 1F30)。所以我们剩下的是最后一个(在这种情况下)4个数字(1F30),它们是十六进制的,需要转换为十进制。然后,此值将添加到公式x * 0,0625 - 512
中。它需要跳过这六个第一个数字,否则答案是错误的。
我的代码会怎样?
因为6个数字之后的值会根据汽车电池的电流而改变(这就是这个命令的作用),并且因为它处于一个while循环中,所以我对于解决方案会有什么不知所措。是。其他命令只有3个需要计算的最后一个数字,因此在“计算”答案时,只需要忽略6个第一个数字。
我添加了更多代码以希望显示更多上下文。所有这些都是非gui课程。这个类处理蓝牙相关的所有东西,在我的其他类“MainActivity”处理gui和什么不是。希望这可能有点帮助。 OdbRawCommand ANS= new OdbRawCommand("22 40 28");
这来自pires obd-java API。 OdbRawCommand
正用于发送自定义命令,就像我在这里做的那样。这是OdbRawCommand contains。
对许多修改感到抱歉。但如果我修改了API中的OdbRawCommand类,它会工作吗?由于getFormattedResult
打印出来自汽车的原始答案。我可以编辑API OdbRawCommand类(如果可能的话)并执行类似的操作吗?但从它的外观来看,文件已锁定,无法通过编辑?
@Override
public String getFormattedResult() {
int val = Integer.parseInt(getFormattedResult().substring(6), 16); //added this line
return getResult();
}
我今天没有车来测试这个,明天我会买的,但这会有用吗?
答案 0 :(得分:1)
使用String#substring
提取最后四位数(调用s
),然后
Integer.parseInt(s, 16)
将其转换为整数。 16告诉解析器s
是十六进制的。