This commit is contained in:
sunbeam 2022-05-14 15:57:52 +08:00
commit fe83261e37
13 changed files with 831 additions and 0 deletions

BIN
USB2XXX.dll Normal file

Binary file not shown.

15
default.aproj Normal file
View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<project ver="10" name="CAN_Bootloader" libEmbed="true" icon="..." ui="win" output="CAN_Bootloader.exe" CompanyName="单位名称" FileDescription="CAN_Bootloader" LegalCopyright="Copyright (C) 作者 2022" ProductName="CAN_Bootloader" InternalName="CAN_Bootloader" FileVersion="0.0.0.1" ProductVersion="0.0.0.1" publishDir="/dist/" dstrip="false" local="false" ignored="false">
<file name="main.aardio" path="main.aardio" comment="main.aardio"/>
<folder name="资源文件" path="res" embed="true" local="false" ignored="false"/>
<folder name="窗体文件" path="dlg" comment="目录" embed="true" local="false" ignored="false"/>
<folder name="user" path="user" embed="true" comment="目录" local="false" ignored="false">
<file name="CanThread.aardio" path="user\CanThread.aardio" comment="user\CanThread.aardio"/>
<file name="Diag22code.aardio" path="user\Diag22code.aardio" comment="user\Diag22code.aardio"/>
<file name="Diag10code.aardio" path="user\Diag10code.aardio" comment="user\Diag10code.aardio"/>
<file name="Diag28code.aardio" path="user\Diag28code.aardio" comment="user\Diag28code.aardio"/>
<file name="Diag85code.aardio" path="user\Diag85code.aardio" comment="user\Diag85code.aardio"/>
<file name="Diag7Fcode.aardio" path="user\Diag7Fcode.aardio" comment="user\Diag7Fcode.aardio"/>
<file name="Diag27code.aardio" path="user\Diag27code.aardio" comment="user\Diag27code.aardio"/>
</folder>
</project>

20
lib/config.aardio Normal file
View File

@ -0,0 +1,20 @@
//config 配置文件
import fsys.config;
config = fsys.config("/config/");
//config = fsys.config( io.appData("/软件作者/应用程序名/") );
//不需要序列化的配置名字前请添加下划线
namespace config {
__appName = "应用程序名";
__appVersion = "1.0.0.01";
__appDescription = "这是一个测试程序";
__website = "http://www.aardio.com/";
}
/**intellisense(config)
__appName = 应用程序名
__appVersion = 应用程序内部版本号
__appDescription = 程序说明
__website = 官方网站
? = 配置文件名,\n读写配置并序列化为一个表对象,\n表的成员值可以是支持序列化的普通变量,支持table对象\n配置文件在首次使用时自动加载,退出程序时自动保存\n!fsys_table.
end intellisense**/

310
lib/usb2canfd.aardio Normal file
View File

