2

I'm trying to use ODB Java API (this library) to get the data from ELM327 via Bluetooth from my car, but in returns ? on every request, and library raises MisunderstoodException

Here is my code:

socket = device.createInsecureRfcommSocketToServiceRecord(uuid);
socket.connect();

    final CustomRPMCommand engineRpmCommand = new CustomRPMCommand();
    final SpeedObdCommand speedObdCommand = new SpeedObdCommand();
    while (!Thread.currentThread().isInterrupted()) {
        engineRpmCommand.run(socket.getInputStream(), socket.getOutputStream());
        speedObdCommand.run(socket.getInputStream(), socket.getOutputStream());

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                speedometerGauge.setSpeed(engineRpmCommand.getRPM(), true);
                rpmGauge.setSpeed(speedObdCommand.getMetricSpeed(), true);
            }
        });
    }

What's wrong?

4

1 回答 1

2

我还在尝试 OBD 的第一步中使用了相同的库,所以我可以说至少在我使用它的时候,它运行良好。

然而,根据我的经验,?有时可以使用便宜的蓝牙设备(甚至可能使用昂贵的蓝牙设备?从来没有)。我猜会发生这种情况,如果在传输过程中丢失了一些位,因为那么命令将被误解。

我为规避这个问题所做的是设置一个过程,在该过程中我发送所有AT命令最多 10 次,直到我得到所需的响应OK(除了ATZ,它将以 响应ELM327)。至于像 RPM 之类的值请求。我通常只是扔掉错误的值。

这是简短的答案,但是由于设备的此类问题会很烦人,因此我将指导您调试整个过程...

在 Windows 上设置终端

首先要测试ELM设备的功能,可以直接向串口发送命令。在 Windows 上,这可以使用例如 TeraTerm,然后在您的 Windows 上设置新的蓝牙连接作为 COM 设备(搜索蓝牙start -> search box,然后选择Change Bluetooth settings或类似设备)。从那里,转到然后为蓝牙 OBDII 设备COM connections添加一个新设备。Outgoing稍等一下,Windows 会计算新的 COM 端口号,您将需要它。

如果在下拉框中找不到OBDII,则必须先将 PC 与蓝牙设备绑定。这可以通过 完成devices and printers,在那里您应该会看到 OBDII 设备,因此您只需连接它(PIN 通常为 1234)。

如果您在 Linux 上,可能会更容易一些,但我还没有这样做 :)

通过终端发送一些命令

安装蓝牙连接和 TeraTerm 后,您可以启动 TeraTerm 并连接到适配器。选择Serial,然后选择您刚刚设置的端口。确保没有其他设备连接到 OBD 适配器(也不是您的手机)。一次只能连接一台设备。

如果连接成功,您应该可以输入字母。通常,在默认设置下,您应该能够看到您输入的字母(Echo 模式开启),但由于不确定,只需输入ATZ并点击<Enter>。ELM 现在应该在同一行中以“ELM327”响应(对我来说,如果打开,通常会导致奇怪的显示echo mode,但您应该得到任何响应)。

从终端我通常按顺序发送这些命令:

ATZ
E1
L1
010c

这将触发:

  1. OBD 设备的重置
  2. 确保 echo 已打开,以便我看到我正在输入的内容
  3. 确保换行已打开,以便我们在下一行收到回复
  4. 从车辆请求 RPM

在每个命令之间,我会检查设备的回复是什么。对于所有AT命令(1.、2. 和 3.),它必须是OK. 如果我回来了?,这可能会发生,我将再次重复该命令。您会看到在这种情况下,设备确实没有按照说明进行操作,例如,如果它关闭,则没有设置换行。所以我们真的必须再次发送它。

另一方面,在编程模式下,我们将设置e0l0(回显模式关闭和换行关闭),因为我们不希望将已经发送的内容发回。

于 2015-07-22T14:49:17.293 回答