初版
This commit is contained in:
commit
fe83261e37
BIN
USB2XXX.dll
Normal file
BIN
USB2XXX.dll
Normal file
Binary file not shown.
15
default.aproj
Normal file
15
default.aproj
Normal 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
20
lib/config.aardio
Normal 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
310
lib/usb2canfd.aardio
Normal 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
BIN
libusb-1.0.dll
Normal file
Binary file not shown.
123
main.aardio
Normal file
123
main.aardio
Normal 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
196
user/CanThread.aardio
Normal 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
26
user/Diag10code.aardio
Normal 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
38
user/Diag22code.aardio
Normal 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
25
user/Diag27code.aardio
Normal 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
26
user/Diag28code.aardio
Normal 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
25
user/Diag7Fcode.aardio
Normal 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
27
user/Diag85code.aardio
Normal 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")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user