1

我有一个 Raspberry Pi 3,我正在尝试将它连接到我汽车的 OBD。我有一个 Veepeak 迷你蓝牙 OBD2 扫描仪,我已经测试它在 Android 上与 Torque 完美配合。

[更新到最新版本的 pythonOBD 后更新]

事实证明,几天前有一个提交0100\r导致消息出现延迟。这样做显然是为了减轻一组特定的 OBD 扫描仪没有及时响应该特定消息。我已经克隆了repo并从 master 中提取了最新的并将导入行更改为:

import sys
sys.path.insert(1, '/home/pi/python-OBD')
import obd

现在,当我获得一组单独的日志时,我永远无法掌握汽车数据。出于某种原因,自动协议默认为协议 6,它在消息CAN error后输出 a。0100\r在将其设置为协议 5(唯一一个有希望的结果)之后,我得到了这些日志:

$> python obdtest.py 
[obd.obd] ======================= python-OBD (v0.7.1) =======================
[obd.obd] Using scan_serial to select port
[obd.obd] Available ports: ['/dev/rfcomm47']
[obd.obd] Attempting to use port: /dev/rfcomm47
[obd.elm327] Initializing ELM327: PORT=/dev/rfcomm47 BAUD=38400 PROTOCOL=5
[obd.elm327] write: 'ATZ\r'
[obd.elm327] wait: 1 seconds
[obd.elm327] read: b'ATZ\r\r\rELM327 v1.5\r\r>'
[obd.elm327] write: 'ATE0\r'
[obd.elm327] read: b'ATE0\rOK\r\r>'
[obd.elm327] write: 'ATH1\r'
[obd.elm327] read: b'OK\r\r>'
[obd.elm327] write: 'ATL0\r'
[obd.elm327] read: b'OK\r\r'
[obd.elm327] write: 'AT RV\r'
[obd.elm327] read: b'13.9V\r\r>'
[obd.elm327] write: 'ATTP5\r'
[obd.elm327] read: b'OK\r'
[obd.elm327] write: '0100\r'
[obd.elm327] read: b'>'
[obd.elm327] no response; wait: 0.100000 seconds
[obd.elm327] read: b'BUS INIT: OK'
[obd.protocols.protocol] map ECU 16 --> ENGINE
[obd.elm327] Connected Successfully: PORT=/dev/rfcomm47 BAUD=38400 PROTOCOL=5
[obd.obd] querying for supported commands
[obd.obd] Sending command: 0100: Supported PIDs [01-20]
[obd.elm327] write: '0100\r'
[obd.elm327] read: b'STOPPED\r\r>'
[obd.OBDCommand] 0100: Supported PIDs [01-20] did not receive any acceptable messages
[obd.obd] No valid data for PID listing command: 0100: Supported PIDs [01-20]
[obd.obd] Sending command: 0900: Supported PIDs [01-20]
[obd.elm327] write: '0900\r'
[obd.elm327] read: b'87 F1 10 49 00 01 30 00 00 00 02 \r\r>'
[obd.obd] finished querying with 8 commands supported
[obd.obd] ===================================================================
[obd.obd] '010C: Engine RPM' is not supported
None
[obd.obd] Closing connection
[obd.elm327] closing port
[obd.elm327] write: 'ATZ\r'

看起来0100\r写了两次,日志read: b'BUS INIT: OK'首先返回,然后返回read: b'STOPPED\r\r>'。无论是 38400 还是 9600,波特率似乎都一样,所以我认为这也不是问题。

[原问题]

我已经在 Raspberry Pi 上设置了蓝牙并配对了设备,但是在尝试运行以下脚本时,它在 10 到 20 次尝试中大约有 1 次使用以下日志:

import obd

obd.logger.setLevel(obd.logging.DEBUG)
connection = obd.OBD() # auto-connects to USB or RF port

cmd = obd.commands.RPM # select an OBD command (sensor)

