使用JavaFTDI-lib-jd2xx-openport1.3USB电缆创建OBD2 MUT扫描仪
我正在尝试为我的三菱lancer mx 1997创建一个Java obd2扫描仪应用程序,它在obd2上使用MUTII协议。有人能帮我利用图书馆看书吗。 我试过下面的程序,但它没有读取发动机转速使用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(
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;
}