@ -0,0 +1,310 @@
/*
*使用说明:
*1.创建CAN设备对象 CANHw = usb2canfd.USB2CANHW();
*2.加载DLL CANHw.LoadDll();
*3.扫描设备 hwnum = CANHw.FlashHw();
*4.获取可用设备 allhw = CANHw.GetAvailableHW();
*5.打开设备(初始化) CANHw.OpenDevice(设备序号,通道)
*6.通过SendMsg和GetMsg发送和获取报文
*/
namespace usb2canfd{
//参考 http://www.toomoss.com/help/index.htm
//初始化CAN的数据类型定义
class CANFD_INIT_CONFIG{
ctor( /*输入构造函数所需要的参数*/ ){
};
type=me;
/*对象的所有成员必须用分号分隔*/
BYTE Mode; //0-正常模式1-自发自收模式
BYTE ISOCRCEnable;//0-禁止ISO CRC,1-使能ISO CRC
BYTE RetrySend;//0-禁止重发1-无限制重发
BYTE ResEnable;//0-不接入内部120欧终端电阻1-接入内部120欧终端电阻
//波特率参数可以用TCANLINPro软件里面的波特率计算工具计算
//仲裁段波特率参数,波特率=40M/NBT_BRP*(1+NBT_SEG1+NBT_SEG2)
BYTE NBT_BRP;
BYTE NBT_SEG1;
BYTE NBT_SEG2;
BYTE NBT_SJW;
//数据段波特率参数,波特率=40M/DBT_BRP*(1+DBT_SEG1+DBT_SEG2)
BYTE DBT_BRP;
BYTE DBT_SEG1;
BYTE DBT_SEG2;
BYTE DBT_SJW;
BYTE __Res0[8];
}
//CAN信息帧的数据类型定义
class CANFD_MSG{
ctor( /*输入构造函数所需要的参数*/ ){
};
type=me;
/*对象的所有成员必须用分号分隔*/
INT ID; //报文ID。 //| (1<<31);//扩展帧
BYTE DLC; //数据字节长度,可设置为-0,1,2,3,4,5,6,7,8,12,16,20,24,32,48,64
BYTE Flags; //bit[0]-BRS,bit[1]-ESI,bit[2]-FDF,bit[6..5]-Channel,bit[7]-RXD
BYTE __Res0; //保留
BYTE __Res1; //保留
INT TimeStamp; //帧接收或者发送时的时间戳单位为10us
BYTE Data[64]; //报文的数据。
}
class CAN_UDS_ADDR{
ctor( /*输入构造函数所需要的参数*/ ){
};
type=me;
/*对象的所有成员必须用分号分隔*/
INT ReqID; //请求报文ID。
INT ResID; //应答报文ID。
BYTE Flag; //bit[0]-帧类型(0-标准帧1-扩展帧),
//bit[1]-FDF(0-普通CAN帧1-CANFD帧),
//bit[2]-BRS(0-CANFD帧不加速1-CANFD帧加速)
BYTE AddrFormats; //0-normal, 1-extended ,2-mixed
BYTE AddrExt; //当AddrFormats不为normal时该数据放到CAN数据域第1字节
BYTE MaxDLC; //每帧最大数据字节数一般设置为8
}
class DEVICE_INFO{
ctor( /*输入构造函数所需要的参数*/ ){
};
type=me;
/*对象的所有成员必须用分号分隔*/
BYTE FirmwareName[32]; //固件名称字符串
BYTE BuildDate[32]; //固件编译时间字符串
INT HardwareVersion; //硬件版本号
INT FirmwareVersion; //固件版本号
INT SerialNumber[3]; //适配器序列号
INT Functions; //适配器当前具备的功能
}
//调用函数
class USB2CANHW{
ctor( /*输入构造函数所需要的参数*/ ){
};
type=me;
/*对象的所有成员必须用分号分隔*/
//初始化全局变量
DllHandle = null;
//加载DLL
LoadDll = function(){
try{
DllHandle = ..raw.loadDll("\USB2XXX.dll")
}
catch(err)
{
import win;
DllHandle = null;
win.msgboxTimeout("加载USB2LIN的DLL失败请检查USB2XXX.dll和libusb-1.0.dll文件","错误",1000,);
}
if(DllHandle == null)return 1;
return 0;
}
//刷新硬件
FlashHw = function(){
import console;
if(DllHandle = null){
//DLL为空返回
AvailableHW = {}
return 0;
}
var arr_temp = {int value[] = { length = 10/*可以使用变量*/ } }//类似动态数组
HwNum = DllHandle.USB_ScanDevice(arr_temp)
AvailableHW = {}
for(i=1;HwNum;1){
var devtemp = {};
devtemp.devnum = i;
devtemp.channel = 1;
devtemp.hLINHW = arr_temp.value[i];
devtemp.name = "dev-" + i + ":" + tostring(arr_temp.value[i],16);
..table.push(AvailableHW,devtemp);
}
return HwNum; //返回有效硬件数
}
//获取设备信息
GetDevInfo = function(index){
if(index > HwNum)
{ //如果序号大于最大硬件数
return 0;
}
DllHandle.USB_OpenDevice(AvailableHW[index].hLINHW);
var DeviceInfo = ..usb2canfd.DEVICE_INFO();
var funcstr = ..raw.buffer(100);
var ret = DllHandle.DEV_GetDeviceInfo(AvailableHW[index].hLINHW,DeviceInfo,funcstr);
return ret,DeviceInfo,funcstr;
}
//获取有效硬件
GetAvailableHW = function(){
return AvailableHW;
}
//打开设备,包括初始化通道
OpenDevice = function(index,channel){
if(index > HwNum)
{ //如果序号大于最大硬件数
return 0;
}
var ret = DllHandle.USB_OpenDevice(AvailableHW[index].hLINHW)
canconfig = ..usb2canfd.CANFD_INIT_CONFIG();
canconfig.Mode = 0; //0-正常模式1-自发自收模式
canconfig.ISOCRCEnable = 0;//0-禁止ISO CRC,1-使能ISO CRC
canconfig.RetrySend = 0;//0-禁止重发1-无限制重发
canconfig.ResEnable = 1;//0-不接入内部120欧终端电阻1-接入内部120欧终端电阻
//波特率参数可以用TCANLINPro软件里面的波特率计算工具计算
//仲裁段波特率参数,波特率=40M/NBT_BRP*(1+NBT_SEG1+NBT_SEG2)
canconfig.NBT_BRP = 1; //参数来自官方上位机默认500K
canconfig.NBT_SEG1 = 59;
canconfig.NBT_SEG2 = 20;
canconfig.NBT_SJW = 2;
//数据段波特率参数,波特率=40M/DBT_BRP*(1+DBT_SEG1+DBT_SEG2)
canconfig.DBT_BRP = 2; //参数来自官方上位机默认500K
canconfig.DBT_SEG1 = 29;
canconfig.DBT_SEG2 = 10;
canconfig.DBT_SJW = 2;
ret = DllHandle.CANFD_Init(AvailableHW[index].hLINHW,channel,canconfig);
if(ret == 0){//调用成功
Hwconnected = AvailableHW[index].hLINHW;
Chconntected = channel;
}
else {
Hwconnected = null
Chconntected = null;
}
return ret;
}
//关闭设备
CloseDevice = function(){
//console.print("-----------------CloseDevice ---------")
if(Hwconnected == null){
return;
}
try{
DllHandle.USB_CloseDevice(Hwconnected);
Hwconnected = null;
}
}
//是否连接
isConnected = function(){
if(Hwconnected == null){
return false;
}
else {
return true;
}
}
//发送报文
SendMsg = function(id,data){
if(Hwconnected == null){//未连接
return 0;
}
if(#data == 0 || #data>8){//长度不对
return 0;
}
var msg = ..usb2canfd.CANFD_MSG();
msg.Flags = 0;
if(id <= 0x7ff){
msg.ID = id; //| (1<<31);//扩展帧
}
else {
msg.ID = id | (1<<31);//扩展帧
}
msg.DLC = #data;
msg.Data = data;
var ret = DllHandle.CANFD_SendMsg(Hwconnected,Chconntected,msg,1);
return ret;
}
//从设备缓冲区获取报文
GetMsg = function(){
var ret = 0;
var retdata = {};
do{
var msgbuf = ..usb2canfd.CANFD_MSG();
ret = DllHandle.CANFD_GetMsg(Hwconnected,CANIndex,msgbuf,1);
if(ret == 1){
var data = {};
for(i=1;msgbuf.DLC;1){
data[i] = msgbuf.Data[i];
}
var msg = {"id"=msgbuf.ID;"data"=data;};//
..table.push(retdata,msg);
}
}while(ret > 0)
return retdata;
}
GetDiag = function(data){
if(#data<2){
return 0,1;
}
var UDSAddr = ..usb2canfd.CAN_UDS_ADDR()
UDSAddr.Flag = 1;//使用扩展帧
UDSAddr.AddrFormats = 0;
UDSAddr.ReqID = 0x18dadff1;
UDSAddr.ResID = 0x18daf1df;
UDSAddr.MaxDLC = 8;
var req_data = ..raw.buffer(#data);
for(i=1;#data;1){
req_data[i] = data[i];
}
ret = DllHandle.CAN_UDS_Request(Hwconnected,CANIndex,UDSAddr,req_data,#data);
var res_data = ..raw.buffer(4096);
//sleep(10);
var ret = DllHandle.CAN_UDS_Response(Hwconnected,CANIndex,UDSAddr,res_data,1000);
return ret,2,res_data;
}
}
}
/**intellisense()
usb2canfd = 图莫斯CANFD驱动
usb2canfd.USB2CANHW = USB2CAN库
usb2canfd.USB2CANHW() = 创建设备对象\n!usb2canfdUSB2CANHW.
!usb2canfdUSB2CANHW.LoadDll() = 加载DLL
!usb2canfdUSB2CANHW.FlashHw() = 刷新硬件
!usb2canfdUSB2CANHW.GetDevInfo() = 获取设备信息
!usb2canfdUSB2CANHW.GetAvailableHW() = 获取有效设备需要先FlashHw()刷新
!usb2canfdUSB2CANHW.OpenDevice() = 打开设备
!usb2canfdUSB2CANHW.CloseDevice() = 关闭设备
!usb2canfdUSB2CANHW.isConnected() = 是否已连接
!usb2canfdUSB2CANHW.SendMsg() = 发送报文
!usb2canfdUSB2CANHW.GetMsg() = 接收报文
end intellisense**/

BIN
libusb-1.0.dll Normal file

Binary file not shown.

123
main.aardio Normal file
View File

@ -0,0 +1,123 @@
import win.ui;
/*DSG{{*/
mainForm = win.form(text="CAN_Bootloader";right=599;bottom=399;border="dialog frame";max=false)
mainForm.add(
btnConnect={cls="button";text="连接";left=204;top=64;right=289;bottom=90;z=4};
btnFlash={cls="button";text="开始刷写";left=152;top=180;right=272;bottom=205;z=10};
btnFresh={cls="button";text="刷新";left=204;top=28;right=288;bottom=54;z=2};
btnOpen={cls="button";text="打开文件";left=31;top=180;right=131;bottom=206;z=9};
btnReadF186={cls="button";text="读取当前会话";left=19;top=293;right=118;bottom=321;z=14};
btnReadHw={cls="button";text="读取硬件版本号";left=17;top=263;right=116;bottom=291;z=13};
btnReadSw={cls="button";text="读取软件版本号";left=17;top=233;right=116;bottom=261;z=11};
btnTest={cls="button";text="测试";left=173;top=355;right=272;bottom=383;z=12};
cbbChannel={cls="combobox";left=58;top=64;right=191;bottom=90;edge=1;items={};mode="dropdown";z=3};
cbbDev={cls="combobox";left=58;top=27;right=191;bottom=53;edge=1;items={};mode="dropdown";z=1};
edFile={cls="edit";left=27;top=141;right=281;bottom=165;edge=1;readonly=1;z=8};
edit={cls="edit";left=296;top=8;right=582;bottom=383;edge=1;multiline=1;z=5};
static={cls="static";text="设备";left=1;top=28;right=61;bottom=52;align="center";center=1;transparent=1;z=6};
static2={cls="static";text="通道";left=1;top=66;right=61;bottom=90;align="center";center=1;transparent=1;z=7}
)
/*}}*/
import win;
import usb2canfd;
Display = function(str){
mainForm.edit.print(tostring(time()) + " " + str);
}
CANHw = usb2canfd.USB2CANHW();
var ret = CANHw.LoadDll();
if(ret == 0){
Display("DLL加载成功");
}
mainForm.cbbChannel.add("通道1");
mainForm.cbbChannel.add("通道2");
mainForm.cbbChannel.selIndex = 1
mainForm.btnFresh.oncommand = function(id,event){
mainForm.cbbDev.clear();
var hwnum = CANHw.FlashHw();
if(hwnum == 0){
mainForm.cbbDev.text = "未找到硬件"
}
else {
var allhw = CANHw.GetAvailableHW();
for(i=1;#allhw;1){
mainForm.cbbDev.add(allhw[i].name);
}
}
mainForm.cbbDev.selIndex = 1
::PostThreadMessage(thrdId,100,0,0)//自定义消息
}
mainForm.btnConnect.oncommand = function(id,event){
::PostThreadMessage(thrdId,101,mainForm.cbbDev.selIndex,mainForm.cbbChannel.selIndex - 1)//自定义消息
/*
var ret = CANHw.OpenDevice(mainForm.cbbDev.selIndex,mainForm.cbbChannel.selIndex - 1);//通道为0和1
if(ret == 0){
Display("连接成功");
}
else {
Display("连接失败");
}
*/
}
//CAN通讯线程
import thread.command;
var listener = thread.command();
listener.$Display = function(str){
Display(str);
}
//线程函数
var CanThread = function(){
//线程函数内部要添加自已的import语句
import win;
import console;
console.log("线程开始运行")
loadcodex("\user\CanThread.aardio");//加载线程程序
//在子线程启动消息循环
win.loopMessage(FuncLoopMsg)
}
var DiagReadDID = function(did){
::PostThreadMessage(thrdId,110,did,0)//自定义消息
}
var Diag10Req = function(num){
::PostThreadMessage(thrdId,111,num,0)//自定义消息
}
mainForm.btnReadSw.oncommand = function(id,event){
DiagReadDID(0xF195);
}
mainForm.btnReadHw.oncommand = function(id,event){
DiagReadDID(0xF192);
}
mainForm.btnReadF186.oncommand = function(id,event){
DiagReadDID(0xF186);
}
mainForm.btnTest.oncommand = function(id,event){
Diag10Req(0x03);
}
thrdHandle,thrdId = thread.create( CanThread )
mainForm.show();
return win.loopMessage();

196
user/CanThread.aardio Normal file
View File

@ -0,0 +1,196 @@
import usb2canfd;
import thread.command;
import win.timer;
//初始化CAN句柄对象
CANHw = usb2canfd.USB2CANHW();
CANHw.LoadDll();
DiagReqID = 0x18dadff1;
DiagRespID = 0x18daf1df;
//注册一个消息钩子函数
FuncLoopMsg = function(msg){
//console.log( "收到消息",msg.message );
//console.dumpJson(msg);
select(msg.message) {
case 100 {//刷新硬件
FuncFreshHw();
}
case 101 {
FuncConnect(msg.wParam,msg.lParam);
}
case 102 {
FuncBootload();
}
case 103 {
FuncStop();
}
case 110 {//readDID
FuncReadDID(msg.wParam);
}
case 111 {
FuncReq10(msg.wParam);
}
case 112 {
FuncReq28(msg.wParam);
}
case 113 {
FuncReq85(msg.wParam);
}
case 114 {
FuncReq27(msg.wParam);
}
else {
}
}
}
FuncFreshHw = function(){
var hwnum = CANHw.FlashHw();
if(hwnum == 0){
//mainForm.cbbDev.text = "未找到硬件"
}
else {
FuncDisplay("找到硬件")
}
}
FuncConnect = function(dev,chn){
var ret = CANHw.OpenDevice(dev,chn);
if(ret == 0){
FuncDisplay("连接成功");
}
else {
FuncDisplay("连接失败");
}
}
FuncDisplay = function(str){
thread.command.$Display(str);//"线程" +
}
loadcodex("\user\Diag10code.aardio");
loadcodex("\user\Diag22code.aardio");
loadcodex("\user\Diag85code.aardio");
loadcodex("\user\Diag28code.aardio");
loadcodex("\user\Diag7Fcode.aardio");
var RespState = 0;
FuncDiagPro = function(diagmsg){
//console.log("诊断服务")
//console.dumpJson(diagmsg);
select(diagmsg.sid) {
case 0x50 {
FuncDiag10Pro(table.slice(diagmsg.data,1,diagmsg.len))
}
case 0x62 {
FuncDiag22Pro(table.slice(diagmsg.data,1,diagmsg.len))
}
case 0x67 {
}
case 0x74 {
}
case 0x76 {
}
case 0x68 {
FuncDiag28Pro(table.slice(diagmsg.data,1,diagmsg.len))
}
case 0xC5 {
FuncDiag85Pro(table.slice(diagmsg.data,1,diagmsg.len))
}
case 0x7F {
FuncDiag7FPro(table.slice(diagmsg.data,1,diagmsg.len))
}
else {
}
}
RespState = diagmsg.sid;
}
FuncStop = function(){
stopflag = 1;
}
FuncWait = function(sid){
for(i=1;40;1){
sleep(100);
if(RespState == (sid + 0x40)){//正响应
return 0;
}
errsid,errnrc = FuncGetNrc()
if(errsid == sid){
if(errnrc == 0x78){
FuncClrNrc();//等待
i = 1;
}
else {
return 1; //负响应
}
}
}
}
FuncBootload = function(){
}
timer1 = win.timer(,1);
diagresp = {}
timer1.onTimer = function(){
if(CANHw.isConnected() == false){
return;
}
ret = CANHw.GetMsg();
for(i=1;#ret;1){
//console.log("id = " + tostring(ret[i].id))
if(ret[i].id&0x7FFFFFFF == DiagRespID){
if(ret[i].data[1] == 0x10){//首帧
var data = {0x30,0x00,0x14,0x00,0,0,0,0};
CANHw.SendMsg(DiagReqID,data);
diagresp["sid"] = ret[i].data[3];
diagresp["len"] = ret[i].data[2]-1;
diagresp["data"] = {};
diagresp["next"] = 0x21;
table.append(diagresp["data"],table.slice(ret[i].data,4));
}
elseif(ret[i].data[1] <= 0x06){
//console.dumpJson()
diagresp["sid"] = ret[i].data[2];
diagresp["len"] = ret[i].data[1]-1;
diagresp["data"] = table.slice(ret[i].data,3);
FuncDiagPro(diagresp);
}
elseif(ret[i].data[1] >= 0x21){
if(ret[i].data[1] == diagresp["next"]){
diagresp["next"] += 1;
if(diagresp["next"] >= 0x2F){
diagresp["next"] = 0x20;
}
table.append(diagresp["data"],table.slice(ret[i].data,2));
if(#diagresp["data"] >= diagresp["len"]){
FuncDiagPro(diagresp);
}
}
}
}
}
}
timer1.enable();
FuncDisplay("正在运行");

26
user/Diag10code.aardio Normal file
View File

@ -0,0 +1,26 @@
//发送
FuncReq10 = function(num){
if(num >= 1 && num <= 3){
var data = {0x02,0x10,num,0,0,0,0,0};
CANHw.SendMsg(DiagReqID,data);
}
}
//接收
FuncDiag10Pro = function(data){
//console.dumpJson(data);
select(data[1]) {
case 1 {
FuncDisplay("进入默认会话")
}
case 2 {
FuncDisplay("进入boot会话")
}
case 3 {
FuncDisplay("进入扩展会话")
}
else {
}
}
}

38
user/Diag22code.aardio Normal file
View File

@ -0,0 +1,38 @@
var diag22state = 0;
//发送
FuncReadDID = function(did){
if(CANHw.isConnected() == false){
return;
}
var data = {0x03,0x22,did>>8,did&0xff,0,0,0,0};
CANHw.SendMsg(DiagReqID,data);
diag22state = 1;
}
//接收
FuncDiag22Pro = function(data){
//console.log("诊断22服务")
if(#data < 3){
return;
}
var did = (data[1]<<8) + data[2];
select(did) {
case 0xF192 {
FuncDisplay("硬件版本号");
FuncDisplay(string.pack(table.slice(data,3)));
}
case 0xF195 {
FuncDisplay("软件版本号");
FuncDisplay(string.pack(table.slice(data,3)));
}
case 0xF186 {
FuncDisplay("当前会话: " + tostring(data[3]));
}
case !=0 {
}
else {
}
}
}

25
user/Diag27code.aardio Normal file
View File

@ -0,0 +1,25 @@
//发送
FuncReq27 = function(num){
if(num >= 1 && num <= 3){
var data = {0x02,0x28,num,0,0,0,0,0};
CANHw.SendMsg(DiagReqID,data);
}
}
//接收
FuncDiag27Pro = function(data){
//console.dumpJson(data);
select(data[1]) {
case 1 {
FuncDisplay("使能接收,禁能发送")
}
case 2 {
FuncDisplay("28 - TDB02")
}
case 3 {
FuncDisplay("28 - TDB03")
}
else {
}
}
}

26
user/Diag28code.aardio Normal file
View File

@ -0,0 +1,26 @@
//发送
FuncReq28 = function(num){
if(num >= 1 && num <= 3){
var data = {0x02,0x28,num,0,0,0,0,0};
CANHw.SendMsg(DiagReqID,data);
}
}
//接收
FuncDiag28Pro = function(data){
//console.dumpJson(data);
select(data[1]) {
case 1 {
FuncDisplay("使能接收,禁能发送")
}
case 2 {
FuncDisplay("28 - TDB02")
}
case 3 {
FuncDisplay("28 - TDB03")
}
else {
}
}
}

25
user/Diag7Fcode.aardio Normal file
View File

@ -0,0 +1,25 @@
var errSID=0,errNRC=0;
FuncGetNrc = function(){
return errSID,errNRC;
}
FuncClrNrc = function(){
//return errSID,errNRC;
errSID = 0;
errNRC = 0;
}
//接收
FuncDiag7FPro = function(data){
//console.dumpJson(data);
select(data[2]) {
case 0x78 {
FuncDisplay("服务正忙")
}
else {
FuncDisplay("错误")
}
}
errSID = data[1];
errNRC = data[2];
}

27
user/Diag85code.aardio Normal file
View File

@ -0,0 +1,27 @@
//发送
FuncReq85 = function(num){
if(num >= 1 && num <= 3){
var data = {0x02,0x85,num,0,0,0,0,0};
CANHw.SendMsg(DiagReqID,data);
}
}
//接收
FuncDiag85Pro = function(data){
//console.dumpJson(data);
select(data[1]) {
case 0x01 {
FuncDisplay("DTC - 01")
}
case 0x02 {
FuncDisplay("DTC禁能")
}
case 3 {
FuncDisplay("DTC - 01")
}
else {
FuncDisplay("DTC - TDB")
}
}
}