我的主要目标是获得我的控制单元的VIN号,但为此我需要向控制器发送命令,并且在向控制器发送任何命令之前,我必须声明地址。
我在我的网络上发送了以下命令,但没有收到任何响应。
Msg.id.pdu_bit.edp = 0;
Msg.id.pdu_bit.dp = 0;
Msg.id.pdu_bit.pf = 234;
Msg.id.pdu_bit.ps = 255;
Msg.id.pdu_bit.sa = 249;
Msg.id.pdu_bit.pri = 6;
Msg.buf[0] = 0x00; //LSB First
Msg.buf[1] = 0xEE; // pgn for claim address
Msg.buf[2] = 0x00;
Msg.len = 3;
这是声明地址的正确方式还是我发送了不同的命令?
看起来您在PGN 60928(地址声明)和PGN 59904(请求PGN)之间有些混淆
Msg.id.pdu_bit.pf = 234;
需要
Msg.id.pdu_bit.pf = 238;
地址声明的 PGN 为 60928,因此 J1939 标头中的 PF 字段需要为 238 (0xEE)。您的数据将是特定于应用程序的,尽管它的数据长度应为 8。有关此数据格式的更多信息,请参阅 J1939 规格幻灯片 41。
或者,如果您使用 PGN 59904,则当您的数据长度为 3 时(除非您有更多特定于应用程序的信息),并且您的数据是您想要请求的 PGN。
您不必请求地址声明PGN,只需发送地址声明,并将源地址设置为要声明的地址即可。