2249 lines
68 KiB
C#
2249 lines
68 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.ComponentModel;
|
||
using System.Data;
|
||
using System.Drawing;
|
||
using System.IO.Ports;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Windows.Forms;
|
||
using System.IO;
|
||
using System.Threading;
|
||
|
||
using System.Globalization;
|
||
|
||
//using Peak.Can.Basic;
|
||
//using TPCANHandle = System.UInt16;
|
||
//using TPCANBitrateFD = System.String;
|
||
//using TPCANTimestampFD = System.UInt64;
|
||
|
||
|
||
using S19File;
|
||
using Can;
|
||
using UDS;
|
||
|
||
|
||
|
||
namespace CanTool
|
||
{
|
||
|
||
public enum EntrySecurityStatus
|
||
{
|
||
Idle,
|
||
WaitReply,
|
||
|
||
RequestSeedLevel1,
|
||
SendkeyLevel1,
|
||
|
||
RequestSeedLevel2,
|
||
SendkeyLevel2,
|
||
|
||
RequestSeedLevel3,
|
||
SendkeyLevel3,
|
||
|
||
RequestSeedLevel4,
|
||
SendkeyLevel4,
|
||
|
||
Unlock,
|
||
|
||
}
|
||
|
||
|
||
public enum UpdateFileType
|
||
{
|
||
App,
|
||
UI,
|
||
Rectify,
|
||
};
|
||
|
||
|
||
public delegate void UDSReceivedFunc(byte[] data);
|
||
public delegate void DiagRecDataHandleFunc(byte[] data);
|
||
public delegate void UDSUpdateSendFunc();
|
||
|
||
public delegate void CanReadMessageDelegate(UInt32 id, byte[] data, int len);
|
||
|
||
public delegate void ReadDelegateHandler();
|
||
public partial class uds_tools : Form
|
||
{
|
||
|
||
//CAN设备
|
||
CanDevice CanDeviceObj;
|
||
|
||
PcanDevice PcanDeviceObj;
|
||
ToSunDevice ToSumDeviceObj;
|
||
TooMossDevice TooMossDeviceObj;
|
||
ECanDevice GCanDeviceObj;
|
||
ZLGCanDevice ZLGCanDeviceObj;
|
||
|
||
UDSInfo UDSInfo;
|
||
|
||
|
||
|
||
//功能寻址和物理寻址切换
|
||
public static byte CANIF_FUC_ON_Flag = 0;
|
||
|
||
|
||
//升级数据CRC校验值
|
||
public static uint CRCValue = 0;
|
||
|
||
|
||
/*发送帧类型*/
|
||
public int SendMsg_Len = 0;/*发送帧的长度*/
|
||
public byte[] SendBuff;/*发送帧的数据buff*/
|
||
public short BuffOffset = 0;/*发送数组偏移量*/
|
||
public byte CF_SN = 0x00;/*连续帧 SN*/
|
||
|
||
|
||
//报文log
|
||
private StringBuilder MessagesLog;
|
||
|
||
//打印报文的线程
|
||
private Thread PrintfMessageLogThread;
|
||
//锁
|
||
private Object PrintfMessageLogLockObj;
|
||
|
||
|
||
public static byte BlockIndex = 0x01;/*下载块的下标*/
|
||
public static byte UpdataFileFlag = 0;/*升级文件标志位区别下载文件*/
|
||
public static byte UpdataFlag = 0;/*升级数据发送完成标志*/
|
||
public static int FileOffset = 0;/*升级数组偏移量*/
|
||
|
||
|
||
|
||
|
||
public static string str_test = "";
|
||
|
||
|
||
//private EntrySecurityStatus EntrySecurityFlag = EntrySecurityStatus.Idle;
|
||
private EntrySecurityStatus EntrySecurityFlag = EntrySecurityStatus.Idle;
|
||
|
||
|
||
|
||
public static byte ReadDiaData = 0;
|
||
byte[] diagData = new byte[40];
|
||
|
||
public string srShowVer = "";
|
||
|
||
/*安全算法种子*/
|
||
public static byte[] RecvSeed = new byte[16];
|
||
|
||
|
||
public byte[] FlashDataBuff; //flashdriver数据
|
||
public byte[] AppDataBuff; //App文件数据
|
||
public byte[] UIDataBuff; //UI文件数据
|
||
public byte[] RectifyDataBuff; //矫正文件数据
|
||
|
||
//
|
||
public static byte[] FlashDriveUpdateStartAddr = new byte[4];
|
||
public static byte[] FlashDriveUpdateDataSize = new byte[4];
|
||
public static byte[] UIFlashDriveUpdateStartAddr = new byte[4];
|
||
public static byte[] AppUpdateStartAddr = new byte[4];
|
||
public static byte[] AppUpdateDataSize = new byte[4];
|
||
public static byte[] UIUpdateStartAddr = new byte[4];
|
||
public static byte[] UIUpdateDataSize = new byte[4];
|
||
public static byte[] RectifyUpdateStartAddr = new byte[4];
|
||
public static byte[] RectifyUpdateDataSize = new byte[4];
|
||
|
||
//升级文件的类型
|
||
public static UpdateFileType UpdateFileType = new UpdateFileType();
|
||
|
||
|
||
public static uint timeEscape = 0;
|
||
|
||
public static uint FlashCheckSum = 0;
|
||
public static uint AppCheckSum = 0;
|
||
public static uint UiCheckSum = 0;
|
||
public static uint RectifyCheckSum = 0;
|
||
|
||
|
||
|
||
public static int UpdateFileTotalBytes = 0;
|
||
public static int UpdateFileSendBytes = 0;
|
||
|
||
|
||
|
||
//升级接收表驱动
|
||
public Dictionary<byte, UDSReceivedFunc> UDSReceivedTable = new Dictionary<byte, UDSReceivedFunc>();
|
||
|
||
//自诊断故障码对应文字说明表
|
||
public Dictionary<UInt16, string> selfDiagFaultType;
|
||
|
||
|
||
List<CanMessage> CanMessageSendTable;
|
||
|
||
public uds_tools()
|
||
{
|
||
InitializeComponent();
|
||
|
||
this.StartPosition = FormStartPosition.CenterScreen;
|
||
|
||
//创建CAN设备
|
||
CanDeviceObj = new CanDevice();
|
||
PcanDeviceObj = new PcanDevice();
|
||
ToSumDeviceObj = new ToSunDevice();
|
||
TooMossDeviceObj = new TooMossDevice();
|
||
GCanDeviceObj = new ECanDevice();
|
||
ZLGCanDeviceObj = new ZLGCanDevice();
|
||
|
||
|
||
UDSInfo = new UDSInfo();
|
||
|
||
//报文log
|
||
MessagesLog = new StringBuilder();
|
||
//锁
|
||
PrintfMessageLogLockObj = new Object();
|
||
//打印报文线程
|
||
PrintfMessageLogThread = new Thread(new ThreadStart(PrintfMessageLog));
|
||
PrintfMessageLogThread.Start();
|
||
|
||
|
||
CanMessageSendTable = new List<CanMessage>();
|
||
|
||
cbbDeviceType.SelectedIndex = 2; // 默认选择GC CAN
|
||
cbbIdFilterSelect.SelectedIndex = 1;
|
||
|
||
cbbCarType.SelectedIndex = 0;
|
||
|
||
|
||
|
||
|
||
//诊断服务接收表初始化
|
||
DiagReceivedTableInit();
|
||
|
||
//升级配置参数初始化
|
||
UpdateConfigParamsInit();
|
||
|
||
//诊断参数初始化
|
||
DiagParamsInit();
|
||
}
|
||
|
||
private void btClrDia_Load(object sender, EventArgs e)
|
||
{
|
||
|
||
rbtnAppSelect.Checked = true;
|
||
|
||
ckbIsCycleReceive.Checked = true;
|
||
|
||
ckbIsEventReceive.Checked = false;
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
private void CanToolForm_FormClosed(object sender, FormClosedEventArgs e)
|
||
{
|
||
//关闭打印线程
|
||
PrintfMessageLogThread.Abort();
|
||
}
|
||
|
||
|
||
|
||
/*显示否定响应信息*/
|
||
private void NegativeResponeseDisplay(byte[] data)
|
||
{
|
||
bool isPrintf = true;
|
||
string str = "";
|
||
switch (data[2])
|
||
{
|
||
case 0x10:
|
||
str = data[1].ToString("x") + " " + data[3].ToString("x") + " 否定响应:一般性拒绝\n";
|
||
break;
|
||
case 0x11:
|
||
str = data[1].ToString("x") + " " + data[3].ToString("x") + " 否定响应:服务不支持\n";
|
||
break;
|
||
case 0x12:
|
||
str = data[1].ToString("x") + " " + data[3].ToString("x") + " 否定响应:子功能不支持\n";
|
||
break;
|
||
case 0x13:
|
||
str = data[1].ToString("x") + " " + data[3].ToString("x") + " 否定响应:报文长度错误\n";
|
||
break;
|
||
case 0x14:
|
||
str = data[1].ToString("x") + " " + data[3].ToString("x") + " 否定响应:应答太长\n";
|
||
break;
|
||
case 0x22:
|
||
str = data[1].ToString("x") + " " + data[3].ToString("x") + " 否定响应:条件不正确\n";
|
||
break;
|
||
case 0x24:
|
||
str = data[1].ToString("x") + " " + data[3].ToString("x") + " 否定响应:请求次序错误\n";
|
||
break;
|
||
case 0x25:
|
||
str = data[1].ToString("x") + " " + data[3].ToString("x") + " 否定响应:子网部件无响应\n";
|
||
break;
|
||
case 0x31:
|
||
str = data[1].ToString("x") + " " + data[3].ToString("x") + " 否定响应:请求超出范围\n";
|
||
break;
|
||
case 0x33:
|
||
str = data[1].ToString("x") + " " + data[3].ToString("x") + " 否定响应:安全访问未通过\n";
|
||
break;
|
||
case 0x35:
|
||
str = data[1].ToString("x") + " " + data[3].ToString("x") + " 否定响应:密钥无效\n";
|
||
break;
|
||
case 0x36:
|
||
str = data[1].ToString("x") + " " + data[3].ToString("x") + " 否定响应:超过最大允许尝试次数\n";
|
||
break;
|
||
case 0x37:
|
||
str = data[1].ToString("x") + " " + data[3].ToString("x") + " 否定响应:要求的延时未结束\n";
|
||
break;
|
||
case 0x70:
|
||
str = data[1].ToString("x") + " " + data[3].ToString("x") + " 否定响应:上传/下载不能接受\n";
|
||
break;
|
||
case 0x71:
|
||
str = data[1].ToString("x") + " " + data[3].ToString("x") + " 否定响应:数据传输暂停\n";
|
||
break;
|
||
case 0x72:
|
||
str = data[1].ToString("x") + " " + data[3].ToString("x") + " 否定响应:一般性编程失败\n";
|
||
break;
|
||
case 0x73:
|
||
str = data[1].ToString("x") + " " + data[3].ToString("x") + " 否定响应:错误的序列模块计数\n";
|
||
break;
|
||
case 0x78:
|
||
//byte[] temp = new byte[2]{0x3e, 0x80};
|
||
//UDSInfo.SendPackage(temp, temp.Length, false);
|
||
isPrintf = false;
|
||
break;
|
||
case 0x7E:
|
||
str = data[1].ToString("x") + " " + data[3].ToString("x") + " 否定响应:当前会话下子功能不支持\n";
|
||
break;
|
||
case 0x7f:
|
||
str = data[2].ToString("x") + " " + data[3].ToString("x") + " 否定响应:当前会话下服务不支持\n";
|
||
break;
|
||
default:
|
||
isPrintf = false;
|
||
break;
|
||
|
||
}
|
||
|
||
if (isPrintf)
|
||
{
|
||
rtxtLog.AppendText(str);
|
||
}
|
||
|
||
}
|
||
/*
|
||
//选择CAN波特率
|
||
private void cbbBaudrates_SelectedIndexChanged(object sender, EventArgs e)
|
||
{
|
||
// Saves the current selected baudrate register code
|
||
switch (cbbBaudrates.SelectedIndex)
|
||
{
|
||
case 0:
|
||
m_Baudrate = TPCANBaudrate.PCAN_BAUD_1M;
|
||
break;
|
||
case 1:
|
||
m_Baudrate = TPCANBaudrate.PCAN_BAUD_800K;
|
||
break;
|
||
case 2:
|
||
m_Baudrate = TPCANBaudrate.PCAN_BAUD_500K;
|
||
break;
|
||
case 3:
|
||
m_Baudrate = TPCANBaudrate.PCAN_BAUD_250K;
|
||
break;
|
||
case 4:
|
||
m_Baudrate = TPCANBaudrate.PCAN_BAUD_125K;
|
||
break;
|
||
case 5:
|
||
m_Baudrate = TPCANBaudrate.PCAN_BAUD_100K;
|
||
break;
|
||
case 6:
|
||
m_Baudrate = TPCANBaudrate.PCAN_BAUD_95K;
|
||
break;
|
||
case 7:
|
||
m_Baudrate = TPCANBaudrate.PCAN_BAUD_83K;
|
||
break;
|
||
case 8:
|
||
m_Baudrate = TPCANBaudrate.PCAN_BAUD_50K;
|
||
break;
|
||
case 9:
|
||
m_Baudrate = TPCANBaudrate.PCAN_BAUD_47K;
|
||
break;
|
||
case 10:
|
||
m_Baudrate = TPCANBaudrate.PCAN_BAUD_33K;
|
||
break;
|
||
case 11:
|
||
m_Baudrate = TPCANBaudrate.PCAN_BAUD_20K;
|
||
break;
|
||
case 12:
|
||
m_Baudrate = TPCANBaudrate.PCAN_BAUD_10K;
|
||
break;
|
||
case 13:
|
||
m_Baudrate = TPCANBaudrate.PCAN_BAUD_5K;
|
||
break;
|
||
}
|
||
}
|
||
|
||
private void SetConnectionStatus(bool bConnected)
|
||
{
|
||
|
||
btnInit.Enabled = !bConnected;
|
||
|
||
cbbDeviceType.Enabled = !bConnected;
|
||
cbbBaudrates.Enabled = !bConnected;
|
||
|
||
if (!bConnected)
|
||
cbbChannel_SelectedIndexChanged(this, new EventArgs());
|
||
}
|
||
*/
|
||
|
||
|
||
|
||
|
||
|
||
//CAN设备发送报文
|
||
private void CanDeviceSendMessage(UInt32 id, byte[] data, int len, bool isFd)
|
||
{
|
||
if (false == isFd)
|
||
{
|
||
CanDeviceObj.CanSendMessage(id, data, len);
|
||
}
|
||
else
|
||
{
|
||
CanDeviceObj.CanFdSendMessage(id, data, len);
|
||
}
|
||
|
||
}
|
||
|
||
//委托给UDS的函数
|
||
private void UdsSendMessage(UInt32 id, byte[] data, int len)
|
||
{
|
||
CanDeviceSendMessage(id, data, len, this.ckbIsCanFd.Checked);
|
||
PrintfMessageLog("TX", id, data, len);
|
||
}
|
||
|
||
|
||
//CAN设备初始化
|
||
private int CanDeviceInit()
|
||
{
|
||
string retInfo;
|
||
UInt32 idfilterStart;
|
||
UInt32 idfilterEnd;
|
||
|
||
try
|
||
{
|
||
idfilterStart = Convert.ToUInt32(txtIdFilterStrat.Text, 16);
|
||
idfilterEnd = Convert.ToUInt32(txtIdFilterEnd.Text, 16);
|
||
}
|
||
catch
|
||
{
|
||
MessageBox.Show("ID过滤器值输入有误", "提示");
|
||
return 1;
|
||
}
|
||
|
||
//区分不同的CAN设备
|
||
if ("PCAN" == cbbDeviceType.Text)
|
||
{
|
||
CanDeviceObj = PcanDeviceObj;
|
||
}
|
||
else if ("TOSUN" == cbbDeviceType.Text)
|
||
{
|
||
CanDeviceObj = ToSumDeviceObj;
|
||
}
|
||
else if ("TOOMOSS" == cbbDeviceType.Text)
|
||
{
|
||
CanDeviceObj = TooMossDeviceObj;
|
||
}
|
||
else if("GC_USBCAN_II" == cbbDeviceType.Text) // 广成CAN
|
||
{
|
||
CanDeviceObj = GCanDeviceObj;
|
||
}
|
||
else if("ZLG_USBCAN-II" == cbbDeviceType.Text) // ZLG_USBCAN-II
|
||
{
|
||
CanDeviceObj = ZLGCanDeviceObj;
|
||
}
|
||
else
|
||
{
|
||
MessageBox.Show("设备选择错误", "提示");
|
||
return 1;
|
||
}
|
||
|
||
//区分标准CAN和CANFD
|
||
if (false == ckbIsCanFd.Checked)
|
||
{
|
||
//CAN初始化
|
||
retInfo = CanDeviceObj.CanInit();
|
||
//设置ID过滤器
|
||
CanDeviceObj.CanSetFilter(idfilterStart, idfilterEnd);
|
||
|
||
|
||
//是否开启事件接收
|
||
if ((true == ckbIsEventReceive.Checked)
|
||
&& ("OK" == retInfo)
|
||
)
|
||
{
|
||
//注册接受报文事件
|
||
CanDeviceObj.RegisterCanReadEvent(CanAnalysisData);
|
||
//使能接收事件
|
||
CanDeviceObj.CanReceiveEventEnable();
|
||
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
//CAN初始化
|
||
retInfo = CanDeviceObj.CanFdInit();
|
||
//设置ID过滤器
|
||
CanDeviceObj.CanFdSetFilter(idfilterStart, idfilterEnd);
|
||
|
||
//是否开启事件接收
|
||
if ((true == ckbIsEventReceive.Checked)
|
||
&& ("OK" == retInfo)
|
||
)
|
||
{
|
||
//注册接受报文事件
|
||
CanDeviceObj.RegisterCanReadEvent(CanAnalysisData);
|
||
//使能接收事件
|
||
CanDeviceObj.CanFdReceiveEventEnable();
|
||
}
|
||
|
||
}
|
||
|
||
|
||
if ("OK" == retInfo)
|
||
{
|
||
return 0;
|
||
}
|
||
else
|
||
{
|
||
MessageBox.Show(retInfo, "连接失败");
|
||
return 1;
|
||
}
|
||
|
||
}
|
||
|
||
//CAN设备逆初始化
|
||
private int CanDeviceDeInit()
|
||
{
|
||
string ret;
|
||
|
||
|
||
|
||
//区分标准CAN和CANFD
|
||
if (false == ckbIsCanFd.Checked)
|
||
{
|
||
ret = CanDeviceObj.CanDeInit();
|
||
}
|
||
else
|
||
{
|
||
ret = CanDeviceObj.CanFdDeInit();
|
||
}
|
||
|
||
if ("OK" == ret)
|
||
{
|
||
//区分标准CAN和CANFD
|
||
if (false == ckbIsCanFd.Checked)
|
||
{
|
||
//失能接收事件
|
||
CanDeviceObj.CanReceiveEventDisable();
|
||
}
|
||
else
|
||
{
|
||
//失能接收事件
|
||
CanDeviceObj.CanFdReceiveEventDisable();
|
||
}
|
||
|
||
//删除事件
|
||
CanDeviceObj.UnregisterCanReadEventAll();
|
||
return 0;
|
||
}
|
||
else
|
||
{
|
||
MessageBox.Show(ret, "断开连接失败");
|
||
return 1;
|
||
}
|
||
}
|
||
|
||
|
||
//连接CAN设备时 需要一些控件为使能或失能的状态
|
||
private void ConnectControlEnable()
|
||
{
|
||
ckbIsCanFd.Enabled = false;
|
||
cbbDeviceType.Enabled = false;
|
||
btnConnect.Enabled = false;
|
||
cbbCarType.Enabled = false;
|
||
|
||
txtIdFilterStrat.Enabled = false;
|
||
txtIdFilterEnd.Enabled = false;
|
||
|
||
//周期接收选项
|
||
ckbIsCycleReceive.Enabled = false;
|
||
//事件接收选项
|
||
ckbIsEventReceive.Enabled = false;
|
||
//使能10ms定时器解析接收报文
|
||
timerReadMsg.Enabled = true;
|
||
timerSendMsg.Enabled = true;
|
||
timerUDS.Enabled = true;
|
||
btnRelease.Enabled = true;
|
||
|
||
cbbCarType.Enabled = false;
|
||
}
|
||
|
||
//断开CAN设备时 需要一些控件为使能或失能的状态
|
||
private void UnconnectControlEnable()
|
||
{
|
||
ckbIsCanFd.Enabled = true;
|
||
timerReadMsg.Enabled = false;
|
||
btnRelease.Enabled = false;
|
||
|
||
btnConnect.Enabled = true;
|
||
cbbDeviceType.Enabled = true;
|
||
|
||
cbbCarType.Enabled = true;
|
||
|
||
//周期接收选项
|
||
ckbIsCycleReceive.Enabled = true;
|
||
//事件接收选项
|
||
ckbIsEventReceive.Enabled = true;
|
||
|
||
txtIdFilterStrat.Enabled = true;
|
||
txtIdFilterEnd.Enabled = true;
|
||
}
|
||
|
||
|
||
private void CarTypeConfig()
|
||
{
|
||
switch (cbbCarType.Text)
|
||
{
|
||
case "鸿日":
|
||
UpdateConfigParamsNow = UpdateConfigParamsHR;
|
||
ReadVersionConfigNow = ReadVersionConfigHR;
|
||
break;
|
||
|
||
case "比亚迪":
|
||
UpdateConfigParamsNow = UpdateConfigParamsBYD;
|
||
ReadVersionConfigNow = ReadVersionConfigBYD;
|
||
break;
|
||
default:
|
||
UpdateConfigParamsNow = UpdateConfigParamsHR;
|
||
ReadVersionConfigNow = ReadVersionConfigHR;
|
||
break;
|
||
|
||
}
|
||
}
|
||
|
||
|
||
//连接
|
||
private void btnConnect_Click(object sender, EventArgs e)
|
||
{
|
||
|
||
//CAN设备初始化
|
||
if (0 == CanDeviceInit())
|
||
{
|
||
rtxtLog.AppendText("连接设备成功\n");
|
||
ConnectControlEnable();
|
||
}
|
||
else
|
||
{
|
||
rtxtLog.AppendText("连接设备失败\n");
|
||
return;
|
||
}
|
||
|
||
|
||
//根据选择的车厂进行配置
|
||
CarTypeConfig();
|
||
|
||
//加载读取版本号的表
|
||
LoadVersionToView();
|
||
|
||
ckbIsCrcLsb.Checked = this.UpdateConfigParamsNow.CrcIsLsb;
|
||
|
||
//UDS设置ID
|
||
UDSInfo.SetId(this.UpdateConfigParamsNow.CANPhyDevRxId, this.UpdateConfigParamsNow.CANPhyDevTxId, this.UpdateConfigParamsNow.CANFuncDevRxId);
|
||
UDSInfo.SetCANDL(8); // 设置每包数据最长多少个字节
|
||
//UDS注册发送和接受事件
|
||
UDSInfo.UnregisterReceivedPackageEventAll();
|
||
UDSInfo.RegisterReceivedPackageEvent(UDSReceivedPackage);
|
||
|
||
//UDS注册发送报文
|
||
UDSInfo.UnregisterSendMessageEventAll();
|
||
UDSInfo.RegisterSendMessageEvent(UdsSendMessage);
|
||
|
||
|
||
SendBuff = new byte[this.UpdateConfigParamsNow.UDSMsgLengthMax + 4];
|
||
|
||
|
||
//cobCarType.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());
|
||
|
||
}
|
||
|
||
//断开连接
|
||
private void btnRelease_Click(object sender, EventArgs e)
|
||
{
|
||
|
||
if (0 == CanDeviceDeInit())
|
||
{
|
||
UnconnectControlEnable();
|
||
}
|
||
else
|
||
{
|
||
|
||
}
|
||
|
||
}
|
||
|
||
//加载可以读取的版本号到界面显示
|
||
private void LoadVersionToView()
|
||
{
|
||
ListViewItem listViewItem;
|
||
|
||
|
||
foreach(VersionParams versionParams in ReadVersionConfigNow.VersionParamsTable)
|
||
{
|
||
listViewItem = new ListViewItem();
|
||
//版本号说明
|
||
listViewItem.Text = versionParams.VersionComment;
|
||
listViewItem.SubItems.Add("");
|
||
|
||
}
|
||
|
||
}
|
||
|
||
//打印报文Log 将打印的数据添加进缓存区
|
||
private void PrintfMessageLog(string dir, UInt32 id, byte[] data, int len)
|
||
{
|
||
//string str;
|
||
StringBuilder str;
|
||
|
||
bool isPrintf = false;
|
||
|
||
if ((0 != id)
|
||
&& (1 != id)
|
||
&& (0 != cbbIdFilterSelect.SelectedIndex)
|
||
)
|
||
{
|
||
//显示所有报文
|
||
if (1 == cbbIdFilterSelect.SelectedIndex)
|
||
{
|
||
isPrintf = true;
|
||
}
|
||
//为诊断的ID
|
||
else if ((id == this.UpdateConfigParamsNow.CANPhyDevTxId)
|
||
|| (id == this.UpdateConfigParamsNow.CANPhyDevRxId)
|
||
|| (id == this.UpdateConfigParamsNow.CANFuncDevRxId)
|
||
)
|
||
{
|
||
//显示诊断报文
|
||
if (2 == cbbIdFilterSelect.SelectedIndex)
|
||
{
|
||
isPrintf = true;
|
||
}
|
||
}
|
||
//显示非诊断ID
|
||
else if (3 == cbbIdFilterSelect.SelectedIndex)
|
||
{
|
||
isPrintf = true;
|
||
}
|
||
|
||
}
|
||
|
||
//需要打印报文
|
||
if (isPrintf)
|
||
{
|
||
str = new StringBuilder();
|
||
|
||
str.Append(string.Format("{0} {1} 0x{2:X3} ", GetTimeStamp(), dir, id));
|
||
for (int i = 0; i < len; i++)
|
||
{
|
||
str.Append(string.Format("0x{0:X2} ", data[i]));
|
||
}
|
||
str.Append("\r\n");
|
||
|
||
|
||
/*
|
||
str = string.Format("{0} {1} 0x{2:X3} 0x{3:X2} 0x{4:X2} 0x{5:X2} 0x{6:X2} 0x{7:X2} 0x{8:X2} 0x{9:X2} 0x{10:X2} \r\n",
|
||
GetTimeStamp(), dir, id, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);
|
||
*/
|
||
|
||
//锁 在另一个线程取链表的值打印
|
||
lock (PrintfMessageLogLockObj)
|
||
{
|
||
MessagesLog.Append(str.ToString());
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
|
||
//将缓存区的数据打印到控件的线程
|
||
private void PrintfMessageLog()
|
||
{
|
||
bool IsPrintf = false;
|
||
string Messagelog = "";
|
||
string[] MessagelogArr = new string[0];
|
||
|
||
|
||
while (true)
|
||
{
|
||
//锁 在另一个线程中添加报文文本
|
||
lock (PrintfMessageLogLockObj)
|
||
{
|
||
if (0 != MessagesLog.Length)
|
||
{
|
||
Messagelog = MessagesLog.ToString();
|
||
MessagesLog.Clear();
|
||
IsPrintf = true;
|
||
}
|
||
}
|
||
|
||
//是否需要打印
|
||
if (IsPrintf)
|
||
{
|
||
IsPrintf = false;
|
||
|
||
Invoke((EventHandler)delegate
|
||
{
|
||
rtxtMessagesLog.AppendText(Messagelog);
|
||
//rtxtMessagesLog.Focus();
|
||
});
|
||
}
|
||
|
||
Thread.Sleep(100);
|
||
}
|
||
|
||
}
|
||
|
||
|
||
//编辑好后添加发送报文
|
||
private void AddSendMessage(UInt32 id, byte[] data, int len)
|
||
{
|
||
StringBuilder strBuilder = new StringBuilder();
|
||
ListViewItem listViewItem = new ListViewItem();
|
||
|
||
|
||
//界面增加
|
||
listViewItem.Text = string.Format("{0:X}", id);
|
||
listViewItem.SubItems.Add(len.ToString());
|
||
|
||
for (int i = 0; i < len; i++)
|
||
{
|
||
strBuilder.Append(string.Format("{0:X2} ", data[i]));
|
||
}
|
||
listViewItem.SubItems.Add(strBuilder.ToString());
|
||
lsvSendMessagesTable.Items.Add(listViewItem);
|
||
|
||
//实际使用的数据增加
|
||
CanMessageSendTable.Add(new CanMessage(id, data, len, true));
|
||
}
|
||
|
||
|
||
//编辑发送报文
|
||
private void EditSendMessage(UInt32 id, byte[] data, int len)
|
||
{
|
||
StringBuilder strBuilder = new StringBuilder();
|
||
ListViewItem listViewItem = new ListViewItem();
|
||
|
||
int index;
|
||
|
||
if (lsvSendMessagesTable.SelectedItems.Count != 0)
|
||
{
|
||
index = lsvSendMessagesTable.SelectedItems[0].Index;
|
||
|
||
//界面修改
|
||
listViewItem.Text = string.Format("{0:X}", id);
|
||
listViewItem.SubItems.Add(len.ToString());
|
||
|
||
for (int i = 0; i < len; i++)
|
||
{
|
||
strBuilder.Append(string.Format("{0:X2} ", data[i]));
|
||
}
|
||
listViewItem.SubItems.Add(strBuilder.ToString());
|
||
|
||
lsvSendMessagesTable.Items[index] = listViewItem;
|
||
|
||
|
||
//实际使用的数据修改
|
||
CanMessageSendTable[index] = new CanMessage(id, data, len, true);
|
||
|
||
}
|
||
|
||
}
|
||
|
||
//打开编辑界面增加发送报文
|
||
private void tsmiEditMessage_Click(object sender, EventArgs e)
|
||
{
|
||
MessageConfigForm form;
|
||
|
||
CanMessage msg;
|
||
int index;
|
||
|
||
if (lsvSendMessagesTable.SelectedItems.Count != 0)
|
||
{
|
||
index = lsvSendMessagesTable.SelectedItems[0].Index;
|
||
|
||
//获取发送报文表中的数据
|
||
msg = CanMessageSendTable[index];
|
||
|
||
//传入给编辑窗口
|
||
form = new MessageConfigForm(msg.Id, msg.Data, msg.Len);
|
||
//添加事件
|
||
form.MessageReturn = EditSendMessage;
|
||
|
||
form.ShowDialog();
|
||
}
|
||
}
|
||
|
||
//打开编辑界面编辑发送报文
|
||
private void tsmiAddMessage_Click(object sender, EventArgs e)
|
||
{
|
||
MessageConfigForm form = new MessageConfigForm();
|
||
|
||
form.MessageReturn = AddSendMessage;
|
||
|
||
form.ShowDialog();
|
||
|
||
}
|
||
|
||
//在发送报文列表中删除选中的报文
|
||
private void tsmiDeleteMessage_Click(object sender, EventArgs e)
|
||
{
|
||
int index;
|
||
|
||
if (lsvSendMessagesTable.SelectedItems.Count != 0)
|
||
{
|
||
index = lsvSendMessagesTable.SelectedItems[0].Index;
|
||
//UI显示删除
|
||
lsvSendMessagesTable.Items.RemoveAt(index);
|
||
|
||
//实际使用的数据删除
|
||
CanMessageSendTable.RemoveAt(index);
|
||
}
|
||
|
||
}
|
||
|
||
//双击发送报文列表中的报文发送
|
||
private void lsvSendMessagesTable_DoubleClick(object sender, EventArgs e)
|
||
{
|
||
CanMessage msg;
|
||
|
||
int index;
|
||
|
||
|
||
if (lsvSendMessagesTable.SelectedItems.Count != 0)
|
||
{
|
||
index = lsvSendMessagesTable.SelectedItems[0].Index;
|
||
|
||
msg = CanMessageSendTable[index];
|
||
|
||
CanDeviceSendMessage(msg.Id, msg.Data, msg.Len, ckbIsCanFd.Checked);
|
||
//打印报文
|
||
PrintfMessageLog("TX", msg.Id, msg.Data, msg.Len);
|
||
}
|
||
}
|
||
|
||
//保存报文Log的数据
|
||
private void SaveMessagesLog()
|
||
{
|
||
string txtFile = "";
|
||
DateTime dt = DateTime.Now;
|
||
|
||
txtFile = System.Environment.CurrentDirectory + "\\" + dt.ToString("yyyy-MM-dd HH-mm-ss ") + System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + "Log" + ".txt";
|
||
|
||
System.IO.StreamWriter sw = new System.IO.StreamWriter(txtFile, true, Encoding.Unicode);
|
||
sw.Write(rtxtMessagesLog.Text);
|
||
sw.Flush();
|
||
sw.Close();
|
||
MessageBox.Show(txtFile + "文件保存成功!", "保存文件");
|
||
}
|
||
|
||
|
||
|
||
//清除报文Log
|
||
private void ToolStripMenuItem_Click(object sender, EventArgs e)
|
||
{
|
||
rtxtMessagesLog.Clear();
|
||
}
|
||
|
||
//保存报文
|
||
private void SaveLogToolStripMenuItem_Click(object sender, EventArgs e)
|
||
{
|
||
SaveMessagesLog();
|
||
}
|
||
|
||
|
||
//查看全部报文
|
||
private void tsmiLookAllMessagesLog_Click(object sender, EventArgs e)
|
||
{
|
||
cbbIdFilterSelect.SelectedIndex = 1;
|
||
}
|
||
|
||
//查看诊断报文
|
||
private void tsmiLookDiagMessagesLog_Click(object sender, EventArgs e)
|
||
{
|
||
cbbIdFilterSelect.SelectedIndex = 2;
|
||
}
|
||
|
||
//查看应用报文
|
||
private void tsmiLookAppMessagesLog_Click(object sender, EventArgs e)
|
||
{
|
||
cbbIdFilterSelect.SelectedIndex = 3;
|
||
}
|
||
|
||
//暂停所有报文
|
||
private void tsmiMessagesLogStop_Click(object sender, EventArgs e)
|
||
{
|
||
cbbIdFilterSelect.SelectedIndex = 0;
|
||
}
|
||
|
||
//清除log
|
||
private void tsmiLogClear_Click(object sender, EventArgs e)
|
||
{
|
||
rtxtLog.Clear();
|
||
}
|
||
|
||
|
||
|
||
private void CanAnalysisData(UInt32 id, byte[] data, int len)
|
||
{
|
||
if (this.InvokeRequired)
|
||
{
|
||
//CanReadMessageDelegate canReadDelegate = new CanReadMessageDelegate(ReceivedProcessMessage);
|
||
CanReadMessageDelegate canReadDelegate = new CanReadMessageDelegate(ReceivedMessage);
|
||
try
|
||
{
|
||
//this.Invoke(canReadDelegate, new object[] { id, data });
|
||
this.Invoke(canReadDelegate, new object[] { id, data ,len});
|
||
}
|
||
catch
|
||
{
|
||
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
ReceivedMessage(id, data, len);
|
||
//ReceivedProcessMessage(id, data);
|
||
}
|
||
}
|
||
|
||
private void ReadMessages()
|
||
{
|
||
UInt32 id = 0;
|
||
byte[] data = new byte[64];
|
||
|
||
int len = 0;
|
||
|
||
if (false == ckbIsCanFd.Checked)
|
||
{
|
||
while (true == CanDeviceObj.CanReadMessage(ref id, data, ref len))
|
||
{
|
||
CanAnalysisData(id, data, len);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
while (true == CanDeviceObj.CanFdReadMessage(ref id, data, ref len))
|
||
{
|
||
CanAnalysisData(id, data, len);
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
|
||
private void DiagVersionDisplay(byte[] data, int len)
|
||
{
|
||
int index;
|
||
string versionComment;
|
||
string version;
|
||
|
||
UInt16 did;
|
||
byte[] paramsArr;
|
||
|
||
if (len < 3)
|
||
{
|
||
return;
|
||
}
|
||
|
||
paramsArr = new byte[len - 3];
|
||
|
||
//获取did
|
||
did = (UInt16)(data[1] << 8 | data[2]);
|
||
|
||
Array.Copy(data, 3, paramsArr, 0, len - 3);
|
||
|
||
//查找对应的项
|
||
index = ReadVersionConfigNow.IndexOf(data[0], did, paramsArr);
|
||
versionComment = ReadVersionConfigNow.GetVersionComment(index);
|
||
|
||
//获取信息
|
||
version = ReadVersionConfigNow.AnalysisVersion(index, data, (UInt32)len);
|
||
|
||
if (version != "")
|
||
{
|
||
//打印到log
|
||
rtxtLog.AppendText(string.Format("{0}:{1}\n", versionComment, version));
|
||
|
||
|
||
}
|
||
}
|
||
|
||
private void UdsOtherInfo(byte[] data, int len)
|
||
{
|
||
//单帧
|
||
if (len <= 7)
|
||
{
|
||
switch (data[0])
|
||
{
|
||
case 0x6f:
|
||
|
||
|
||
break;
|
||
case 0x62:
|
||
switch (data[1])
|
||
{
|
||
case 0x0E:
|
||
switch (data[2])
|
||
{
|
||
case 0x21:// 22 0E 21
|
||
|
||
break;
|
||
case 0x39:// 22 0e 39
|
||
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
break;
|
||
case 0x6E:
|
||
switch (data[1])
|
||
{
|
||
case 0x0E:
|
||
switch (data[2])
|
||
{
|
||
case 0x05:// 2E 0E 05 01
|
||
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
break;
|
||
case 0xF1:
|
||
switch (data[2])
|
||
{
|
||
case 0x8C:// 2E F1 8C
|
||
break;
|
||
default:
|
||
break;
|
||
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
switch (data[0])
|
||
{
|
||
case 0x62:
|
||
switch (data[1])
|
||
{
|
||
case 0x0E:
|
||
switch (data[2])
|
||
{
|
||
case 0x00:// 22 0E 00
|
||
break;
|
||
case 0x02: // 22 0E 02
|
||
break;
|
||
case 0x16: // 22 0E 16
|
||
break;
|
||
case 0x17: // 22 0E 17
|
||
break;
|
||
case 0x18: // 22 0E 18
|
||
|
||
break;
|
||
case 0x20:// 22 0E 20
|
||
|
||
break;
|
||
case 0x38:// 22 0e 38
|
||
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
break;
|
||
case 0xF0:
|
||
switch (data[2])
|
||
{
|
||
case 0x10:// 22 F0 10
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
break;
|
||
case 0xF1:
|
||
switch (data[2])
|
||
{
|
||
case 0x80:// 22 F1 80
|
||
if (len == 13)
|
||
{
|
||
|
||
}
|
||
break;
|
||
case 0x81:// 22 F1 81
|
||
if (len == 13)
|
||
{
|
||
|
||
}
|
||
break;
|
||
case 0x82:// 22 F1 82
|
||
if (len == 13)
|
||
{
|
||
|
||
}
|
||
break;
|
||
case 0x83:// 22 F1 83
|
||
if (len == 13)
|
||
{
|
||
textBoxDidF183.Text = Encoding.Default.GetString(data, 3, len - 3);
|
||
rtxtLog.AppendText("boot版本号:" + textBoxDidF183.Text + "\n");
|
||
}
|
||
break;
|
||
case 0x84:// 22 F1 84
|
||
if (len == 13)
|
||
{
|
||
|
||
}
|
||
break;
|
||
case 0x87:// 22 F1 87
|
||
if (len == 18)
|
||
{
|
||
textBoxDidF187.Text = Encoding.Default.GetString(data, 3, len - 3);
|
||
rtxtLog.AppendText("零件号:" + textBoxDidF187.Text + "\n");
|
||
}
|
||
break;
|
||
case 0x88:// 22 F1 88
|
||
if (len == 13)
|
||
{
|
||
|
||
}
|
||
break;
|
||
case 0x8A:// 22 F1 8A
|
||
if (len == 13)
|
||
{
|
||
|
||
}
|
||
break;
|
||
case 0x8B:// 22 F1 8B
|
||
if (len == 13)
|
||
{
|
||
|
||
}
|
||
break;
|
||
case 0x8C:// 22 F1 8C
|
||
if (len == 13)
|
||
{
|
||
|
||
}
|
||
break;
|
||
case 0x90:// 22 F1 90
|
||
if (len == 13)
|
||
{
|
||
|
||
}
|
||
break;
|
||
case 0x93:// 22 F1 93
|
||
if (len == 13)
|
||
{
|
||
textBoxDidF193.Text = Encoding.Default.GetString(data, 3, len - 3);
|
||
rtxtLog.AppendText("硬件版本号:" + textBoxDidF193.Text + "\n");
|
||
}
|
||
break;
|
||
case 0x94:// 22 F1 94
|
||
if (len == 13)
|
||
{
|
||
|
||
}
|
||
break;
|
||
case 0x95:// 22 F1 95
|
||
if (len == 13)
|
||
{
|
||
|
||
}
|
||
break;
|
||
case 0x96:// 22 F1 96
|
||
if (len == 13)
|
||
{
|
||
|
||
}
|
||
break;
|
||
case 0x97:// 22 F1 97
|
||
if (len == 13)
|
||
{
|
||
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
//UDS报文接收到一个包后处理
|
||
private void UDSReceivedPackage(byte[] data, int len)
|
||
{
|
||
//诊断各服务处理
|
||
if (true == UDSReceivedTable.ContainsKey(data[0]))
|
||
{
|
||
if (UpdateConfigParams.IsUpdate)
|
||
{
|
||
if(data[0] == 0x7f)
|
||
{
|
||
UDSReceivedTable[data[0]](data);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
UDSReceivedTable[data[0]](data);
|
||
}
|
||
|
||
}
|
||
|
||
UpdateConfigParamsNow.UpdateReply(data, (UInt32)len);
|
||
|
||
//版本号显示
|
||
DiagVersionDisplay(data, len);
|
||
|
||
// 其他信息处理
|
||
UdsOtherInfo(data, len);
|
||
|
||
|
||
}
|
||
|
||
private void ReceivedMessage(UInt32 id, byte[] data, int len)
|
||
{
|
||
//打印报文
|
||
PrintfMessageLog("RX", id, data, len);
|
||
|
||
//将报文插入到UDS模块解析 当收到一个包后会调用相关的事件 具体调用的函数
|
||
UDSInfo.InsertReceiveData(id, data);
|
||
}
|
||
|
||
|
||
|
||
|
||
/*10 03 进入扩展会话*/
|
||
private void GotoExtendeSession(byte se)
|
||
{
|
||
byte[] data = new byte[2];
|
||
data[0] = 0x10;
|
||
data[1] = se;
|
||
|
||
//SendFrameType = UDSFrameType.SingleFrame;
|
||
UDSInfo.SendPackage(data, data.Length, false);
|
||
}
|
||
|
||
/*扩展会话*/
|
||
private void btExtn_Click(object sender, EventArgs e)
|
||
{
|
||
GotoExtendeSession(0x03);
|
||
}
|
||
|
||
/*编程会话*/
|
||
private void btProgram_Click(object sender, EventArgs e)
|
||
{
|
||
GotoExtendeSession(0x02);
|
||
}
|
||
|
||
/*默认会话*/
|
||
private void btDefault_Click(object sender, EventArgs e)
|
||
{
|
||
GotoExtendeSession(0x01);
|
||
}
|
||
|
||
private void btnECUReset_Click(object sender, EventArgs e)
|
||
{
|
||
ECUHardReset(1);
|
||
}
|
||
|
||
|
||
//10ms定时器读取接收报文 已替换为事件触发暂时留住
|
||
private void timerReadMsg_Tick(object sender, EventArgs e)
|
||
{
|
||
if (true == ckbIsCycleReceive.Checked)
|
||
{
|
||
ReadMessages();
|
||
}
|
||
|
||
}
|
||
|
||
public string GetTimeStamp()
|
||
{
|
||
DateTime dt = DateTime.Now;
|
||
return dt.ToString("hh:mm:ss fff");
|
||
}
|
||
|
||
|
||
|
||
//安全访问等级1
|
||
private void btlev1_Click(object sender, EventArgs e)
|
||
{
|
||
this.EntrySecurityFlag = EntrySecurityStatus.RequestSeedLevel1;
|
||
|
||
}
|
||
|
||
private void btnResetSecurityKey_Click(object sender, EventArgs e)
|
||
{
|
||
int len = 14;
|
||
SendMsg_Len = len;
|
||
|
||
SendBuff[0] = 0x31;
|
||
SendBuff[1] = 0x01;
|
||
SendBuff[2] = 0xAA;
|
||
SendBuff[3] = 0x55;
|
||
SendBuff[4] = 0x48;
|
||
SendBuff[5] = 0x41;
|
||
SendBuff[6] = 0x2D;
|
||
SendBuff[7] = 0x54;
|
||
SendBuff[8] = 0x43;
|
||
SendBuff[9] = 0x41;
|
||
SendBuff[10] = 0x2D;
|
||
SendBuff[11] = 0x35;
|
||
SendBuff[12] = 0x36;
|
||
SendBuff[13] = 0x31;
|
||
|
||
UDSInfo.SendPackage(SendBuff, len, false);
|
||
|
||
//UDSInfo.SendPackage(SendBuff, len, false);
|
||
|
||
rtxtLog.AppendText("重置安全密钥\n");
|
||
}
|
||
|
||
|
||
|
||
private void timerSendMsg_Tick(object sender, EventArgs e)
|
||
{
|
||
|
||
switch (EntrySecurityFlag)
|
||
{
|
||
case EntrySecurityStatus.RequestSeedLevel1:
|
||
{
|
||
RequestSeedLevel1();
|
||
break;
|
||
}
|
||
|
||
case EntrySecurityStatus.SendkeyLevel1:
|
||
{
|
||
SendKeyLevel1();
|
||
break;
|
||
}
|
||
case EntrySecurityStatus.RequestSeedLevel2:
|
||
{
|
||
RequestSeedLevel2();
|
||
break;
|
||
}
|
||
case EntrySecurityStatus.SendkeyLevel2:
|
||
{
|
||
SendKeyLevel2();
|
||
break;
|
||
}
|
||
case EntrySecurityStatus.RequestSeedLevel3:
|
||
{
|
||
RequestSeedLevel3();
|
||
break;
|
||
}
|
||
case EntrySecurityStatus.SendkeyLevel3:
|
||
{
|
||
SendKeyLevel3();
|
||
break;
|
||
}
|
||
case EntrySecurityStatus.RequestSeedLevel4:
|
||
{
|
||
RequestSeedLevel4();
|
||
break;
|
||
}
|
||
case EntrySecurityStatus.SendkeyLevel4:
|
||
{
|
||
SendKeyLevel4();
|
||
break;
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
|
||
|
||
|
||
if ((EntrySecurityFlag != EntrySecurityStatus.Idle)
|
||
&& (EntrySecurityFlag != EntrySecurityStatus.Unlock)
|
||
)
|
||
{
|
||
EntrySecurityFlag = EntrySecurityStatus.WaitReply;
|
||
}
|
||
|
||
}
|
||
|
||
/*清除故障码*/
|
||
private void btClrDial_Click(object sender, EventArgs e)
|
||
{
|
||
byte[] data = new byte[8];
|
||
byte len = 4;
|
||
data[0] = 0x14;
|
||
data[1] = 0xff;
|
||
data[2] = 0xff;
|
||
data[3] = 0xff;
|
||
|
||
UDSInfo.SendPackage(data, len, false);
|
||
}
|
||
|
||
void SendComSet(byte en)
|
||
{
|
||
byte[] data = new byte[3];
|
||
|
||
data[0] = 0x28;
|
||
data[1] = en;
|
||
data[2] = 0x01;
|
||
|
||
UDSInfo.SendPackage(data, data.Length, false);
|
||
//UDSInfo.SendPackage(data, len, false);
|
||
}
|
||
|
||
/*失能应用报文的发送和接收*/
|
||
private void btComOff_Click(object sender, EventArgs e)
|
||
{
|
||
SendComSet(3);
|
||
}
|
||
|
||
/*使能应用报文的发送和接收*/
|
||
private void btComOn_Click(object sender, EventArgs e)
|
||
{
|
||
SendComSet(0);
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
public uint GetCRC16(byte[] msg)
|
||
{
|
||
uint mask = 0x1021;
|
||
int size = msg.Length;
|
||
uint crc = 0xFFFF;
|
||
int tmp;
|
||
int i, j;
|
||
|
||
for (i = 0; i < size; i++)
|
||
{
|
||
tmp = msg[i] << 8;
|
||
for (j = 0; j < 8; j++)
|
||
{
|
||
if (((crc ^ tmp) & 0x8000u) == 0x8000u)
|
||
{
|
||
crc = (crc << 1) ^ mask;
|
||
}
|
||
else
|
||
{
|
||
crc <<= 1;
|
||
}
|
||
tmp <<= 1;
|
||
}
|
||
}
|
||
return crc;
|
||
}
|
||
|
||
|
||
private void UpdateTimerSet1s()
|
||
{
|
||
timerFlashMain.Interval = 1000;
|
||
}
|
||
|
||
private void UpdateTimerSet20ms()
|
||
{
|
||
timerFlashMain.Interval = 20;
|
||
}
|
||
|
||
|
||
private void timer1Calib_Tick(object sender, EventArgs e)
|
||
{
|
||
|
||
UpdateConfigParamsNow.UpdateSendLoop();
|
||
|
||
|
||
}
|
||
|
||
|
||
private void timer500ms_Tick(object sender, EventArgs e)
|
||
{
|
||
timeEscape++;
|
||
textBoxTimeEscape.Text = timeEscape.ToString() + "秒";
|
||
}
|
||
|
||
|
||
|
||
|
||
private void timerUDS_Tick(object sender, EventArgs e)
|
||
{
|
||
byte[] data = new byte[64];
|
||
|
||
if ((EntrySecurityStatus.Unlock == EntrySecurityFlag)
|
||
|| (UpdateConfigParams.IsUpdate)
|
||
)
|
||
{
|
||
data[0] = 0x02;
|
||
data[1] = 0x3E;
|
||
data[2] = 0x80;
|
||
|
||
CanDeviceSendMessage(UpdateConfigParamsNow.CANFuncDevRxId, data, 8, ckbIsCanFd.Checked);
|
||
//UDSInfo.SendPackage(data, data.Length, false);
|
||
}
|
||
}
|
||
|
||
|
||
private void GetUpdateFileInfo(string fileName, int dataOffset, out byte[] outData, byte[] outStartAddr, uint binStartAddr,byte[] outSize, ref uint crcValue, bool isCrcLsb)
|
||
{
|
||
byte[] fileData;
|
||
|
||
//判断bin还是s19
|
||
if ((-1 != fileName.IndexOf(".bin"))
|
||
|| (-1 != fileName.IndexOf(".Bin"))
|
||
)
|
||
{
|
||
//读取文件流
|
||
FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read);
|
||
BinaryReader binFile = new BinaryReader(file);
|
||
|
||
//减去头偏移大小
|
||
fileData = new byte[file.Length - dataOffset];
|
||
//去除头偏移
|
||
binFile.ReadBytes(dataOffset);
|
||
//读取数据
|
||
binFile.Read(fileData, 0, fileData.Length);
|
||
|
||
//拷贝到实际使用的数组
|
||
outData = new byte[fileData.Length];
|
||
fileData.CopyTo(outData, 0);
|
||
|
||
//起始地址
|
||
outStartAddr[0] = (byte)((binStartAddr >> 24) & 0xff);
|
||
outStartAddr[1] = (byte)((binStartAddr >> 16) & 0xff);
|
||
outStartAddr[2] = (byte)((binStartAddr >> 8) & 0xff);
|
||
outStartAddr[3] = (byte)((binStartAddr >> 0) & 0xff);
|
||
|
||
//UIFlashDrive起始地址
|
||
/*UIFlashDriveUpdateStartAddr[0] = (byte)((this.UpdateConfigParamsNow.UIFlashDriveUpdateStartAddr >> 24) & 0xff);
|
||
UIFlashDriveUpdateStartAddr[1] = (byte)((this.UpdateConfigParamsNow.UIFlashDriveUpdateStartAddr >> 16) & 0xff);
|
||
UIFlashDriveUpdateStartAddr[2] = (byte)((this.UpdateConfigParamsNow.UIFlashDriveUpdateStartAddr >> 8) & 0xff);
|
||
UIFlashDriveUpdateStartAddr[3] = (byte)((this.UpdateConfigParamsNow.UIFlashDriveUpdateStartAddr >> 0) & 0xff);*/
|
||
}
|
||
else
|
||
{
|
||
//读取S19文件
|
||
S19FileStream S19File = new S19FileStream(fileName);
|
||
|
||
int size = S19File.Size;
|
||
int startAddr = S19File.StartAddr;
|
||
|
||
|
||
//起始地址
|
||
outStartAddr[0] = (byte)((startAddr >> 24) & 0xff);
|
||
outStartAddr[1] = (byte)((startAddr >> 16) & 0xff);
|
||
outStartAddr[2] = (byte)((startAddr >> 8) & 0xff);
|
||
outStartAddr[3] = (byte)((startAddr >> 0) & 0xff);
|
||
|
||
/*
|
||
UIFlashDriveUpdateStartAddr[0] = (byte)((startAddr >> 24) & 0xff);
|
||
UIFlashDriveUpdateStartAddr[1] = (byte)((startAddr >> 16) & 0xff);
|
||
UIFlashDriveUpdateStartAddr[2] = (byte)((startAddr >> 8) & 0xff);
|
||
UIFlashDriveUpdateStartAddr[3] = (byte)((startAddr >> 0) & 0xff);*/
|
||
|
||
//拷贝到实际使用的数组
|
||
fileData = S19File.ToBinByteArray(size);
|
||
|
||
//减去头偏移大小
|
||
outData = new byte[fileData.Length - dataOffset];
|
||
|
||
//拷贝到实际使用的数组
|
||
Array.Copy(fileData, dataOffset, outData, 0, outData.Length);
|
||
|
||
}
|
||
|
||
//获取CRC32校验和
|
||
CRC32Cls crc32 = new CRC32Cls();
|
||
#if true
|
||
if (isCrcLsb)
|
||
{
|
||
crc32.SetLsb();
|
||
}
|
||
else
|
||
{
|
||
crc32.SetMsb();
|
||
}
|
||
#else
|
||
if (true == ckbIsOldBott.Checked)
|
||
{
|
||
crc.SetLsb();
|
||
}
|
||
else
|
||
{
|
||
crc.SetMsb();
|
||
}
|
||
#endif
|
||
crc32.Bzip2_Init();
|
||
crc32.Bzip2_Start();
|
||
crc32._Lbm_CalculateHashByDct(outData, (uint)outData.Length);
|
||
crcValue = crc32.Bzip2_Verify();
|
||
|
||
//大小
|
||
outSize[0] = (byte)((outData.Length >> 24) & 0xff);
|
||
outSize[1] = (byte)((outData.Length >> 16) & 0xff);
|
||
outSize[2] = (byte)((outData.Length >> 8) & 0xff);
|
||
outSize[3] = (byte)((outData.Length >> 0) & 0xff);
|
||
|
||
}
|
||
|
||
|
||
/*选择FlashDriver文件*/
|
||
private void btFlashDriver_Click(object sender, EventArgs e)
|
||
{
|
||
OpenFileDialog FlashDriveFileSwitchDialog = new OpenFileDialog();
|
||
|
||
//exe打开路径
|
||
FlashDriveFileSwitchDialog.InitialDirectory = System.Environment.CurrentDirectory;
|
||
FlashDriveFileSwitchDialog.Title = "选择FlashDrive文件";
|
||
//FlashDriveFileSwitchDialog.Filter = "S19 files|*.s19;*.S19|BIN files|*.Bin;*.bin;";
|
||
FlashDriveFileSwitchDialog.Filter = "File|*.s19;*.S19;*.Bin;*.bin;";
|
||
|
||
if (FlashDriveFileSwitchDialog.ShowDialog() != DialogResult.OK)
|
||
{
|
||
textBoxFlash.Text = "";
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
textBoxFlash.Text = FlashDriveFileSwitchDialog.FileName;//选中文件名
|
||
|
||
|
||
|
||
//获取升级文件信息
|
||
GetUpdateFileInfo(FlashDriveFileSwitchDialog.FileName, UpdateConfigParamsNow.FlashDriveFileOffset, out FlashDataBuff, FlashDriveUpdateStartAddr, UpdateConfigParamsNow.FlashDriveUpdateStartAddr, FlashDriveUpdateDataSize, ref FlashCheckSum, ckbIsCrcLsb.Checked);
|
||
|
||
FlashDriveUpdateStartAddr.CopyTo(UIFlashDriveUpdateStartAddr, 0);
|
||
|
||
rtxtLog.AppendText(string.Format("FlashDriver文件CRC32为0x{0:X}\n", FlashCheckSum));
|
||
}
|
||
|
||
}
|
||
|
||
/*选择APP文件*/
|
||
private void btAPP_Click(object sender, EventArgs e)
|
||
{
|
||
OpenFileDialog AppFileSwitchDialog = new OpenFileDialog();
|
||
|
||
//exe的路径
|
||
AppFileSwitchDialog.InitialDirectory = System.Environment.CurrentDirectory;
|
||
AppFileSwitchDialog.Title = "选择APP升级文件";
|
||
//AppFileSwitchDialog.Filter = "S19 files|*.s19;*.S19|BIN files|*.Bin;*.bin;";
|
||
AppFileSwitchDialog.Filter = "File|*.s19;*.S19;*.Bin;*.bin;";
|
||
|
||
if (AppFileSwitchDialog.ShowDialog() != DialogResult.OK)
|
||
{
|
||
textBoxApp.Text = "";
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
textBoxApp.Text = AppFileSwitchDialog.FileName;//选中文件名
|
||
|
||
//获取升级文件信息
|
||
GetUpdateFileInfo(AppFileSwitchDialog.FileName, UpdateConfigParamsNow.AppFileOffset, out AppDataBuff, AppUpdateStartAddr, UpdateConfigParamsNow.AppUpdateStartAddr, AppUpdateDataSize, ref AppCheckSum, ckbIsCrcLsb.Checked);
|
||
|
||
rtxtLog.AppendText(string.Format("APP文件CRC32为0x{0:X}\n", AppCheckSum));
|
||
}
|
||
}
|
||
|
||
private void btnUIUpdateFileSwitch_Click(object sender, EventArgs e)
|
||
{
|
||
OpenFileDialog UIFileSwitchDialog = new OpenFileDialog();
|
||
|
||
//exe的路径
|
||
UIFileSwitchDialog.InitialDirectory = System.Environment.CurrentDirectory;
|
||
UIFileSwitchDialog.Title = "选择UI升级文件";
|
||
//UIFileSwitchDialog.Filter = "S19 files|*.s19;*.S19|BIN files|*.Bin;*.bin;";
|
||
UIFileSwitchDialog.Filter = "File|*.s19;*.S19;*.Bin;*.bin;";
|
||
|
||
if (UIFileSwitchDialog.ShowDialog() != DialogResult.OK)
|
||
{
|
||
txtUIUpdateFilePath.Text = "";
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
txtUIUpdateFilePath.Text = UIFileSwitchDialog.FileName;//选中文件名
|
||
|
||
//获取升级文件信息
|
||
GetUpdateFileInfo(UIFileSwitchDialog.FileName, UpdateConfigParamsNow.UIFileOffset, out UIDataBuff, UIUpdateStartAddr, UpdateConfigParamsNow.UIUpdateStartAddr, UIUpdateDataSize, ref UiCheckSum, ckbIsCrcLsb.Checked);
|
||
|
||
//rtxtLog.AppendText(string.Format("UI文件起始地址为0x{0:X} 大小为0x{1:X} CRC32为0x{2:X}", byte UIUpdateStartAddr));
|
||
rtxtLog.AppendText(string.Format("UI文件CRC32为0x{0:X}\n", UiCheckSum));
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/*升级*/
|
||
private void btUpgrade_Click(object sender, EventArgs e)
|
||
{
|
||
UpdateFileSendBytes = 0;
|
||
UpdateFileTotalBytes = 0;
|
||
BlockIndex = 1;
|
||
BuffOffset = 0;
|
||
FileOffset = 0;
|
||
|
||
if (textBoxFlash.Text == "")
|
||
{
|
||
MessageBox.Show("请选择FlashDriver文件");
|
||
btFlashDriver.Focus();
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
//UpdateFileTotalBytes += (UInt32)FlashBuffer.Count;
|
||
UpdateFileTotalBytes += FlashDataBuff.Length;
|
||
}
|
||
|
||
if(true == rbtnAppSelect.Checked)
|
||
{
|
||
UpdateFileType = UpdateFileType.App;
|
||
|
||
if (textBoxApp.Text == "")
|
||
{
|
||
MessageBox.Show("请选择相应的APP升级文件");
|
||
btAPP.Focus();
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
//UpdateFileTotalBytes += (UInt32)AppBuffer.Count;
|
||
UpdateFileTotalBytes += AppDataBuff.Length;
|
||
}
|
||
}
|
||
else if(true == rbtnUiSelect.Checked)
|
||
{
|
||
UpdateFileType = UpdateFileType.UI;
|
||
|
||
if (txtUIUpdateFilePath.Text == "")
|
||
{
|
||
MessageBox.Show("请选择相应的UI升级文件");
|
||
btAPP.Focus();
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
//UpdateFileTotalBytes += (UInt32)AppBuffer.Count;
|
||
UpdateFileTotalBytes += UIDataBuff.Length;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
UpdateConfigParams.UpdateStepNum = 0;
|
||
UpdateConfigParams.UpdateSendCmdFlag = true;
|
||
UpdateConfigParams.IsUpdate = true;
|
||
|
||
timerFlashMain.Enabled = true;
|
||
|
||
this.progressBar1.Value = Convert.ToInt32(0);
|
||
textBoxTimeEscape.Text = "0秒";
|
||
timeEscape = 0;
|
||
timer1s.Enabled = true;
|
||
|
||
EntrySecurityFlag = EntrySecurityStatus.Idle;
|
||
|
||
|
||
|
||
}
|
||
|
||
/*版本信息*/
|
||
private void btVersionInfo_Click(object sender, EventArgs e)
|
||
{
|
||
MessageBox.Show("版本号V0.001-20241113");
|
||
}
|
||
|
||
|
||
|
||
private void btEnterEndofLineCaliMode_Click(object sender, EventArgs e)
|
||
{
|
||
|
||
}
|
||
|
||
|
||
private void idStratTextBox_TextChanged(object sender, EventArgs e)
|
||
{
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
private void UDSUpdateDownloadFlashDriver()
|
||
{
|
||
|
||
rtxtLog.AppendText("请求下载FlashDriver\n");
|
||
|
||
UpdataFileFlag = 1;
|
||
|
||
if ((UpdateFileType.App == UpdateFileType)
|
||
|| (UpdateFileType.Rectify == UpdateFileType)
|
||
)
|
||
{
|
||
RequestDownload(FlashDriveUpdateStartAddr, FlashDriveUpdateDataSize);
|
||
}
|
||
else if (UpdateFileType.UI == UpdateFileType)
|
||
{
|
||
RequestDownload(UIFlashDriveUpdateStartAddr, FlashDriveUpdateDataSize);
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
private void UDSUpdateEraseMemoryLen13()
|
||
{
|
||
rtxtLog.AppendText("擦除Flash\n");
|
||
|
||
if (UpdateFileType.App == UpdateFileType)
|
||
{
|
||
RequestEraseMemoryLen13(AppUpdateStartAddr, AppUpdateDataSize);
|
||
}
|
||
else if (UpdateFileType.UI == UpdateFileType)
|
||
{
|
||
RequestEraseMemoryLen13(UIUpdateStartAddr, UIUpdateDataSize);
|
||
}
|
||
else if (UpdateFileType.Rectify == UpdateFileType)
|
||
{
|
||
RequestEraseMemoryLen13(RectifyUpdateStartAddr, RectifyUpdateDataSize);
|
||
}
|
||
|
||
}
|
||
|
||
private void UDSUpdateDownloadAppFile()
|
||
{
|
||
|
||
UpdataFileFlag = 2;
|
||
|
||
|
||
if (UpdateFileType.App == UpdateFileType)
|
||
{
|
||
RequestDownload(AppUpdateStartAddr, AppUpdateDataSize);
|
||
}
|
||
else if (UpdateFileType.UI == UpdateFileType)
|
||
{
|
||
RequestDownload(UIUpdateStartAddr, UIUpdateDataSize);
|
||
}
|
||
else if (UpdateFileType.Rectify == UpdateFileType)
|
||
{
|
||
RequestDownload(RectifyUpdateStartAddr, RectifyUpdateDataSize);
|
||
}
|
||
|
||
|
||
}
|
||
|
||
private void UDSUpdateTransferData()
|
||
{
|
||
if (1 == UpdataFileFlag)//区分升级文件为flash driver还是app
|
||
{
|
||
|
||
TransferData(ref FlashDataBuff, FlashDriveUpdateDataSize);
|
||
}
|
||
else if (2 == UpdataFileFlag)//区分升级文件为flash driver还是app
|
||
{
|
||
if (UpdateFileType.App == UpdateFileType)
|
||
{
|
||
TransferData(ref AppDataBuff, AppUpdateDataSize);
|
||
}
|
||
else if (UpdateFileType.UI == UpdateFileType)
|
||
{
|
||
TransferData(ref UIDataBuff, UIUpdateDataSize);
|
||
}
|
||
else if (UpdateFileType.Rectify == UpdateFileType)
|
||
{
|
||
TransferData(ref RectifyDataBuff, RectifyUpdateDataSize);
|
||
}
|
||
}
|
||
}
|
||
|
||
private void UDSUpdateFlashCheckSumLen4()
|
||
{
|
||
|
||
rtxtLog.AppendText("FlashDriver校验和\n");
|
||
|
||
RequestCheckSum(this.UpdateConfigParamsNow.FlashCheckMemoryParams);
|
||
}
|
||
|
||
private void UDSUpdateFlashCheckSumLen8()
|
||
{
|
||
rtxtLog.AppendText("FlashDriver校验和\n");
|
||
RequestCheckSum(this.UpdateConfigParamsNow.FlashCheckMemoryParams ,FlashCheckSum);
|
||
}
|
||
|
||
private void UDSUpdateFlashCheckSumCRC32()
|
||
{
|
||
rtxtLog.AppendText("FlashDriver校验和检测\n");
|
||
RequestCheckSumHR(this.UpdateConfigParamsNow.FlashCheckMemoryParams, FlashCheckSum);
|
||
|
||
}
|
||
|
||
private void UDSUpdateFlashCheckSumLen16()
|
||
{
|
||
rtxtLog.AppendText("FlashDriver校验和\n");
|
||
RequestCheckSum(this.UpdateConfigParamsNow.FlashCheckMemoryParams, FlashDriveUpdateStartAddr, FlashDriveUpdateDataSize, FlashCheckSum);
|
||
}
|
||
|
||
private void UDSUpdateAppCheckSumLen4()
|
||
{
|
||
rtxtLog.AppendText("App校验和\n");
|
||
|
||
RequestCheckSum(this.UpdateConfigParamsNow.AppCheckMemoryParams);
|
||
|
||
}
|
||
|
||
private void UDSUpdateAppCheckSumLen8()
|
||
{
|
||
uint checkSum;
|
||
|
||
rtxtLog.AppendText("App校验和\n");
|
||
|
||
switch (UpdateFileType)
|
||
{
|
||
case UpdateFileType.App:
|
||
{
|
||
checkSum = AppCheckSum;
|
||
break;
|
||
}
|
||
case UpdateFileType.UI:
|
||
{
|
||
checkSum = UiCheckSum;
|
||
break;
|
||
}
|
||
case UpdateFileType.Rectify:
|
||
{
|
||
checkSum = RectifyCheckSum;
|
||
break;
|
||
}
|
||
default:
|
||
{
|
||
checkSum = AppCheckSum;
|
||
break;
|
||
}
|
||
|
||
}
|
||
|
||
RequestCheckSum(this.UpdateConfigParamsNow.AppCheckMemoryParams, checkSum);
|
||
|
||
}
|
||
|
||
private void UDSUpdateAppCheckSumHR()
|
||
{
|
||
uint checkSum;
|
||
|
||
rtxtLog.AppendText("App校验和\n");
|
||
|
||
switch (UpdateFileType)
|
||
{
|
||
case UpdateFileType.App:
|
||
{
|
||
checkSum = AppCheckSum;
|
||
break;
|
||
}
|
||
case UpdateFileType.UI:
|
||
{
|
||
checkSum = UiCheckSum;
|
||
break;
|
||
}
|
||
case UpdateFileType.Rectify:
|
||
{
|
||
checkSum = RectifyCheckSum;
|
||
break;
|
||
}
|
||
default:
|
||
{
|
||
checkSum = AppCheckSum;
|
||
break;
|
||
}
|
||
|
||
}
|
||
|
||
RequestCheckSumHR(this.UpdateConfigParamsNow.AppCheckMemoryParams, checkSum);
|
||
|
||
}
|
||
|
||
private void UDSUpdateAppCheckSumLen16()
|
||
{
|
||
uint checkSum;
|
||
byte[] startAddr;
|
||
byte[] size;
|
||
|
||
|
||
rtxtLog.AppendText("App校验和\n");
|
||
|
||
switch (UpdateFileType)
|
||
{
|
||
case UpdateFileType.App:
|
||
{
|
||
startAddr = AppUpdateStartAddr;
|
||
size = AppUpdateDataSize;
|
||
checkSum = AppCheckSum;
|
||
break;
|
||
}
|
||
case UpdateFileType.UI:
|
||
{
|
||
startAddr = UIUpdateStartAddr;
|
||
size = UIUpdateDataSize;
|
||
checkSum = UiCheckSum;
|
||
break;
|
||
}
|
||
case UpdateFileType.Rectify:
|
||
{
|
||
startAddr = RectifyUpdateStartAddr;
|
||
size = RectifyUpdateDataSize;
|
||
checkSum = RectifyCheckSum;
|
||
break;
|
||
}
|
||
default:
|
||
{
|
||
startAddr = AppUpdateStartAddr;
|
||
size = AppUpdateDataSize;
|
||
checkSum = AppCheckSum;
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
RequestCheckSum(this.UpdateConfigParamsNow.AppCheckMemoryParams, startAddr, size, checkSum);
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
private void UDSUpdateECUHardReset0x03()
|
||
{
|
||
|
||
ECUHardReset(3);
|
||
timer1s.Enabled = false;
|
||
|
||
}
|
||
|
||
// uds 后测试工具
|
||
private void UpdateToolsDeinit()
|
||
{
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
private void cobCarType_SelectedIndexChanged(object sender, EventArgs e)
|
||
{
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
private void btnStartUpdataBoot_Click(object sender, EventArgs e)
|
||
{
|
||
byte len = 7;
|
||
SendMsg_Len = len;
|
||
|
||
SendBuff[0] = 0x31;
|
||
SendBuff[1] = 0x01;
|
||
SendBuff[2] = 0xaa;
|
||
SendBuff[3] = 0x55;
|
||
SendBuff[4] = 0x35;
|
||
SendBuff[5] = 0x37;
|
||
SendBuff[6] = 0x38;
|
||
|
||
|
||
UDSInfo.SendPackage(SendBuff, len, false);
|
||
|
||
}
|
||
|
||
private void timer1_Tick(object sender, EventArgs e)
|
||
{
|
||
|
||
}
|
||
|
||
private void timer2_Tick(object sender, EventArgs e)
|
||
{
|
||
|
||
}
|
||
|
||
private void ckbIsCanFd_CheckedChanged(object sender, EventArgs e)
|
||
{
|
||
|
||
}
|
||
|
||
private void btDidF183_Click(object sender, EventArgs e)
|
||
{
|
||
byte[] data = new byte[8];
|
||
byte len = 3;
|
||
data[0] = 0x22;
|
||
data[1] = 0xF1;
|
||
data[2] = 0x83;
|
||
|
||
UDSInfo.SendPackage(data, len, false);
|
||
|
||
// rtxtLog.AppendText("ECU复位\n");
|
||
}
|
||
|
||
private void btDidF187_Click(object sender, EventArgs e)
|
||
{
|
||
byte[] data = new byte[8];
|
||
byte len = 3;
|
||
data[0] = 0x22;
|
||
data[1] = 0xF1;
|
||
data[2] = 0x87;
|
||
|
||
UDSInfo.SendPackage(data, len, false);
|
||
}
|
||
|
||
private void btDidF193_Click(object sender, EventArgs e)
|
||
{
|
||
byte[] data = new byte[8];
|
||
byte len = 3;
|
||
data[0] = 0x22;
|
||
data[1] = 0xF1;
|
||
data[2] = 0x93;
|
||
|
||
UDSInfo.SendPackage(data, len, false);
|
||
}
|
||
}
|
||
}
|