#include "j2534_dll.hpp"
unsigned long DeviceID; // 由 PassThruOpen 返回
unsigned long voltage;
long ret;
ret = PassThruIoctl(DeviceID, READ_VBATT, NULL, &voltage);
if (ret == STATUS_NOERROR)
{
printf("电压: %.2f V\n", voltage / 1000.0);
}
Kotlin (Android) 示例
// deviceID 此前由 ptOpen 返回
val result = j2534.ptIoctl(deviceID, READ_VBATT, 0, null)
if (result.status == STATUS_NOERROR) {
val voltageV = result.outputValue / 1000.0
Log.i("J2534", "电压: ${"%.2f".format(voltageV)} V")
}
Python 示例
from ctypes import *
voltage = c_ulong()
ret = j2534.PassThruIoctl(device_id, READ_VBATT, None, byref(voltage))
if ret == 0: # STATUS_NOERROR
print(f"电压: {voltage.value / 1000:.2f} V")
C# 示例
uint voltage;
int ret = J2534.PassThruIoctl(deviceId, READ_VBATT, IntPtr.Zero, out voltage);
if (ret == 0)
{
Console.WriteLine($"电压: {voltage / 1000.0:F2} V");
}
READ_PROG_VOLTAGE — 读取编程电压
返回编程输出端当前的电压。数值以毫伏为单位,四舍五入到最接近的十分之一伏。
pInput
NULL
pOutput
unsigned long* — 电压,单位 mV
C/C++ 示例
#include "j2534_dll.hpp"
unsigned long DeviceID;
unsigned long voltage;
long ret;
ret = PassThruIoctl(DeviceID, READ_PROG_VOLTAGE, NULL, &voltage);
if (ret == STATUS_NOERROR)
{
printf("编程电压: %.2f V\n", voltage / 1000.0);
}
Kotlin (Android) 示例
val result = j2534.ptIoctl(deviceID, READ_PROG_VOLTAGE, 0, null)
if (result.status == STATUS_NOERROR) {
val voltageV = result.outputValue / 1000.0
Log.i("J2534", "编程电压: ${"%.2f".format(voltageV)} V")
}
Python 示例
from ctypes import *
voltage = c_ulong()
ret = j2534.PassThruIoctl(device_id, READ_PROG_VOLTAGE, None, byref(voltage))
if ret == 0:
print(f"编程电压: {voltage.value / 1000:.2f} V")
C# 示例
uint voltage;
int ret = J2534.PassThruIoctl(deviceId, READ_PROG_VOLTAGE, IntPtr.Zero, out voltage);
if (ret == 0)
{
Console.WriteLine($"编程电压: {voltage / 1000.0:F2} V");
}
FIVE_BAUD_INIT — 5 波特初始化
为 ISO 9141 和 ISO 14230(K-Line)协议启动慢速(5 波特)初始化。从 ECU 接收 KeyWord。初始化模式通过 SET_CONFIG 由参数 FIVE_BAUD_MOD 设置。通信速率会自动确定。
#include "j2534_dll.hpp"
unsigned long ChannelID;
long ret;
ret = PassThruIoctl(ChannelID, CLEAR_PERIODIC_MSGS, NULL, NULL);
if (ret != STATUS_NOERROR)
{
char error[256];
PassThruGetLastError(error);
printf("错误: %s\n", error);
}
Kotlin (Android) 示例
val result = j2534.ptIoctl(channelID, CLEAR_PERIODIC_MSGS, 0, null)
if (result.status != STATUS_NOERROR) {
Log.e("J2534", "CLEAR_PERIODIC_MSGS 错误: ${result.status}")
}
Python 示例
ret = j2534.PassThruIoctl(channel_id, CLEAR_PERIODIC_MSGS, None, None)
if ret != 0:
print(f"CLEAR_PERIODIC_MSGS 错误: {ret}")
C# 示例
int ret = J2534.PassThruIoctl(channelId, CLEAR_PERIODIC_MSGS, IntPtr.Zero, IntPtr.Zero);
if (ret != 0)
Console.WriteLine($"CLEAR_PERIODIC_MSGS 错误: {ret}");
#include "j2534_dll.hpp"
unsigned long ChannelID;
long ret;
ret = PassThruIoctl(ChannelID, CLEAR_MSG_FILTERS, NULL, NULL);
if (ret != STATUS_NOERROR)
{
char error[256];
PassThruGetLastError(error);
printf("错误: %s\n", error);
}
Kotlin (Android) 示例
val result = j2534.ptIoctl(channelID, CLEAR_MSG_FILTERS, 0, null)
if (result.status != STATUS_NOERROR) {
Log.e("J2534", "CLEAR_MSG_FILTERS 错误: ${result.status}")
}
Python 示例
ret = j2534.PassThruIoctl(channel_id, CLEAR_MSG_FILTERS, None, None)
if ret != 0:
print(f"CLEAR_MSG_FILTERS 错误: {ret}")
C# 示例
int ret = J2534.PassThruIoctl(channelId, CLEAR_MSG_FILTERS, IntPtr.Zero, IntPtr.Zero);
if (ret != 0)
Console.WriteLine($"CLEAR_MSG_FILTERS 错误: {ret}");
CLEAR_FUNCT_MSG_LOOKUP_TABLE — 清除功能寻址表
清除 J1850 功能寻址表。用于 J1850 PWM/VPW 协议在使用功能寻址时。
pInput
NULL
pOutput
NULL
C/C++ 示例
#include "j2534_dll.hpp"
unsigned long ChannelID; // J1850 通道
long ret;
ret = PassThruIoctl(ChannelID, CLEAR_FUNCT_MSG_LOOKUP_TABLE, NULL, NULL);
if (ret != STATUS_NOERROR)
{
// 错误处理
}
Python 示例
ret = j2534.PassThruIoctl(channel_id, CLEAR_FUNCT_MSG_LOOKUP_TABLE, None, None)
C# 示例
int ret = J2534.PassThruIoctl(channelId, CLEAR_FUNCT_MSG_LOOKUP_TABLE, IntPtr.Zero, IntPtr.Zero);
ADD_TO_FUNCT_MSG_LOOKUP_TABLE — 添加功能地址
向 J1850 功能寻址表添加一个地址。使用功能寻址时将接收带有该地址的消息。
pInput
SBYTE_ARRAY* — 要添加的地址列表
pOutput
NULL
C/C++ 示例
#include "j2534_dll.hpp"
unsigned long ChannelID;
SBYTE_ARRAY AddrList;
unsigned char addresses[3] = {0x10, 0x18, 0x28}; // ECU 地址
long ret;
AddrList.NumOfBytes = 3;
AddrList.BytePtr = addresses;
ret = PassThruIoctl(ChannelID, ADD_TO_FUNCT_MSG_LOOKUP_TABLE, &AddrList, NULL);
if (ret != STATUS_NOERROR)
{
// 错误处理
}
var addrList = new SBYTE_ARRAY {
NumOfBytes = 1,
BytePtr = new byte[] { 0x10 }
};
int ret = J2534.PassThruIoctl(channelId, DELETE_FROM_FUNCT_MSG_LOOKUP_TABLE, ref addrList, IntPtr.Zero);
SW_CAN_HS — SW-CAN 高速模式
将 Single-Wire CAN 切换至高速模式(83.3 kbit/s)。用于在 GM 网络中进行高速诊断。
pInput
NULL
pOutput
NULL
C/C++ 示例
#include "j2534_dll.hpp"
unsigned long ChannelID; // SW-CAN 通道
long ret;
// 切换至高速模式
ret = PassThruIoctl(ChannelID, SW_CAN_HS, NULL, NULL);
if (ret == STATUS_NOERROR)
{
printf("SW-CAN 处于 High Speed 模式 (83.3 kbit/s)\n");
}
Kotlin (Android) 示例
val result = j2534.ptIoctl(channelID, SW_CAN_HS, 0, null)
if (result.status == STATUS_NOERROR) {
Log.i("J2534", "SW-CAN 处于 High Speed 模式 (83.3 kbit/s)")
}
Python 示例
ret = j2534.PassThruIoctl(channel_id, SW_CAN_HS, None, None)
if ret == 0:
print("SW-CAN 处于 High Speed 模式 (83.3 kbit/s)")
C# 示例
int ret = J2534.PassThruIoctl(channelId, SW_CAN_HS, IntPtr.Zero, IntPtr.Zero);
if (ret == 0)
Console.WriteLine("SW-CAN 处于 High Speed 模式 (83.3 kbit/s)");
SW_CAN_NS — SW-CAN 正常模式
将 Single-Wire CAN 切换至正常模式(33.3 kbit/s)。这是 GM 网络的默认模式。
pInput
NULL
pOutput
NULL
C/C++ 示例
#include "j2534_dll.hpp"
unsigned long ChannelID; // SW-CAN 通道
long ret;
// 切换至正常模式
ret = PassThruIoctl(ChannelID, SW_CAN_NS, NULL, NULL);
if (ret == STATUS_NOERROR)
{
printf("SW-CAN 处于 Normal Speed 模式 (33.3 kbit/s)\n");
}
Kotlin (Android) 示例
val result = j2534.ptIoctl(channelID, SW_CAN_NS, 0, null)
if (result.status == STATUS_NOERROR) {
Log.i("J2534", "SW-CAN 处于 Normal Speed 模式 (33.3 kbit/s)")
}
Python 示例
ret = j2534.PassThruIoctl(channel_id, SW_CAN_NS, None, None)
if ret == 0:
print("SW-CAN 处于 Normal Speed 模式 (33.3 kbit/s)")
C# 示例
int ret = J2534.PassThruIoctl(channelId, SW_CAN_NS, IntPtr.Zero, IntPtr.Zero);
if (ret == 0)
Console.WriteLine("SW-CAN 处于 Normal Speed 模式 (33.3 kbit/s)");
BUS_ON — 将控制器连接到总线 v5.0
将 CAN 控制器连接到物理总线。用于通过带 CAN_DISCONNECT 标志的 PassThruDisconnect 将控制器从总线断开后,或在打开通道而未自动连接后使用。
// RX-ID-A: 0x301
val data = byteArrayOf(0x00, 0x00, 0x03, 0x01)
val result = j2534.ptIoctl(channelID, TEARDOWN_CONNECTION, data.size, data)
if (result.status == STATUS_NOERROR) {
Log.i("TP2.0", "连接断开请求已发送")
}
Python 示例
from ctypes import *
# RX-ID-A: 0x301
data = (c_ubyte * 4)(0x00, 0x00, 0x03, 0x01)
input_data = SBYTE_ARRAY()
input_data.NumOfBytes = 4
input_data.BytePtr = data
ret = j2534.PassThruIoctl(channel_id, TEARDOWN_CONNECTION, byref(input_data), None)
if ret == 0:
print("连接断开请求已发送")
C# 示例
// RX-ID-A: 0x301
var data = new byte[] { 0x00, 0x00, 0x03, 0x01 };
var inputData = new SBYTE_ARRAY {
NumOfBytes = 4,
BytePtr = data
};
int ret = J2534.PassThruIoctl(channelId, TEARDOWN_CONNECTION, ref inputData, IntPtr.Zero);
if (ret == 0)
Console.WriteLine("连接断开请求已发送");