使用JavaFTDI-lib-jd2xx-openport1.3USB电缆创建OBD2 MUT扫描仪

使用JavaFTDI-lib-jd2xx-openport1.3USB电缆创建OBD2 MUT扫描仪,java,ftdi,obd-ii,Java,Ftdi,Obd Ii,我正在尝试为我的三菱lancer mx 1997创建一个Java obd2扫描仪应用程序,它在obd2上使用MUTII协议。有人能帮我利用图书馆看书吗。 我试过下面的程序,但它没有读取发动机转速 package lancerscan; import jd2xx.JD2XX; public class Test2 { public static void main(String[] args) throws Exception { JD2XX jd = new JD2XX(

我正在尝试为我的三菱lancer mx 1997创建一个Java obd2扫描仪应用程序,它在obd2上使用MUTII协议。有人能帮我利用图书馆看书吗。 我试过下面的程序,但它没有读取发动机转速

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);
    }
}
发动机转速的MUT请求代码为0x21 可以找到更多MUT请求代码

类似的C程序工作良好;主要的prjct文件是

谢谢,
harsha

首先使用与示例中不同的波特率。示例使用的是
15625波特
,但您使用的是
38400波特

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

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

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


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

,首先使用与示例中不同的波特率。示例使用的是
15625波特
,但您使用的是
38400波特

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

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

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


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

,首先使用与示例中不同的波特率。示例使用的是
15625波特
,但您使用的是
38400波特

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

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

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


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

,首先使用与示例中不同的波特率。示例使用的是
15625波特
,但您使用的是
38400波特

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

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

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


现在假设你得到了4个字节,你可以开始发送诊断代码,比如
0x17
0x21
我刚刚在我的博客上看到你的帖子,尼亚姆的答案是正确的,你需要先做一个5波特的初始化,包括驱动KLine,你可以使用这个答案中的5波特初始化,有关协议的更多信息:


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

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


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

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


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

我刚刚在我的博客上看到您的帖子,niallm回答是正确的,你需要先做一个5波特的初始化,包括驾驶
      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;
      ftStatus = FT_Read(ftdimut_ftHandle, buf, 4, &bytesRead);
      if(ftStatus != FT_OK) return ftStatus;

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