基于CAN总线的汽车诊断协议UDS(上位机开发驱动篇)

本篇作为UDS上位机的驱动开发篇,从市面上多见的CAN分析仪着手介绍UDS上位机驱动开发和移植的一般过程,目的是使UDS上位机软件能适应多家CAN分析仪,降低使用者的硬件成本。

一:广成CAN分析仪的驱动开发

首先创建ECANDLL类,从广成提供的二次开发包中获取ECANVCI.dll文件,将DLL文件放置与生成程序的目录中,如下类中创建了CAN常用的控制函数。

public static class ECANDLL

{

[DllImport("ECANVCI.dll", EntryPoint = "OpenDevice")]

public static extern ECANStatus OpenDevice(

UInt32 DeviceType,

UInt32 DeviceInd,

UInt32 Reserved);

[DllImport("ECANVCI.dll", EntryPoint = "CloseDevice")]

public static extern ECANStatus CloseDevice(

UInt32 DeviceType,

UInt32 DeviceInd);

[DllImport("ECANVCI.dll", EntryPoint = "InitCAN")]

public static extern ECANStatus InitCAN(

UInt32 DeviceType,

UInt32 DeviceInd,

UInt32 CANInd,

ref INIT_CONFIG InitConfig);

[DllImport("ECANVCI.dll", EntryPoint = "StartCAN")]

public static extern ECANStatus StartCAN(

UInt32 DeviceType,

UInt32 DeviceInd,

UInt32 CANInd);

[DllImport("ECANVCI.dll", EntryPoint = "ResetCAN")]

public static extern ECANStatus ResetCAN(

UInt32 DeviceType,

UInt32 DeviceInd,

UInt32 CANInd);

[DllImport("ECANVCI.dll", EntryPoint = "Transmit")]

public static extern ECANStatus Transmit(

UInt32 DeviceType,

UInt32 DeviceInd,

UInt32 CANInd,

ref CAN_OBJ Send,

UInt16 length);

[DllImport("ECANVCI.dll", EntryPoint = "Receive")]

public static extern ECANStatus Receive(

UInt32 DeviceType,

UInt32 DeviceInd,

UInt32 CANInd,

out CAN_OBJ Receive,

UInt32 length,

UInt32 WaitTime);

[DllImport("ECANVCI.dll", EntryPoint = "ReadErrInfo")]

public static extern ECANStatus ReadErrInfo(

UInt32 DeviceType,

UInt32 DeviceInd,

UInt32 CANInd,

out CAN_ERR_INFO ReadErrInfo);

}

在MainForm中,针对不同的控件调用不同的控制函数

如初始化:

INIT_CONFIG init_config = new INIT_CONFIG();

init_config.AccCode = 0;

init_config.AccMask = 0xffffff;

init_config.Filter = 0;

switch (m_Baudrate)

{

case 0: //1000

init_config.Timing0 = 0;

init_config.Timing1 = 0x14;

break;

case 1: //800

init_config.Timing0 = 0;

init_config.Timing1 = 0x16;

break;

case 2: //666

init_config.Timing0 = 0x80;

init_config.Timing1 = 0xb6;

break;

case 3: //500

init_config.Timing0 = 0;

init_config.Timing1 = 0x1c;

break;

case 4://400

init_config.Timing0 = 0x80;

init_config.Timing1 = 0xfa;

break;

case 5://250

init_config.Timing0 = 0x01;

init_config.Timing1 = 0x1c;

break;

case 6://200

init_config.Timing0 = 0x81;

init_config.Timing1 = 0xfa;

break;

case 7://125

init_config.Timing0 = 0x03;

init_config.Timing1 = 0x1c;

break;

case 8://100

init_config.Timing0 = 0x04;

init_config.Timing1 = 0x1c;

break;

case 9://80

init_config.Timing0 = 0x83;

init_config.Timing1 = 0xff;

break;

case 10://50

init_config.Timing0 = 0x09;

init_config.Timing1 = 0x1c;

break;

}

init_config.Mode = 0;

if (ECANDLL.OpenDevice(m_devtype, m_devind, 0) != ECAN.ECANStatus.STATUS_OK)

