2003款大众高尔夫MK4 OBD2通信连接故障求助
OBD适配器连接故障排查求助
更新进展:手头4根OBD串口线里,有一根能响应AT指令,但发送获取支持PID的0100指令时,返回SEARCHING... UNABLE TO CONNECT.
我正在开发自定义APP以获取车载数据,最初使用Nexas BLE OBD适配器,它能在iPhone的CarScanner应用中正常工作。通过nRF Scan应用找到了适配所需的UUID,但在MacBook上通过BLE连接时,所有AT或PID指令都返回相同的固定响应。调试两天未解决,怀疑MacBook存在问题,于是切换到树莓派4设备,改用有线连接方式。
已知2003款高尔夫MK4的OBD通信采用Kline协议而非CAN总线,但初始化指令应该不存在差异。
BLE连接的JavaScript代码
const initializeButton = document.querySelector("#initializeOBD"); const status = document.querySelector("#status"); const responses = document.querySelector("#responses"); const OBD_SERVICE_UUID = "49535343-fe7d-4ae5-8fa9-9fafd205e455"; const OBD_CHARACTERISTIC_UUID = "49535343-6daa-4d02-abf6-19569aca69fe"; const OBD_CHARACTERISTIC_UUID1 = "49535343-aca3-481c-91ec-d85e28a60318"; const OBD_CHARACTERISTIC_UUID2 = "49535343-4c8a-39b3-2f49-511cff073b7e"; const initializationCommands = [ "ATZ\r", "ATL0\r", "ATE1\r", "ATH1\r", "ATAT1\r", "ATSTFF\r", "ATDP\r", "ATDP\r", ]; initializeButton.addEventListener("click", async () => { try { const device = await navigator.bluetooth.requestDevice({ filters: [{ namePrefix: "NEXAS" }], optionalServices: [ OBD_SERVICE_UUID, OBD_CHARACTERISTIC_UUID, OBD_CHARACTERISTIC_UUID1, OBD_CHARACTERISTIC_UUID2, ], }); status.textContent = "Connecting to device..."; const server = await device.gatt.connect(); status.textContent = "Connected. Initializing..."; const service = await server.getPrimaryService(OBD_SERVICE_UUID); const characteristic = await service.getCharacteristic( OBD_CHARACTERISTIC_UUID ); for (const command of initializationCommands) { responses.innerHTML += `<div>Sending command: ${command.trim()}</div>`; const encoder = new TextEncoder(); await characteristic.writeValue(encoder.encode(command)); await new Promise((resolve) => setTimeout(resolve, 1000)); const value = await characteristic.readValue(); const hexString = Array.from(new Uint8Array(value.buffer)) .map((byte) => byte.toString(16).padStart(2, "0")) .join(""); const bitArray = hexString .split("") .map((hexDigit) => parseInt(hexDigit, 16).toString(2).padStart(4, "0") ) .join(""); responses.innerHTML += `<div>Response (hex): ${hexString}</div>`; responses.innerHTML += `<div>Response (bit array): ${bitArray}</div>`; } responses.innerHTML += `<div>Initialization complete. Listening for RPM...</div>`; setInterval(async () => { const encoder = new TextEncoder(); await characteristic.writeValue(encoder.encode("0100")); await new Promise((resolve) => setTimeout(resolve, 100)); const value = await characteristic.readValue(); const hexString = Array.from(new Uint8Array(value.buffer)) .map((byte) => byte.toString(16).padStart(2, "0")) .join(""); const bitArray = hexString .split("") .map((hexDigit) => parseInt(hexDigit, 16).toString(2).padStart(4, "0") ) .join(""); responses.innerHTML += `<div>0100 Response (hex): ${hexString}</div>`; responses.innerHTML += `<div>0100 Response (bit array): ${bitArray}</div>`; await characteristic.writeValue(encoder.encode("0170")); await new Promise((resolve) => setTimeout(resolve, 100)); const value = await characteristic.readValue(); const hexString = Array.from(new Uint8Array(value.buffer)) .map((byte) => byte.toString(16).padStart(2, "0")) .join(""); const bitArray = hexString .split("") .map((hexDigit) => parseInt(hexDigit, 16).toString(2).padStart(4, "0") ) .join(""); responses.innerHTML += `<div>0100 Response (hex): ${hexString}</div>`; responses.innerHTML += `<div>0100 Response (bit array): ${bitArray}</div>`; }, 2000); } catch (error) { status.textContent = "Failed to connect or test: " + error.message; } });
代码运行输出
Initialize OBD Connected. Initializing... Responses: Sending command: ATZ Response (hex): 001800180000004800 Response (bit array): 000000000001100000000000000110000000000000000000000000000100100000000000 Sending command: ATL0 Response (hex): 001800180000004800 Response (bit array): 000000000001100000000000000110000000000000000000000000000100100000000000 Sending command: ATE1 Response (hex): 001800180000004800 Response (bit array): 000000000001100000000000000110000000000000000000000000000100100000000000 Sending command: ATH1 Response (hex): 001800180000004800 Response (bit array): 000000000001100000000000000110000000000000000000000000000100100000000000 Sending command: ATAT1 Response (hex): 001800180000004800 Response (bit array): 000000000001100000000000000110000000000000000000000000000100100000000000 Sending command: ATSTFF Response (hex): 001800180000004800 Response (bit array): 000000000001100000000000000110000000000000000000000000000100100000000000 Sending command: ATDP Response (hex): 001800180000004800 Response (bit array): 000000000001100000000000000110000000000000000000000000000100100000000000 Sending command: ATDP Response (hex): 001800180000004800 Response (bit array): 000000000001100000000000000110000000000000000000000000000100100000000000 Initialization complete. Listening for RPM... 0100 Response (hex): 001800180000004800 0100 Response (bit array): 000000000001100000000000000110000000000000000000000000000100100000000000
树莓派有线连接测试(Python + obd库)
测试代码
import obd obd.logger.setLevel(obd.logging.DEBUG) # enables all debug information baudrates = ['38400', '9600', '230400', '115200', '57600', '19200'] for i in range(1, 7): for item in baudrates: connection = obd.OBD(portstr="/dev/ttyUSB0", protocol=i, baudrate=item) cmd = obd.commands.SPEED # select an OBD command (sensor) response = connection.query(cmd) # send the command, and parse the response print(response.value)
部分运行输出
[obd.obd] ======================= python-OBD (v0.7.1) ======================= [obd.obd] Explicit port defined [obd.elm327] Initializing ELM327: PORT=/dev/ttyUSB0 BAUD=19200 PROTOCOL=6 [obd.elm327] write: 'ATZ\r' [obd.elm327] wait: 1 seconds [obd.elm327] Failed to read port [obd.elm327] read: b'' [obd.elm327] write: 'ATE0\r' [obd.elm327] Failed to read port [obd.elm327] read: b'' [obd.elm327] closing port [obd.elm327] write: 'ATZ\r' [obd.elm327] ATE0 did not return 'OK' [obd.obd] Closing connection [obd.obd] Cannot load commands: No connection to car [obd.obd] =================================================================== [obd.obd] Query failed, no connection available None
所有输出均显示端口读取失败,未建立有效通信。也尝试过不指定参数的connection = obd.OBD(),问题依旧。原本以为切换到树莓派有线连接能解决MacBook上的问题,顺利读取车辆OBD数据,求技术建议或解决方案。
内容的提问来源于stack exchange,提问作者Volodymyr Samoilenko
相关产品推荐
相关产品推荐

