gpt4 book ai didi

java - ELM327 在尝试将其与 ODB Java API 一起使用时返回 `?`

转载 作者:行者123 更新时间:2023-11-30 09:00:18 25 4
gpt4 key购买 nike

我正在尝试使用 ODB Java API (this library)从我的汽车通过蓝牙从 ELM327 获取数据,但在每次请求时返回 ?,并且库引发 MisunderstoodException

这是我的代码:

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);
}
});
}

怎么了?

最佳答案

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

然而,根据我的经验,获得 ?便宜的蓝牙设备有时会返回(甚至可能是昂贵的?从来没有过)。我想如果在传输过程中丢失了一些位,就会发生这种情况,因为这样命令就会被误解。

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

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

在 Windows 上设置终端

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

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

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

通过终端发送一些命令

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

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

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

ATZ
E1
L1
010c

这将触发:

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

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

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

关于java - ELM327 在尝试将其与 ODB Java API 一起使用时返回 `?`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26861035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com