{

MessageBox.Show("Open device fault!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);

return;

}

//Set can1 baud

if (ECANDLL.InitCAN(m_devtype, m_devind, 0, ref init_config) != ECAN.ECANStatus.STATUS_OK)

{

MessageBox.Show("Init can fault!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);

ECANDLL.CloseDevice(1, 0);

return;

}

二:周立功CAN分析仪驱动开发

周立功的CAN分析仪与广成基本相同,将DLL文件替换为周立功的DLL文件。在初始化和其他调用函数中注意m_devtype和m_devind与广成的不同,这两个变量的取值可通过不同厂家的测试软件中获取。

一般的广成m_devtype =1,m_devind=0,周立功USBCAN II m_devtype =4,m_devind=0.

ECANDLL.OpenDevice(m_devtype, m_devind, 0)

三:Kvaser CAN分析仪驱动开发

Kvaser CAN驱动开发与上述两者差别较大。

首先引入驱动DLL文件

以下是初始化过程

int hnd = Canlib.canOpenChannel(channel, Canlib.canOPEN_ACCEPT_VIRTUAL);

CheckStatus("Open channel", (Canlib.canStatus)hnd);

if (hnd >= 0)

{

handle = hnd;

}

int[] bitrates = new int[] {

Canlib.BAUD_1M,

Canlib.BAUD_500K,

Canlib.BAUD_250K,

Canlib.BAUD_125K,

Canlib.BAUD_100K,

Canlib.BAUD_83K,

Canlib.BAUD_62K,

Canlib.BAUD_50K,

};

int bitrate = bitrates[comboBoxBaud.SelectedIndex];

Canlib.canStatus status = Canlib.canSetBusParams(handle, bitrate, 0, 0, 0, 0, 0);

CheckStatus("Setting bitrate to " + comboBoxBaud.SelectedItem, status);

Canlib.canBusOn(handle);

CheckStatus("Bus on", status);

if (status == Canlib.canStatus.canOK)

{

onBus = true;

/*

if (!dumper.IsBusy)

{

dumper.RunWorkerAsync();

}*/

}

写CAN报文函数

Canlib.canStatus status = Canlib.canWrite(handle, id, dat, dlc, flags);

读CAN报文函数

status = Canlib.canReadWait(handle, out id, dat, out dlc, out flags, out time, 50);

原文地址:https://www.cnblogs.com/qq2020809663/p/8998191.html

时间: 2024-08-29 07:20:34

基于CAN总线的汽车诊断协议UDS(上位机开发驱动篇)的相关文章

<Autel>汽车诊断基础知识

汽车诊断器,属于车载电子,用于汽车后市场.它是诊断分析系统.汽车诊断系统,主要是ECU(电子控制单元).传感器和执行单元组成.汽车诊断器,主要是解释分析ECU中信息.初级是诊断故障码,高级是编程设码来清除码.它是在主板上诊断(OBD),通过灯的闪烁显示出来.在汽车诊断协议中,有ISO国际标准.SAE国家标准和自定义标准.如KL.PWM.VPW.CAN.光纤和以太网等协议. 诊断仪由硬件和软件组成,软件分为系统平台软件和诊断应用软件.诊断仪通过OBDII接口与ECU相通.诊断中要素有,设备.接口和

C# MODBUS协议 上位机(转)

源:C# MODBUS协议 上位机 C#写了一款上位机监控软件,基于MODBUS_RTU协议. 软件的基本结构: 采用定时器(Timer控件)为时间片. 串口采用serialPort1_DataReceived中断接收,并进行MODBUS格式判断. 把正确接收的数据取出,转换为有特定的结构体中. 数据通过时间片实时刷新. MODBUS协议(这里不介绍了,网上有很多的权威资料). 串口接收问题 这里采用的是MODBUS_RTU协议,是没有回车等明显的结束符的哈.所以在C#也不可以用serialPo

c# MODBUS协议 上位机 (转载)

C#写了一款上位机监控软件,基于MODBUS_RTU协议. 软件的基本结构: 1.采用定时器(Timer控件)为时间片. 2.串口采用serialPort1_DataReceived中断接收,并进行MODBUS格式判断. 3.把正确接收的数据取出,转换为有特定的结构体中. 4.数据通过时间片实时刷新. 5.MODBUS协议(这里不介绍了,网上有很多的权威资料). 串口接收问题 这里采用的是MODBUS_RTU协议,是没有回车等明显的结束符的哈.所以在C#也不可以用serialPort1.Read

NMEA协议 上位机 C# (转)

源:NMEA协议 上位机 c# 前些时间写做了两款用NMEA协议的上位机,在这里做一个总结和记录.和大家分享,也为了以后不会忘记. NMEA协议总体来说,相对简单,是气象上比较成熟的协议. 主要有以下几个参数及其格式: 风速和风向: 空气温度: 土壤温度: 湿度: 大气压: 注: 其中效验部分主要采用的 异或效验:即从$后第一个字符到’*’前一个字符进行异或.所得到的数据高4位,低4位的ASCII码. <CR>: ‘\r’ <LF>: ‘\n’ 波特率:4800 刷新频率:1Hz

基于CAN总线多视觉传感器测控系统的设计

1.引言 视觉检测技术是以机器视觉为基础的新型测试技术,因其具有测量非接触.速度快.信息量大.应用领域宽广等特点而受到欢迎.结构光传感器是应用较早.发展较成熟的视觉传感器,因此本系统采用结构光传感器来采集图像并经图像采集卡送给计算机处理.由于视觉传感器在视觉测量中担负着视频图像信号(测量数据)的采集.切换与传输.因此,如何让视觉传感器测控系统快速.精确地获得理想的视频图像信息,进而为后期的图像处理提供可靠的支持,亦即视觉传感器的测控系统的设计显得尤为重要. 2.视觉系统的概述 视觉检测系统中采集

OBD 诊断与 UDS 诊断区别

原文地址:OBD 诊断与 UDS 诊断有什么区别? OBD(全称:On Board Diagnostics),即车载自动诊断系统,是汽车排放和驱动性相关故障的标准化诊断规范,有严格的排放针对性,其实质就是通过监测汽车的动力和排放控制系统来监控汽车的排放.当汽车的动力或排放控制系统出现故障,有可能导致一氧化碳(CO).碳氢化合物(HC).氮氧化合物(NOx)或燃油蒸发污染量超过设定的标准,故障灯就会点亮报警. 首先,OBD是面向汽车排放问题而制定的规范,也就是说对所有车辆统一适用,在OBD Ⅱ计划

关于汽车诊断OBD的理解(ISO15031-5)(转发)

1.OBD用来做什么 2.OBD和UDS的区别 3.OBD硬件接口简介 4.OBD的9大模式介绍 OBD(On-Board Diagnostic)指的是在线诊断系统,是汽车上的一种用于监控车辆状况以及控制排放的一种在线诊断系统.本篇文章主要围绕OBD的九种模式进行介绍,当然也会辅助介绍一些OBD相关的内容. 1.OBD用来做什么 对于一般的车主,可能有接触过OBD口,可以用它来查看一些车内的参数等等,但是OBD它到底用来做什么用呢? 还是以一贯的思路,进行分点说明 a.用于监控车辆基本参数,例如

SOA实践之基于服务总线的设计

在上文中,主要介绍了SOA的概念,什么叫做“服务”,“服务”应该具备哪些特性.本篇中,我将介绍SOA的一种很常见的设计实践--基于服务总线的设计. 基于服务总线的设计 基于总线的设计,借鉴了计算机内部硬件组成的设计思想(通过总线传输数据).在分布式系统中,不同子系统之间需要实现相互通信和远程调用,比较直接的方式就是“点对点”的通信方式,但是这样会暴露出一些很明显的问题:系统之间紧密耦合.配置和引用混乱.服务调用关系错综复杂.难以统一管理.异构系统之间存在不兼容等.而基于总线的设计,正是为了解决上

基于 HTTP/2 的全新 APNs 协议

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html#//apple_ref/doc/uid/TP40008194-CH11-SW1 前言: APNs 协议在近两年的 WWDC 上改过两次,2015年12月17日更是推出了革命性的新特性.但在国内传播的博客.面试题里关于APNs的