Python obd没有将raspberry pi连接到汽车

2024-05-15 02:15:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个树莓皮3,我正试图连接到我的汽车的OBD。我有一个Veepeak Mini Bluetooth OBD2扫描仪,我已经测试过它在Android上与Torque一起工作的非常好

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

事实证明,几天前有一个commit0100\r消息中引入了延迟。显然,这样做是为了缓解一组特定OBD扫描仪在特定信息下没有及时响应的问题。我已经克隆了repo并从master中提取了最新版本,并将导入行更改为:

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

现在,当我得到一组单独的日志时,我一直无法获得汽车数据。出于某种原因,自动协议默认为协议6,在0100\r消息之后输出CAN error。将其设置为协议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上设置了bluetooth,并已将设备配对,但当尝试运行以下脚本时,它会在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] ===================================================================

第二部分无限期地重复。使用connection = obd.OBD(protocol="5")直接连接到协议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'

以前有人遇到过这个问题吗?我想不出什么别的办法来试试看它是否有效。任何帮助都将不胜感激


Tags: todevreadportokconnectioncommandcommands
1条回答
网友
1楼 · 发布于 2024-05-15 02:15:27

因为您正在指定协议,所以在elm327.py中需要修改

函数中的r0100 = self.__send(b"0100")

def manual_protocol(self, protocol_):

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

您引用的commit仅在未指定protocol时添加延迟。ie:protocol=auto

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

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

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

相关问题 更多 >

    热门问题