response = connection.query(cmd) # send the command, and parse the response

print(response.value) # returns unit-bearing values thanks to Pint

connection.close()

当它失败时(绝大多数时间),它会显示:

$> python obdtest.py 
[obd.obd] ======================= python-OBD (v0.7.1) =======================
[obd.obd] Using scan_serial to select port
[obd.obd] Available ports: ['/dev/rfcomm47']
[obd.obd] Attempting to use port: /dev/rfcomm47
[obd.elm327] Initializing ELM327: PORT=/dev/rfcomm47 BAUD=auto PROTOCOL=auto
[obd.elm327] Response from baud 38400: '\x7f\x7f\r?\r\r>'
[obd.elm327] Choosing baud 38400
[obd.elm327] write: 'ATZ\r'
[obd.elm327] wait: 1 seconds
[obd.elm327] read: b'ATZ\r\r\rELM327 v1.5\r\r>'
[obd.elm327] write: 'ATE0\r'
[obd.elm327] read: b'ATE0\rOK\r\r>'
[obd.elm327] write: 'ATH1\r'
[obd.elm327] read: b'OK\r\r>'
[obd.elm327] write: 'ATL0\r'
[obd.elm327] read: b'OK\r\r>'
[obd.elm327] write: 'AT RV\r'
[obd.elm327] read: b'15.0V\r\r>'
[obd.elm327] write: 'ATSP0\r'
[obd.elm327] read: b'OK\r'
[obd.elm327] write: '0100\r'
[obd.elm327] read: b'>'
[obd.elm327] write: 'ATDPN\r'
[obd.elm327] read: b'SEARCHING...\r86 F1 10 41 00 BF BF F9 90 CF \r\r>'
[obd.elm327] Failed to retrieve current protocol
[obd.elm327] Adapter connected, but the ignition is off
[obd.obd] Cannot load commands: No connection to car
[obd.obd] ===================================================================
[obd.obd] '010C: Engine RPM' is not supported
None
[obd.obd] Closing connection
[obd.elm327] closing port
[obd.elm327] write: 'ATZ\r'

当它成功时(10 次或更多次尝试中的 1 次),它会显示:

$> python obdtest.py 
[obd.obd] ======================= python-OBD (v0.7.1) =======================
[obd.obd] Using scan_serial to select port
[obd.obd] Available ports: ['/dev/rfcomm47']
[obd.obd] Attempting to use port: /dev/rfcomm47
[obd.elm327] Initializing ELM327: PORT=/dev/rfcomm47 BAUD=auto PROTOCOL=auto
[obd.elm327] Response from baud 38400: '\x7f\x7f\r?\r\r>'
[obd.elm327] Choosing baud 38400
[obd.elm327] write: 'ATZ\r'
[obd.elm327] wait: 1 seconds
[obd.elm327] read: b'ATZ\r\r\rELM327 v1.5\r\r>'
[obd.elm327] write: 'ATE0\r'
[obd.elm327] read: b'ATE0\rOK\r\r>'
[obd.elm327] write: 'ATH1\r'
[obd.elm327] read: b'OK\r\r>'
[obd.elm327] write: 'ATL0\r'
[obd.elm327] read: b'OK\r\r'
[obd.elm327] write: 'AT RV\r'
[obd.elm327] read: b'14.7V\r\r>'
[obd.elm327] write: 'ATSP0\r'
[obd.elm327] read: b'OK\r'
[obd.elm327] write: '0100\r'
[obd.elm327] read: b'SEARCHING...\r86 F1 10 41 00 BF BF F9 90 CF \r\r>'
[obd.elm327] write: 'ATDPN\r'
[obd.elm327] read: b'A5\r\r>'
[obd.protocols.protocol] map ECU 16 --> ENGINE
[obd.elm327] Connected Successfully: PORT=/dev/rfcomm47 BAUD=38400 PROTOCOL=5
[obd.obd] querying for supported commands
[obd.obd] Sending command: 0100: Supported PIDs [01-20]
[obd.elm327] write: '0100\r'
[obd.elm327] read: b'86 F1 10 41 00 BF BF F9 90 CF \r\r>'
[obd.obd] finished querying with 51 commands supported
[obd.obd] ===================================================================
[obd.obd] Sending command: 010C: Engine RPM
[obd.elm327] write: '010C\r'
[obd.elm327] read: b'84 F1 10 41 0C 08 3C 16 \r\r>'
527.0 revolutions_per_minute
[obd.obd] Closing connection
[obd.elm327] closing port
[obd.elm327] write: 'ATZ\r'

