0

我正在尝试为我的 mitsubishi lancer mx 1997 创建一个 Java obd2 扫描仪应用程序,它使用 MUTII 协议而不是 OBD2。任何人都可以帮助我使用jd2xx库阅读MUT 请求代码。我试过下面的程序,但它没有读取引擎 RPM。

package lancerscan;

import jd2xx.JD2XX;

public class Test2 {

    public static void main(String[] args) throws Exception {

    JD2XX jd = new JD2XX();
    jd.open(0);
    jd.setBaudRate(38400);
    jd.setDataCharacteristics(
            8, JD2XX.STOP_BITS_1, JD2XX.PARITY_NONE);
    jd.setFlowControl(
            JD2XX.FLOW_NONE, 0, 0);
    jd.setTimeouts(1000, 1000);

    String msg = "21";
    int ret = jd.write(msg.getBytes());
    System.out.println(ret + " bytes sent.");

    int rd = jd.read();
    System.out.println(">>>" + rd);

    int status = jd.getQueueStatus();
    byte[] data = new byte[(int) status];
    long lngBytesReturned = jd.read(data, 0, data.length);

    System.out.println("======= " + lngBytesReturned);
    }
}

引擎 RPM 的 MUT 请求代码为 0x21 更多 MUT 请求代码可在此处找到

可以正常工作的类似 C 程序在这里;主要项目文件在这里

谢谢,哈沙

4

2 回答 2

2

首先,您使用与示例中不同的波特率。该示例使用15625 baud但您正在使用38400 baud.

其次,您缺少一些设置命令。我不确定这是否会有所作为,但它在您的代码和示例之间有所不同。

三菱要求您通过在其中一个引脚上发送0x00的速率将汽车 ECU 设置为诊断模式。5 baud在 OpenPort 1.3D 电缆上,这意味着将中断设置为1800 ms打开,然后将其关闭。您可以看到这是使用libftdimut.c文件中的ftdimut_init()命令完成的。

      printf("Sending 0x00 at 5 baud\n");

      printf("Break on......\n");
      ftStatus = FT_SetBreakOn(ftdimut_ftHandle);
      if(ftStatus != FT_OK) return ftStatus;
      ftdimut_msleep(1800);
      printf("Break off......\n");
      ftStatus = FT_SetBreakOff(ftdimut_ftHandle);
      if(ftStatus != FT_OK) return ftStatus;

然后,汽车 ECU 将向您发送包含 ECU ID 的 4 个字节。这可用于检查 ECU 是否正确进入诊断模式。您可以在libftdimut.c中看到这一点。

      ftStatus = FT_Read(ftdimut_ftHandle, buf, 4, &bytesRead);
      if(ftStatus != FT_OK) return ftStatus;

      if(bytesRead == 4) {
        return FT_OK;
      }

现在假设您得到了 4 个字节,您可以开始发送诊断代码,例如0x170x21

于 2014-05-30T08:37:00.617 回答
1

我刚刚在我的博客上看到您的帖子,niallm 的答案是正确的,您需要先进行 5 波特初始化,这涉及驱动 KLine,您可以使用该答案中发布的 5 波特初始化之类的东西,有关协议的更多信息:

http://evoecu.logic.net/wiki/MUT_Protocol

获得 4 字节响应后,您可以开始以 15625 波特发送请求(我正在与 94 3000GT 通信,因此 CEL 灯停止闪烁),在我的情况下,我也将转换后的值(0x21 = 33 十进制)作为字节数组发送.

于 2014-05-30T19:22:34.863 回答