请注意,这84 F1 10 41 0C 08 3C 16不是 OBD 扫描仪的 MAC 地址。也是rfcomm47手动设置为随机值,刚好选了47。

成功日志的一致之处在于协议的编号(5)。我在其他地方看到了继续尝试连接的建议,但是当我添加这样的内容时

while len(connection.supported_commands) < 100:
    connection = obd.Async("/dev/rfcomm47", protocol = "5", baudrate = "38400", fast = False, timeout = 30)

从第二次开始,每次调用它时我都会获取这些日志:

$> python sandboxobd.py 
<<startup logs>>
[obd.elm327] write: 'ATDPN\r'
[obd.elm327] read: b'SEARCHING...\r86 F1 10 41 00 BF BF F9 90 CF \r\r>'
[obd.elm327] Failed to retrieve current protocol
[obd.elm327] Adapter connected, but the ignition is off
[obd.obd] Cannot load commands: No connection to car
[obd.obd] ===================================================================
[obd.obd] ======================= python-OBD (v0.7.1) =======================
<<startup logs>>
[obd.elm327] read: b'>'
[obd.elm327] write: 'ATDPN\r'
[obd.elm327] read: b'SEARCHING...\rUNABLE TO CONNECT\r\r>'
[obd.elm327] Failed to retrieve current protocol
[obd.elm327] Adapter connected, but the ignition is off
[obd.obd] Cannot load commands: No connection to car
[obd.obd] ===================================================================

第二部分无限重复。使用直接连接到协议 5connection = obd.OBD(protocol="5")给了我这个:

[obd.elm327] Connected Successfully: PORT=/dev/rfcomm47 BAUD=38400 PROTOCOL=5
[obd.obd] querying for supported commands
[obd.obd] Sending command: 0100: Supported PIDs [01-20]
[obd.elm327] write: '0100\r'
[obd.elm327] read: b'BUS INIT: STOPPED\r\r>'
[obd.OBDCommand] 0100: Supported PIDs [01-20] did not receive any acceptable messages
[obd.obd] No valid data for PID listing command: 0100: Supported PIDs [01-20]
[obd.obd] finished querying with 7 commands supported
[obd.obd] ===================================================================
[obd.obd] '010C: Engine RPM' is not supported
None
[obd.obd] Closing connection
[obd.elm327] closing port
[obd.elm327] write: 'ATZ\r'

以前有人遇到过这个问题吗?我想不出任何其他方法可以尝试看看它是否有效。任何帮助将不胜感激。

4

1 回答 1

0

由于您正在指定协议,因此elm327.py您需要修改

r0100 = self.__send(b"0100")在功能上

def manual_protocol(self, protocol_):

r0100 = self.__send(b"0100", delay=1) 大约第 224 行。

您引用的提交仅在protocol未指定时添加延迟。IE:protocol=auto

添加延迟会有所帮助,但并不完美。建立连接后,我检查是否obd.commands.SPEED支持,如果不支持则重新开始。

我还在delay=1所有连接初始化命令(从 ATZ 到 ATDPN)中添加了一个,因为我发现没有它其中一个会随机失败,延迟似乎会降低失败率。

最后。ELM327 v1.5是廉价的克隆,响应不一定遵循标准。

于 2021-07-06T15:38:18.430 回答