ISO15765-4 协议 汽车ECU系统模拟

ISO15765-4 协议 汽车ECU系统模拟

本节介绍的代码量比较多,用到的知识也比较丰富,篇幅较长!
看完这篇文章能够掌握的知识包括:ISO15765-4协议、USART串口通信协议、CAN通信协议、中断等。

一、USART串口通信

串口通信:串口按位(bit)发送和接收字节。
参数包括:波特率、数据位、停止位和奇偶校验位。对于两个进行通信的端口,这些参数必须匹配。
波特率:即单位时间内载波参数变化的次数,如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为240Bd,比特率为10位*240个/秒=2400bps。
数据位:一个数据包的位数。一般为8位,也就是一个字节。
停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。停止位越长,通信速度越慢。
奇偶校验位:用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。
代码如下:

/************************************************************************
  * @描述:  串口配置
  * @参数:  Baud:串口波特率
  * @返回值: None
  **********************************************************************/
void PC_USART_Config(u32 Baud)
{
    	GPIO_InitTypeDef GPIO_InitStructure; 	//声明GPIO结构体
		USART_InitTypeDef USART_InitStructure;	//声明USART结构体
    
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
	
		//USART1_TX   GPIOA.9
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 				//PA.9
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;			//复用推挽输出
		GPIO_Init(GPIOA, &GPIO_InitStructure);					//初始化GPIOA.9
   
		//USART1_RX	  GPIOA.10初始化
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;				//PA10
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;	//浮空输入
		GPIO_Init(GPIOA, &GPIO_InitStructure);					//初始化GPIOA.10  

		//USART 初始化设置
		USART_InitStructure.USART_BaudRate = Baud;		//串口波特率
		USART_InitStructure.USART_WordLength = USART_WordLength_8b;	//字长为8位数据格式
		USART_InitStructure.USART_StopBits = USART_StopBits_1;			//一个停止位
		USART_InitStructure.USART_Parity = USART_Parity_No;		//无奇偶校验位
		USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
		USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式

    	USART_Init(USART1, &USART_InitStructure); 		//初始化串口1
		USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);	//开启串口接受中断
		USART_Cmd(USART1, ENABLE);                    	//使能串口1 
}
//映射printf()函数,用来串口调试/发AT指令
#if 1
#pragma import(__use_no_semihosting)

struct __FILE
{
    int handle;
    /* Whatever you require here. If the only file you are using is */
    /* standard output using printf() for debugging, no file handling */
    /* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
_sys_exit(int x)
{
    x = x;
}
int fputc(int ch, FILE *f)
{
    while((USART1->SR&0x40) == 0);
    USART1->DR = (u8)ch;
    return ch;
}
#endif

我使用的是PA9\PA10 IO口

二、CAN通信协议

这部分内容较多,是我从百度百科上面选择性复制过来的。需要从代码中对照下面的原理进行理解。说实话,里面的细节我也不是很清楚,会用就是硬理!!!
工作原理:CAN总线使用串行数据传输方式,可以1Mb/s的速率在40m的双绞线上运行,也可以使用光缆连接,而且在这种总线上总线协议支持多主控制器。CAN与I2C总线的许多细节很类似,但也有一些明显的区别。当CAN总线上的一个节点(站)发送数据时,它以报文形式广播给网络中所有节点。对每个节点来说,无论数据是否是发给自己的,都对其进行接收。每组报文开头的11位字符为标识符,定义了报文的优先级,在同一系统中标识符是唯一的。当几个站同时竞争总线读取时,这种配置十分重要。
当一个站要向其它站发送数据时,该站的CPU将要发送的数据和自己的标识符传送给本站的CAN芯片,并处于准备状态;当它收到总线分配时,转为发送报文状态。CAN芯片将数据根据协议组织成一定的报文格式发出,这时网上的其它站处于接收状态。每个处于接收状态的站对接收到的报文进行检测,判断这些报文是否是发给自己的,以确定是否接收它。由于CAN总线是一种面向内容的编址方案,因此很容易建立高水准的控制系统并灵活地进行配置。我们可以很容易地在CAN总线中加进一些新站而无需在硬件或软件上进行修改。当所提供的新站是纯数据接收设备时,数据传输协议不要求独立的部分有物理目的地址。它允许分布过程同步化,即总线上控制器需要测量数据时,可由网上获得,而无须每个控制器都有自己独立的传感器。
CAN总线的特点:
(1)具有实时性强、传输距离较远、抗电磁干扰能力强、成本低等优点;
(2)采用双线串行通信方式,检错能力强,可在高噪声干扰环境中工作;
(3)具有优先权和仲裁功能,多个控制模块通过CAN 控制器挂到CAN-bus 上,形成多主机局部网络;
(4)可根据报文的ID决定接收或屏蔽该报文;
(5)可靠的错误处理和检错机制;
(6)发送的信息遭到破坏后,可自动重发;
(7)节点在错误严重的情况下具有自动退出总线的功能;
(8)报文不包含源地址或目标地址,仅用标志符来指示功能信息、优先级信息。
报文类型:
在CAN2.0B的版本协议中有两种不同的帧格式,不同之处为标识符域的长度不同,含有11位标识符的帧称之为标准帧,而含有29位标识符的帧称为扩展帧。
帧类型:
在报文传输时,不同的帧具有不同的传输结构,下面将分别介绍四种传输帧的结构,只有严格按照该结构进行帧的传输,才能被节点正确接收和发送。
(1)数据帧由七种不同的位域(Bit Field)组成:帧起始(Start of )、仲裁域(Arbitration Field)、控制域(Control Field)、数据域(DataField)、CRC域(CRC Field)、应答域(ACK Field)和帧结尾(End of )。数据域的长度可以为0~8个字节。
1)帧起始(SOF):帧起始(SOF)标志着数据帧和远程帧的起始,**仅由一个“显性”位组成。**在CAN的同步规则中,当总线空闲时(处于隐性状态),才允许站点开始发送(信号)。所有的站点必须同步于首先开始发送报文的站点的帧起始前沿(该方式称为“硬同步”)。
2)仲裁域:仲裁域由标识符和RTR位组成,标准帧格式与扩展帧格式的仲裁域格式不同。标准格式里,仲裁域由1l位标识符和RTR位组成。标识符位有ID28~IDl8。扩展帧格式里,仲裁域包括29位标识符、SRR位、IDE(Identifier Extension,标志符扩展)位、RTR位。其标识符有ID28~IDO。为了区别标准帧格式和扩展帧格式,CANl.0~1.2版本协议的保留位r1现表示为IDE位。IDE位为显性,表示数据帧为标准格式;IDE位为隐性,表示数据帧为扩展帧格式。在扩展帧中,替代远程请求(Substitute Remote Request,SRR)位为隐性。仲裁域传输顺序为从最高位到最低位,其中最高7位不能全为零。RTR的全称为“远程发送请求(Remote TransmissionRequest)”。RTR位在数据帧里必须为“显性”,而在远程帧里必须为“隐性”。它是区别数据帧和远程帧的标志。
3)控制域:控制域由6位组成,包括2个保留位(r0、r1同于CAN总线协议扩展)及4位数据长度码,允许的数据长度值为0~8字节。
4)数据域:发送缓冲区中的数据按照长度代码指示长度发送。对于接收的数据,同样如此。它可为0~8字节,每个字节包含8位,首先发送的是MSB(最高位)。
5)CRC校验码域:它由CRC域(15位)及CRC边界符(一个隐性位)组成。CRC计算中,被除的多项式包括帧的起始域、仲裁域、控制域、数据域及15位为0的解除填充的位流给定。此多项式被下列多项式X15+X14+X10+X8+X7+X4+X3+1除(系数按模2计算),相除的余数即为发至总线的CRC序列。发送时,CRC序列的最高有效位被首先发送/接收。之所以选用这种帧校验方式,是由于这种CRC校验码对于少于127位的帧是最佳的。
6)应答域:应答域由发送方发出的两个(应答间隙及应答界定)隐性位组成,所有接收到正确的CRC序列的节点将在发送节点的应答间隙上将发送的这一隐性位改写为显性位。因此,发送节点将一直监视总线信号已确认网络中至少一个节点正确地接收到所发信息。应答界定符是应答域中第二个隐性位,由此可见,应答间隙两边有两个隐性位:CRC域和应答界定位。
7)帧结束域:每一个数据帧或远程帧均由一串七个隐性位的帧结束域结尾。这样,接收节点可以正确检测到一个帧的传输结束。
代码如下:

/************************************************************************
  * @描述:  CAN配置
  * @参数:  id1:标识码高位
  * 			  id2:标识码低位
  *				  mid1:屏蔽码高位
  * 			  mid2:屏蔽码低位
  * 			  velocity:波特率 = Fpclk1/((CAN_BS1_11tq+1+CAN_BS2_6tq+1+1)*velocity);
  * @返回值: 0
  **********************************************************************/
u8 CAN_Mode_Init(u32 id1, u32 id2, u32 mid1, u32 mid2, u16 velocity)
{
	GPIO_InitTypeDef 			GPIO_InitStructure; 
	CAN_InitTypeDef       	CAN_InitStructure;
 	CAN_FilterInitTypeDef 	CAN_FilterInitStructure;
#if CAN_RX0_INT_ENABLE 
   	NVIC_InitTypeDef  NVIC_InitStructure; //声明中断结构体
#endif
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);//使能PORTA时钟	                   											 
  	RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟	
	
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;		//PA12 TX
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽
    GPIO_Init(GPIOA, &GPIO_InitStructure);			//初始化IO
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;				//PA11 RX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;	//上拉输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);					//初始化IO
	  
 	//CAN单元设置
 	CAN_InitStructure.CAN_TTCM=DISABLE;		//非时间触发通信模式
 	CAN_InitStructure.CAN_ABOM=DISABLE;		//软件自动离线管理
  	CAN_InitStructure.CAN_AWUM=DISABLE;		//睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)//
  	CAN_InitStructure.CAN_NART=ENABLE;		//使能报文自动传送
  	CAN_InitStructure.CAN_RFLM=DISABLE;		//报文不锁定,新的覆盖旧的 
  	CAN_InitStructure.CAN_TXFP=DISABLE;		//优先级由报文标识符决定 
  	CAN_InitStructure.CAN_Mode= CAN_Mode_Normal;	//模式设置: mode:0,普通模式;1,回环模式; //
  	//设置波特率
  	CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;	
  	CAN_InitStructure.CAN_BS1=CAN_BS1_11tq; 
  	CAN_InitStructure.CAN_BS2=CAN_BS2_6tq;
  	CAN_InitStructure.CAN_Prescaler=velocity;      //配置通信速度
  	CAN_Init(CAN1, &CAN_InitStructure);            // 初始化CAN1 

 	CAN_FilterInitStructure.CAN_FilterNumber=0;	  					//过滤器0
   	CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;	//屏蔽位模式
  	CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; 	//32位 
  	CAN_FilterInitStructure.CAN_FilterIdHigh=id1<<5;
  	CAN_FilterInitStructure.CAN_FilterIdLow=id2<<5;
  	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=mid1<<5;
  	CAN_FilterInitStructure.CAN_FilterMaskIdLow=mid2<<5;
  	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
 	CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0

  	CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化
	CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
	return 0;
}   

三、中断

中断流程:当主程序在运行时,接收到一个中断请求,此时CPU会保存当前程序的运行状态(如:堆栈、寄存器的值等),然后进入中断服务程序。当中断服务程序运行结束后,CPU继续运行当前代码。
中断配置过程中最重要的是中断优先级,其中包括:抢占优先级和响应优先级。抢占优先级占主导地位,当两个中断服务程序抢占优先级一样时,再比较响应优先级。
程序中使用了定时器中断服务函数,所以需先配置定时器相关参数
中断配置及中断服务程序如下:

/************************************************************************
  * @描述:  定时器2配置
  * @参数:   T2Delayms
  * 				时钟计算公式:Tout = ((arr+1)*(T2Delayms+1))/Tclk
  * 				这里的arr为35999
  * @返回值: NONE
  **********************************************************************/
void TIM2_Config(u32 T2Delayms)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    TIM_TimeBaseStructure.TIM_Period = 35999;
    TIM_TimeBaseStructure.TIM_Prescaler = T2Delayms;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);
    TIM_ARRPreloadConfig(TIM2, DISABLE);
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    TIM_Cmd(TIM2, ENABLE);
}
/************************************************************************
  * @描述:  中断配置
  * @参数:  None
  * @返回值: None
  **********************************************************************/
void NVIC_Config(void)
{
    NVIC_InitTypeDef  NVIC_InitStructure;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //中断优先级分组

    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; 			//配置定时器中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	//抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 			//响应优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//中断使能
    NVIC_Init(&NVIC_InitStructure);
	//配置CAN中断
    NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
	//配置串口中断
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

下面是三个中断服务程序:

/************************************************************************
  * @描述:  USART中断服务函数
  * @参数:  None
  * @功能:  实现ISO15765-4协议 部分AT指令,AT指令通过串口发送
  * @返回值: None
  **********************************************************************/
void PC_USART_IRQHandler(void)
{
    u8 data;
    data = data;
    if (USART_GetFlagStatus(PC_USART,USART_FLAG_ORE)!= RESET)
    {
        data = PC_USART->DR;
        USART_ITConfig(PC_USART,USART_IT_IDLE,ENABLE);
    }
    if (USART_GetFlagStatus(PC_USART,USART_IT_RXNE)!= RESET)
    {
        ATCmd[ATLEN++] = PC_USART->DR;
        USART_ITConfig(PC_USART,USART_IT_IDLE,ENABLE);
    }
    if(USART_GetFlagStatus(PC_USART,USART_FLAG_IDLE)!= RESET)
    {
        data = PC_USART->DR;
        USART_ITConfig(PC_USART,USART_IT_IDLE,DISABLE);
        if (!strncmp((const char *)ATCmd,"AT+ISO15765-4STD_500K",21))
        {
            CotrolVale = SYS01; //设置协议类型 如:AT+ISO15765-4STD_500K
            ClearRAM((u8*)ATCmd,100);
        }
        else if (!strncmp((const char *)ATCmd,"AT+ISO15765-4EXT_500K",21))
        {
            CotrolVale = SYS02;
            ClearRAM((u8*)ATCmd,100);
        }
        else if (!strncmp((const char *)ATCmd,"AT+ISO15765-4STD_250K",21))
        {
            CotrolVale = SYS03;
            ClearRAM((u8*)ATCmd,100);
        }
        else if (!strncmp((const char *)ATCmd,"AT+ISO15765-4EXT_250K",21))
        {
            CotrolVale = SYS04;
            ClearRAM((u8*)ATCmd,100);
        }
        else if (!strncmp((const char *)ATCmd,"AT+ISO14230-4ADDR",17))
        {
            CotrolVale = SYS05;
            ClearRAM((u8*)ATCmd,100);
        }
        else if (!strncmp((const char *)ATCmd,"AT+ISO14230-4HL",15))
        {
            CotrolVale = SYS06;
            ClearRAM((u8*)ATCmd,100);
        }
        else if (!strncmp((const char *)ATCmd,"AT+ISO9141-2ADDR",16))
        {
            CotrolVale = SYS07;
            ClearRAM((u8*)ATCmd,100);
        }
        else if (!strncmp((const char *)ATCmd,"AT+DTC",6))
        {
            CotrolVale =  SYSDTC;	//确认故障码 如:AT+DTC03:P1101;P1102;P1103
        }
        else if (!strncmp((const char *)ATCmd,"AT+07DTC",8))
        {
            CotrolVale =  SYSDTC1;//待诊故障码 如:AT+07DTC03:P1101;P1102;P1103
        }
        else if (!strncmp((const char *)ATCmd,"AT+0ADTC",8))
        {
            CotrolVale =  SYSDTC2;//永久性故障码 如:AT+07DTC03:P1101;P1102;P1103
        }
        else if (!strncmp((const char *)ATCmd,"AT+SDS",6))
        {
            CotrolVale =  SYSDS;
        }
        else if (!strncmp((const char *)ATCmd,"AT+VIN",6))
        {
            CotrolVale =  SYSVIN; //设置车架号,如: AT+VIN=123456789ABCDEF12
        }
        else if (!strncmp((const char *)ATCmd,"AT+SETDS",8))
        {
            CotrolVale =  SYSSETDS;
        }
        else if(!strncmp((const char *)ATCmd,"AT+OFF",6))
        {
            CotrolVale =  SYSOFF; //Engine OFF
        }
        else if(!strncmp((const char *)ATCmd,"AT+SPEEDS",9))
        {
            CotrolVale =  SYSSS; //发动机转速Speed Start
        }
        else if(!strncmp((const char *)ATCmd,"AT+SPEEDE",9))
        {
            CotrolVale =  SYSSE; //发动机转速Speed Stop
        }
        else
        {
            printf(STR000);
            printf("\r\n");
            CotrolVale = SYSXX;
            ClearRAM((u8*)ATCmd,100);
        }
        ATLEN = 0;
    }
}
/************************************************************************
  * @描述:  TIM2中断服务函数
  * @参数:  None
  * @功能:  实现ISO15765-4协议 部分传感器参数模拟
  * @返回值: None
  **********************************************************************/
void TIM2_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
    {
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
        if(Flagspeedw == SET)
        {
            if(ProVale == SYS01 || ProVale == SYS02 || ProVale == SYS03 || ProVale == SYS04)
            {
                IRQVar.CANCPT->CANTXCMD[29].Data[4] = SpeedCount+speedw[wc]; 	//改变发动机转速
				IRQVar.CANCPT->CANTXCMD[83].Data[3] = VoltCount+Voltw[wc];		//改变控制模块电压
				IRQVar.CANCPT->CANTXCMD[30].Data[3] = SpeedC++;								//车速模拟0-255 km/h
				IRQVar.CANCPT->CANTXCMD[22].Data[3] = temprature++;						//发动机冷却液模拟0-255
				//方向盘转角模拟(斯柯达私有协议)
				if(Wheel_flag == 3)
				{
					IRQVar.CANCPT->CANTXCMD[141].Data[5] = 0xAD;
					IRQVar.CANCPT->CANTXCMD[141].Data[4] = 0x78;
					IRQVar.CANCPT->CANTXCMD[141].Data[3] = 0x00;
					Wheel_flag = 2;
				}
				else if(Wheel_flag == 2)
				{
					IRQVar.CANCPT->CANTXCMD[141].Data[4]--;
					if(IRQVar.CANCPT->CANTXCMD[141].Data[4] == 0x00)
						IRQVar.CANCPT->CANTXCMD[141].Data[5]--;
					if(IRQVar.CANCPT->CANTXCMD[141].Data[5] == 0xA0)
						Wheel_flag = 1;
				}
				else if(Wheel_flag == 1)
				{
					IRQVar.CANCPT->CANTXCMD[141].Data[5] = 0xB0;
					IRQVar.CANCPT->CANTXCMD[141].Data[4] = 0x00;
					IRQVar.CANCPT->CANTXCMD[141].Data[3] += (1<<2); //bit 2 赋值为1,表示右转
					Wheel_flag = 0;
				}
				else if(Wheel_flag == 0)
				{
					IRQVar.CANCPT->CANTXCMD[141].Data[4]++;
				if(IRQVar.CANCPT->CANTXCMD[141].Data[4] == 0xFF)
					IRQVar.CANCPT->CANTXCMD[141].Data[5]++;
				if(IRQVar.CANCPT->CANTXCMD[141].Data[5] >= 0xBD && IRQVar.CANCPT->CANTXCMD[30].Data[4] >= 0xBF)
					Wheel_flag = 3;
				}				
            }
			wc++;
			//printf("speed=%d\n",IRQVar.CANCPT->CANTXCMD[29].Data[4]);
            if(wc >= 7)
            {
                wc = 0;
            }
        }
    }
}
/************************************************************************
  * @描述:  CAN中断服务函数
  * @参数:  None
  * @功能:  接收外部诊断仪CAN请求
  * @返回值: None
  **********************************************************************/
void USB_LP_CAN1_RX0_IRQHandler(void)
{
    CanRxMsg RxMessage;
    __IO u8 i;

    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
	//接收到的数据显示到LCD
	LCD_Fill(60,270,130,310,WHITE);//清除之前的显示
	for(i=0;i<RxMessage.DLC;i++)
	{									    
		if(i<4)LCD_ShowxNum(60+i*32,270,RxMessage.Data[i],3,16,0X80);	//显示数据
		else LCD_ShowxNum(60+(i-4)*32,290,RxMessage.Data[i],3,16,0X80);	//显示数据
	}
	if (RxMessage.Data[0] != 0x30 && IRQVar.CANCPT->CANRXCMD[0].CANRxFrame.ExtId == RxMessage.ExtId || RxMessage.Data[0] != 0x30 && IRQVar.CANCPT->CANRXCMD[0].CANRxFrame.StdId == RxMessage.StdId)
    {
		for (IRQVar.CPS = 0; IRQVar.CPS < IRQVar.CANCPT->RXCMDCNT; IRQVar.CPS++)
        {
            IRQVar.flag = SET;
            for (i = 0; i < IRQVar.CANCPT->CANRXCMD[IRQVar.CPS].CN; i++)
            {
                if (IRQVar.CANCPT->CANRXCMD[IRQVar.CPS].CANRxFrame.Data[i] != RxMessage.Data[i])
                {
                    IRQVar.flag = RESET;
                    break;
                }
            }
            if (IRQVar.flag == SET)
            {
                IRQVar.CPL = SET;
                IRQVar.Flag30H = RESET;
                break;
            }
        }
    }
    else
    {
        IRQVar.CPL = SET;
        IRQVar.Flag30H = SET;
    }
}

四、ISO15765-4协议

波特率支持:单波特率(500KB/S)和多波特率(500KB/S、250KB/S)
CAN ID:由11位标准帧与29位扩展帧组成。请求过程和发送过程在代码里阐述。
代码如下:

/******************************设置协议结构体如下****************************/
typedef struct
{
    u16 STDID1;		//标准帧标识码高位
    u16 STDID2;		//标准帧标识码低位
    u16 MSTDID1;	//标准帧屏蔽码高位
    u16 MSTDID2;	//标准帧屏蔽码低位
    u32 EXTID1;		//扩展帧标识码高位
    u32 EXTID2;		//扩展帧标识码低位
    u32 MEXTID1;	//扩展帧屏蔽码高位
    u32 MEXTID2;	//扩展帧屏蔽码低位
    u32 RXCMDCNT;	//接收请求数目
    CPCMD	  CANRXCMD[150];	//接收到的数据包
    CanTxMsg  CANTXCMD[150];	//发送的CAN数据包
} CANCPTabTypeDef;
typedef struct
{
    u32 CN;					//识别请求的字节数目
    CanRxMsg CANRxFrame;	//收到的CAN数据
    u8     REQ;				//接收完成标识位
} CPCMD;
/**************************ISO15765-4标准协议PID****************************/
CANCPTabTypeDef  CANCPTab1 =   { 0x7DF,0x7DF,0x700,0x700,0x18DAF110,0x18DAF110,0x1F000000,0x1F000000,121,
    {
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0}, 0},	//0
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x20,0x00,0x00,0x00,0x00,0x00,0}, 1},	//1
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x40,0x00,0x00,0x00,0x00,0x00,0}, 2},	//2
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x09,0x02,0x00,0x00,0x00,0x00,0x00,0},120},//3
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0}, 4},	//4
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0}, 5},	//5
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x01,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0}, 9},	//6
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x01,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0}, 13},//7
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x01,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0}, 17},//8
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x41,0x00,0x00,0x00,0x00,0x00,0}, 18},//9
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0}, 19},//10
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0}, 20},//11
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x04,0x00,0x00,0x00,0x00,0x00,0}, 21},//12
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x05,0x00,0x00,0x00,0x00,0x00,0}, 22},//13
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x06,0x00,0x00,0x00,0x00,0x00,0}, 23},//14
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x07,0x00,0x00,0x00,0x00,0x00,0}, 24},//15
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x08,0x00,0x00,0x00,0x00,0x00,0}, 25},//16
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x09,0x00,0x00,0x00,0x00,0x00,0}, 26},//17
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x0A,0x00,0x00,0x00,0x00,0x00,0}, 27},//18
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x0B,0x00,0x00,0x00,0x00,0x00,0}, 28},//19
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x0C,0x00,0x00,0x00,0x00,0x00,0}, 29},//20
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x0D,0x00,0x00,0x00,0x00,0x00,0}, 30},//21
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x0E,0x00,0x00,0x00,0x00,0x00,0}, 31},//22
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x0F,0x00,0x00,0x00,0x00,0x00,0}, 32},//23
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0}, 33},//24
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x11,0x00,0x00,0x00,0x00,0x00,0}, 34},//25
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x12,0x00,0x00,0x00,0x00,0x00,0}, 35},//26
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x13,0x00,0x00,0x00,0x00,0x00,0}, 36},//27
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0}, 37},//28
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x15,0x00,0x00,0x00,0x00,0x00,0}, 38},//29
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x16,0x00,0x00,0x00,0x00,0x00,0}, 39},//30
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x17,0x00,0x00,0x00,0x00,0x00,0}, 40},//31
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x18,0x00,0x00,0x00,0x00,0x00,0}, 41},//32
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x19,0x00,0x00,0x00,0x00,0x00,0}, 42},//33
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x1A,0x00,0x00,0x00,0x00,0x00,0}, 43},//34
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x1B,0x00,0x00,0x00,0x00,0x00,0}, 44},//35
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x1C,0x00,0x00,0x00,0x00,0x00,0}, 45},//36
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x1D,0x00,0x00,0x00,0x00,0x00,0}, 46},//37
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x1E,0x00,0x00,0x00,0x00,0x00,0}, 47},//38
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x1F,0x00,0x00,0x00,0x00,0x00,0}, 48},//39
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x20,0x00,0x00,0x00,0x00,0x00,0}, 49},//40
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x21,0x00,0x00,0x00,0x00,0x00,0}, 50},//41
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x22,0x00,0x00,0x00,0x00,0x00,0}, 51},//42
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x23,0x00,0x00,0x00,0x00,0x00,0}, 52},//43
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x24,0x00,0x00,0x00,0x00,0x00,0}, 53},//44
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x25,0x00,0x00,0x00,0x00,0x00,0}, 54},//45
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x26,0x00,0x00,0x00,0x00,0x00,0}, 55},//46
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x27,0x00,0x00,0x00,0x00,0x00,0}, 56},//47
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x28,0x00,0x00,0x00,0x00,0x00,0}, 57},//48
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x29,0x00,0x00,0x00,0x00,0x00,0}, 58},//49
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x2A,0x00,0x00,0x00,0x00,0x00,0}, 59},//50
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x2B,0x00,0x00,0x00,0x00,0x00,0}, 60},//51
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x2C,0x00,0x00,0x00,0x00,0x00,0}, 61},//52
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x2D,0x00,0x00,0x00,0x00,0x00,0}, 62},//53
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x2E,0x00,0x00,0x00,0x00,0x00,0}, 63},//54
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x2F,0x00,0x00,0x00,0x00,0x00,0}, 64},//55
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x30,0x00,0x00,0x00,0x00,0x00,0}, 65},//56
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x31,0x00,0x00,0x00,0x00,0x00,0}, 66},//57
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x32,0x00,0x00,0x00,0x00,0x00,0}, 67},//58
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x33,0x00,0x00,0x00,0x00,0x00,0}, 68},//59
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x34,0x00,0x00,0x00,0x00,0x00,0}, 69},//60
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x35,0x00,0x00,0x00,0x00,0x00,0}, 70},//61
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x36,0x00,0x00,0x00,0x00,0x00,0}, 71},//62
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x37,0x00,0x00,0x00,0x00,0x00,0}, 72},//63
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x38,0x00,0x00,0x00,0x00,0x00,0}, 73},//64
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x39,0x00,0x00,0x00,0x00,0x00,0}, 74},//65
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x3A,0x00,0x00,0x00,0x00,0x00,0}, 75},//66
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x3B,0x00,0x00,0x00,0x00,0x00,0}, 76},//67
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x3C,0x00,0x00,0x00,0x00,0x00,0}, 77},//68
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x3D,0x00,0x00,0x00,0x00,0x00,0}, 78},//69
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x3E,0x00,0x00,0x00,0x00,0x00,0}, 79},//70
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x3F,0x00,0x00,0x00,0x00,0x00,0}, 80},//71
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x40,0x00,0x00,0x00,0x00,0x00,0}, 81},//72
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x41,0x00,0x00,0x00,0x00,0x00,0}, 82},//73
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x42,0x00,0x00,0x00,0x00,0x00,0}, 83},//74
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x43,0x00,0x00,0x00,0x00,0x00,0}, 84},//75
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x44,0x00,0x00,0x00,0x00,0x00,0}, 85},//76
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x45,0x00,0x00,0x00,0x00,0x00,0}, 86},//77
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x46,0x00,0x00,0x00,0x00,0x00,0}, 87},//78
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x47,0x00,0x00,0x00,0x00,0x00,0}, 88},//79
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x48,0x00,0x00,0x00,0x00,0x00,0}, 89},//80
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x49,0x00,0x00,0x00,0x00,0x00,0}, 90},//81
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x4A,0x00,0x00,0x00,0x00,0x00,0}, 91},//82
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x4B,0x00,0x00,0x00,0x00,0x00,0}, 92},//83
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x4C,0x00,0x00,0x00,0x00,0x00,0}, 93},//84
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x4D,0x00,0x00,0x00,0x00,0x00,0}, 94},//85
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x4E,0x00,0x00,0x00,0x00,0x00,0}, 95},//86
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x4F,0x00,0x00,0x00,0x00,0x00,0}, 96},//87
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x50,0x00,0x00,0x00,0x00,0x00,0}, 97},//88
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x51,0x00,0x00,0x00,0x00,0x00,0}, 98},//89
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x52,0x00,0x00,0x00,0x00,0x00,0}, 99},//90
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x53,0x00,0x00,0x00,0x00,0x00,0},100},//91
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x54,0x00,0x00,0x00,0x00,0x00,0},101},//92
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x55,0x00,0x00,0x00,0x00,0x00,0},102},//93
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x56,0x00,0x00,0x00,0x00,0x00,0},103},//94
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x57,0x00,0x00,0x00,0x00,0x00,0},104},//95
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x58,0x00,0x00,0x00,0x00,0x00,0},105},//96
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x59,0x00,0x00,0x00,0x00,0x00,0},106},//97
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x5A,0x00,0x00,0x00,0x00,0x00,0},107},//98
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x5B,0x00,0x00,0x00,0x00,0x00,0},108},//99
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x5C,0x00,0x00,0x00,0x00,0x00,0},109},//100
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x5D,0x00,0x00,0x00,0x00,0x00,0},110},//101
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x5E,0x00,0x00,0x00,0x00,0x00,0},111},//102
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x01,0x5F,0x00,0x00,0x00,0x00,0x00,0},112},//103
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0},113},//104
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x03,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0},114},//105
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x03,0x02,0x20,0x00,0x00,0x00,0x00,0x00,0},115},//106
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x03,0x02,0x40,0x00,0x00,0x00,0x00,0x00,0},116},//107
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x03,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0},117},//108
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x03,0x02,0x41,0x00,0x00,0x00,0x00,0x00,0},118},//109
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0},119},//110
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x09,0x04,0x00,0x00,0x00,0x00,0x00,0},123},//111
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x09,0x06,0x00,0x00,0x00,0x00,0x00,0},126},//112
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x09,0x08,0x00,0x00,0x00,0x00,0x00,0},129},//113
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x09,0x0A,0x00,0x00,0x00,0x00,0x00,0},132},//115
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x09,0x0B,0x00,0x00,0x00,0x00,0x00,0},135},//116
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0},138},//117
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0},139},//118
        {3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0},140},//119
		{3,{0x7DF,0x18DB33F1,CAN_ID_STD,CAN_RTR_DATA,8,0x02,0x06,0x09,0x00,0x00,0x00,0x00,0x00,0},141},//120
    },
    {
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x00,0xFF,0xFF,0xFF,0xFF,0xFF},//0
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x20,0xFF,0xFF,0xFF,0xFF,0xFF},//1
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x40,0xFF,0xFF,0xFF,0xFF,0xFF},//2
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x49,0x02,0xFF,0xFF,0xFF,0xFF,0xFF},//3
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x01,0xFF,0xFF,0xFF,0xFF,0xFF},//4
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x01,0x43,0x00,0x00,0x00,0x00,0x00,0x00},//5
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//6
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//7
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//8
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x01,0x47,0x00,0x00,0x00,0x00,0x00,0x00},//9
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//10
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//11
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//12
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x01,0x4A,0x00,0x00,0x00,0x00,0x00,0x00},//13
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//14
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//15
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//16
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x01,0x44,0x00,0x00,0x00,0x00,0x00,0x00},//17
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x41,0xFF,0xFF,0xFF,0xFF,0xFF},//18
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x02,0x00,0x00,0x00,0x00,0x00},//19
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x03,0x00,0x00,0x00,0x00,0x00},//20
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x04,0x00,0x00,0x00,0x00,0x00},//21
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x05,0x00,0x00,0x00,0x00,0x00},//22
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x06,0x00,0x00,0x00,0x00,0x00},//23
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x07,0x00,0x00,0x00,0x00,0x00},//24
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x08,0x00,0x00,0x00,0x00,0x00},//25
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x09,0x00,0x00,0x00,0x00,0x00},//26
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x0A,0x00,0x00,0x00,0x00,0x00},//27
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x0B,0x00,0x00,0x00,0x00,0x00},//28
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x0C,0x00,0x00,0x00,0x00,0x00},//29
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x0D,0x00,0x00,0x00,0x00,0x00},//30
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x0E,0x00,0x00,0x00,0x00,0x00},//31
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x0F,0x00,0x00,0x00,0x00,0x00},//32
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x10,0x00,0x00,0x00,0x00,0x00},//33
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x11,0x00,0x0A,0x00,0x00,0x00},//34
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x12,0x00,0x00,0x00,0x00,0x00},//35
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x13,0x03,0x00,0x00,0x00,0x00},//36
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x14,0x00,0x00,0x00,0x00,0x00},//37
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x15,0x00,0x00,0x00,0x00,0x00},//38
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x16,0x00,0x00,0x00,0x00,0x00},//39
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x17,0x00,0x00,0x00,0x00,0x00},//40
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x18,0x00,0x00,0x00,0x00,0x00},//41
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x19,0x00,0x00,0x00,0x00,0x00},//42
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x1A,0x00,0x00,0x00,0x00,0x00},//43
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x1B,0x00,0x00,0x00,0x00,0x00},//44
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x1C,0x00,0x00,0x00,0x00,0x00},//45
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x1D,0x00,0x00,0x00,0x00,0x00},//46
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x1E,0x00,0x00,0x00,0x00,0x00},//47
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x1F,0x00,0x00,0x00,0x00,0x00},//48
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x20,0x00,0x00,0x00,0x00,0x00},//49
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x21,0x00,0x00,0x00,0x00,0x00},//50
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x22,0x00,0x00,0x00,0x00,0x00},//51
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x23,0x00,0x00,0x00,0x00,0x00},//52
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x24,0x00,0x00,0x00,0x00,0x00},//53
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x25,0x00,0x00,0x00,0x00,0x00},//54
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x26,0x00,0x00,0x00,0x00,0x00},//55
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x27,0x00,0x00,0x00,0x00,0x00},//56
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x28,0x00,0x00,0x00,0x00,0x00},//57
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x29,0x00,0x00,0x00,0x00,0x00},//58
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x2A,0x00,0x00,0x00,0x00,0x00},//59
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x2B,0x00,0x00,0x00,0x00,0x00},//60
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x2C,0x00,0x00,0x00,0x00,0x00},//61
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x2D,0x00,0x00,0x00,0x00,0x00},//62
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x2E,0x00,0x00,0x00,0x00,0x00},//63
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x2F,0x00,0x00,0x00,0x00,0x00},//64
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x30,0x00,0x00,0x00,0x00,0x00},//65
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x31,0x00,0x00,0x00,0x00,0x00},//66
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x32,0x00,0x00,0x00,0x00,0x00},//67
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x33,0x00,0x00,0x00,0x00,0x00},//68
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x34,0x00,0x00,0x00,0x00,0x00},//69
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x35,0x00,0x00,0x00,0x00,0x00},//70
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x36,0x00,0x00,0x00,0x00,0x00},//71
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x37,0x00,0x00,0x00,0x00,0x00},//72
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x38,0x00,0x00,0x00,0x00,0x00},//73
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x39,0x00,0x00,0x00,0x00,0x00},//74
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x3A,0x00,0x00,0x00,0x00,0x00},//75
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x3B,0x00,0x00,0x00,0x00,0x00},//76
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x3C,0x00,0x00,0x00,0x00,0x00},//77
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x3D,0x00,0x00,0x00,0x00,0x00},//78
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x3E,0x00,0x00,0x00,0x00,0x00},//79
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x3F,0x00,0x00,0x00,0x00,0x00},//80
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x40,0x00,0x00,0x00,0x00,0x00},//81
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x41,0x00,0x00,0x00,0x00,0x00},//82
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x42,0x14,0x00,0x00,0x00,0x00},//83
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x43,0x00,0x00,0x00,0x00,0x00},//84
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x44,0x00,0x00,0x00,0x00,0x00},//85
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x45,0x00,0x00,0x00,0x00,0x00},//86
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x46,0x00,0x00,0x00,0x00,0x00},//87
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x47,0x00,0x00,0x00,0x00,0x00},//88
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x48,0x00,0x00,0x00,0x00,0x00},//89
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x49,0x00,0x00,0x00,0x00,0x00},//90
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x4A,0x00,0x00,0x00,0x00,0x00},//91
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x4B,0x00,0x00,0x00,0x00,0x00},//92
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x4C,0x00,0x00,0x00,0x00,0x00},//93
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x4D,0x00,0x00,0x00,0x00,0x00},//94
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x4E,0x00,0x00,0x00,0x00,0x00},//95
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x4F,0x00,0x00,0x00,0x00,0x00},//96
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x50,0x00,0x00,0x00,0x00,0x00},//97
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x51,0x00,0x00,0x00,0x00,0x00},//98
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x52,0x00,0x00,0x00,0x00,0x00},//99
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x53,0x00,0x00,0x00,0x00,0x00},//100
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x54,0x00,0x00,0x00,0x00,0x00},//101
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x55,0x00,0x00,0x00,0x00,0x00},//102
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x56,0x00,0x00,0x00,0x00,0x00},//103
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x57,0x00,0x00,0x00,0x00,0x00},//104
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x58,0x00,0x00,0x00,0x00,0x00},//105
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x59,0x00,0x00,0x00,0x00,0x00},//106
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x5A,0x00,0x00,0x00,0x00,0x00},//107
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x5B,0x00,0x00,0x00,0x00,0x00},//108
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x5C,0x00,0x00,0x00,0x00,0x00},//109
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x5D,0x00,0x00,0x00,0x00,0x00},//110
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x5E,0x00,0x00,0x00,0x00,0x00},//111
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x41,0x5F,0x00,0x00,0x00,0x00,0x00},//112
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x42,0x00,0x00,0x7F,0x3E,0x80,0x00},//113
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x42,0x02,0xff,0xff,0xff,0xff,0xff},//114
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x42,0x20,0xff,0xff,0xff,0xff,0xff},//115
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x42,0x40,0xff,0xff,0xff,0xff,0xff},//116
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x42,0x01,0xff,0xff,0xff,0xff,0xff},//117
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x42,0x41,0xff,0xff,0xff,0xff,0xff},//118
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x49,0xff,0xff,0xff,0xff,0xff,0xff},//119
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x10,0x14,0x49,0x00,0x00,0x4C,0x44,0x43},//120
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x21,0x31,0x32,0x33,0x34,0x35,0x36,0x37},//121
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x22,0x38,0x39,0x30,0x31,0x32,0x33,0x34},//122
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x10,0x14,0x49,0x04,0x00,0x53,0x4E,0x30},//123
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x21,0x31,0x32,0x33,0x34,0x35,0x36,0x37},//124
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x22,0x38,0x39,0x30,0x31,0x32,0x33,0x34},//125
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x10,0x14,0x49,0x06,0x00,0x53,0x4E,0x30},//126
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x21,0x31,0x32,0x33,0x34,0x35,0x36,0x37},//127
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x22,0x38,0x39,0x30,0x31,0x32,0x33,0x34},//128
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x10,0x14,0x49,0x08,0x00,0x53,0x4E,0x30},//129
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x21,0x31,0x32,0x33,0x34,0x35,0x36,0x37},//130
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x22,0x38,0x39,0x30,0x31,0x32,0x33,0x34},//131
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x10,0x14,0x49,0x0A,0x00,0x53,0x4E,0x30},//132
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x21,0x31,0x32,0x33,0x34,0x35,0x36,0x37},//133
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x22,0x38,0x39,0x30,0x31,0x32,0x33,0x34},//134
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x10,0x14,0x49,0x0B,0x00,0x53,0x4E,0x30},//135
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x21,0x31,0x32,0x33,0x34,0x35,0x36,0x37},//136
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x22,0x38,0x39,0x30,0x31,0x32,0x33,0x34},//137
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x48,0x00,0xff,0xff,0xff,0xff,0xff},//138
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x48,0x01,0xff,0xff,0xff,0xff,0xff},//139
        {0x7E8,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x46,0xff,0xff,0xff,0xff,0xff,0xff},//140
		{0x0D0,0x18DAF110,CAN_ID_STD,CAN_RTR_DATA,8,0x07,0x46,0x09,0x00,0x00,0x00,0x00,0x00},//141
    },
};
//中断状态标识符结构体声明
typedef struct
{
    __IO u32 CPS;					//计数器
    __IO CANCPTabTypeDef *CANCPT;	//数据结构体指针
    __IO FlagStatus flag;			//接收到正确的ECU数据帧的状态标志
	__IO FlagStatus CPL;			//发送数据状态标志,开始发送数据置1,发送数据结束置0
    __IO FlagStatus Flag30H;		//状态标识位
    __IO u8 NFrameLen;				//帧长度
} IRQVarTypeDef;

ISO15765-4协议代码如下:

/************************************************************************
  * @描述:  ISO协议应答函数
  * @参数:  CANCPTab: 协议数据结构体地址
  * 			  speed: CAN通信速度
  * 			  CANStype: 帧类型
  * @返回值: None
  * 注:重点注释关键部分
  **********************************************************************/
void ISO15765_4Setting(CANCPTabTypeDef *CANCPTab,u8 speed,u8 CANStype)
{
    u8 i,nframe,Num;
    __IO MenuType CotrolVale1 = SYSEND;
    char str[100];
    ABdef AB[3] = {
        {6,5},
        {8,9},
        {8,13},
    };
    ERRORType err;

    IRQVar.CANCPT = CANCPTab;
    IRQVar.CPL = RESET;
    CotrolVale1 = CotrolVale;
    while(CotrolVale != SYSEND && CotrolVale != SYS05 && CotrolVale != SYS06 && CotrolVale != SYS07)
    {
        if (CotrolVale == SYS01)
        {
            if (CotrolVale1 != SYS01)
            {
                break;
            }
            printf(STR006);
            CotrolVale = SYSXX;
        }
        else if (CotrolVale == SYS02)
        {
            if (CotrolVale1 != SYS02)
            {
                break;
            }
            printf(STR163);
            CotrolVale = SYSXX;
        }
        else if (CotrolVale == SYS03)
        {
            if (CotrolVale1 != SYS03)
            {
                break;
            }
            printf(STR164);
            CotrolVale = SYSXX;
        }
        else if (CotrolVale == SYS04)
        {
            if (CotrolVale1 != SYS04)
            {
                break;
            }
            printf(STR165);
            CotrolVale = SYSXX;
        }
        else if (CotrolVale == SYSDTC || CotrolVale == SYSDTC1 || CotrolVale == SYSDTC2)
        {
            if (CotrolVale == SYSDTC)
            {
                i = 0;
            }
            else if (CotrolVale == SYSDTC1)
            {
                i = 1;
            }
            else if (CotrolVale == SYSDTC2)
            {
                i = 2;
            }
            switch(SetDTCRAM(&ATCmd[AB[i].A],DTCRAM))
            {
            case ERR0:
                printf(STR000);
                printf("\r\n");
                break;
            case ERR1:
                printf(STR002);
                break;
            default:
                SetDTCTab(DTCRAM,AB[i].B,iso15765);
                if (CotrolVale == SYSDTC)
                {
                    printf(STR003);
                }
                else if (CotrolVale == SYSDTC1)
                {
                    printf(STR004);
                }
                else if (CotrolVale == SYSDTC2)
                {
                    printf(STR005);
                }
                ClearRAM((u8*)str,100);
                strncpy(str,(char*)&ATCmd[AB[i].A+3],DTCRAM[0]*6);
                printf((const char*)str);
                printf("\r\n");
                ClearRAM((u8*)DTCRAM,21);
                ClearRAM((u8*)str,100);
                ClearRAM((u8*)ATCmd,100);
                break;
            }
            CotrolVale = SYSXX;
        }
        else if (CotrolVale == SYSDS)
        {
            Num = GetDSNumber(&ATCmd[6],&err,3);
            if (err == ERR0)
            {
                printf(STR000);
                printf("\r\n");
                CotrolVale = SYSXX;
                ClearRAM((u8*)ATCmd,100);
                ClearRAM((u8*)DSRAM,2);
                continue;
            }
            if (DSOLDNUM != Num)
            {
                if (DSControl15765[Num].ByteNum == 1)
                {
                    Count = CANCPTab->CANTXCMD[DSControl15765[Num].Y].Data[DSControl15765[Num].X];
                }
                else if (DSControl15765[Num].ByteNum == 2)
                {
                    Count = CANCPTab->CANTXCMD[DSControl15765[Num].Y].Data[DSControl15765[Num].X]<<8 | CANCPTab->CANTXCMD[DSControl15765[Num].Y].Data[DSControl15765[Num].X+1];
                }
                DSOLDNUM = Num;
            }
            for (i = 0; i < DSControl15765[Num].ByteNum; i++)
            {
               DSRAM[i] = CANCPTab->CANTXCMD[DSControl15765[Num].Y].Data[DSControl15765[Num].X + i];
            }						
            err = SetDSRAM(ATCmd,DSControl15765,DSRAM,SET);	//===========================================
            if (err == ERR0)
            {
                printf(STR000);
                printf(STR009);
                printf("\"\r\n");
                CotrolVale = SYSXX;
                ClearRAM((u8*)ATCmd,100);
                ClearRAM((u8*)DSRAM,2);
                continue;
            }
            else if (err == ERR1)
            {
                printf(STR000);
                printf(STR160);
                printf(DSControl15765[Num].range);
                printf("\r\n");
                CotrolVale = SYSXX;
                ClearRAM((u8*)ATCmd,100);
                ClearRAM((u8*)DSRAM,2);
                continue;
            }
            for (i = 0; i < DSControl15765[Num].ByteNum; i++)
            {
                CANCPTab->CANTXCMD[DSControl15765[Num].Y].Data[DSControl15765[Num].X + i] = DSRAM[i];
            }
            CotrolVale = SYSXX;
            ClearRAM((u8*)ATCmd,100);
            ClearRAM((u8*)DSRAM,2);
        }
        else if (CotrolVale == SYSSETDS)
        {
            Num = GetDSNumber(&ATCmd[8],&err,3);
            if (err == ERR0)
            {
                printf(STR000);
                printf("\r\n");
                CotrolVale = SYSXX;
                ClearRAM((u8*)ATCmd,100);
                ClearRAM((u8*)DSRAM,2);
                continue;
            }
            Count = GetDSNumber(&ATCmd[12],&err,5);
            err = SetDSRAM(ATCmd,DSControl15765,DSRAM,RESET);
            if (err == ERR0 || err == ERR1)
            {
                printf(STR000);
                printf(STR160);
                printf(DSControl15765[Num].range);
                printf("\r\n");
                CotrolVale = SYSXX;
                ClearRAM((u8*)ATCmd,100);
                ClearRAM((u8*)DSRAM,2);
                continue;
            }
            for (i = 0; i < DSControl15765[Num].ByteNum; i++)
            {
                CANCPTab->CANTXCMD[DSControl15765[Num].Y].Data[DSControl15765[Num].X + i] = DSRAM[i];
            }
            CotrolVale = SYSXX;
            ClearRAM((u8*)ATCmd,100);
            ClearRAM((u8*)DSRAM,2);
            if(Flagspeedw == SET)
            {
                SpeedCount = CANCPTab->CANTXCMD[29].Data[4];	//获取发动机转角的初值
				VoltCount = CANCPTab->CANTXCMD[83].Data[3];		//获取ECU电压的初值
				SpeedC = CANCPTab->CANTXCMD[30].Data[3];		//获取汽车速度的初值
				temprature = CANCPTab->CANTXCMD[22].Data[3];	//获取发动机冷却液的初值
            }
        }
        else if (CotrolVale == SYSOFF)
        {
            printf(STR169);
            CotrolVale = SYSEND;
        }
        else if (CotrolVale == SYSSS)
        {
            printf(STR170);
            CotrolVale = SYSXX;
            SpeedCount = CANCPTab->CANTXCMD[29].Data[4];
			VoltCount = CANCPTab->CANTXCMD[83].Data[3];
			SpeedC = CANCPTab->CANTXCMD[30].Data[3];
			temprature = CANCPTab->CANTXCMD[22].Data[3];
            Flagspeedw = SET;
        }
        else if (CotrolVale == SYSSE)
        {
            printf(STR171);
            CotrolVale = SYSXX;
            Flagspeedw = RESET;
        }
        else if (CotrolVale == SYSVIN)
        {
            if (CheckASCII(&ATCmd[7],17,VINRAM) == ERR0)
            {
                printf(STR161);
                printf("\r\n");
                CotrolVale = SYSXX;
                ClearRAM((u8*)ATCmd,100);
                continue;
            }
            for (i = 0; i < 3; i++)
            {
                CANCPTab->CANTXCMD[120].Data[5 + i] = VINRAM[i];
            }
            for (i = 0; i < 7; i++)
            {
                CANCPTab->CANTXCMD[121].Data[1 + i] = VINRAM[i+3];
            }
            for (i = 0; i < 7; i++)
            {
                CANCPTab->CANTXCMD[122].Data[1 + i] = VINRAM[i+10];
            }
            printf(STR162);
            printf((const char*)VINRAM);
            printf("\r\n");
            CotrolVale = SYSXX;
            ClearRAM((u8*)ATCmd,100);
            ClearRAM((u8*)DTCRAM,21);
        }
        if (IRQVar.CPL == SET && IRQVar.Flag30H == RESET)
        {
            if (CANCPTab->CANTXCMD[CANCPTab->CANRXCMD[IRQVar.CPS].REQ].Data[0] == 0x10)
            {
                IRQVar.NFrameLen = CANCPTab->CANTXCMD[CANCPTab->CANRXCMD[IRQVar.CPS].REQ].Data[1];
            }
            CANCPTab->CANTXCMD[CANCPTab->CANRXCMD[IRQVar.CPS].REQ].IDE = CANStype;
            TransmitMailbox = CAN_Transmit(CAN1,&CANCPTab->CANTXCMD[CANCPTab->CANRXCMD[IRQVar.CPS].REQ]);
            while(CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK);
			//LCD显示发送的数据
			for(i=0;i<CANCPTab->CANTXCMD[CANCPTab->CANRXCMD[IRQVar.CPS].REQ].DLC;i++)
			{
				if(i<4)LCD_ShowxNum(60+i*32,210,CANCPTab->CANTXCMD[CANCPTab->CANRXCMD[IRQVar.CPS].REQ].Data[i],3,16,0X80);	//显示数据
				else LCD_ShowxNum(60+(i-4)*32,230,CANCPTab->CANTXCMD[CANCPTab->CANRXCMD[IRQVar.CPS].REQ].Data[i],3,16,0X80);	//显示数据
			}
            IRQVar.CPL = RESET;
        }
        else if (IRQVar.CPL == SET && IRQVar.Flag30H == SET)
        {
            if ((IRQVar.NFrameLen+1)%7 > 0)
            {
                nframe = (IRQVar.NFrameLen+1)/7 + 1;
            }
            else
            {
                nframe = (IRQVar.NFrameLen+1)/7;
            }
            for (i = 1; i < nframe; i++)
            {
                delay_ms(1);
                CANCPTab->CANTXCMD[CANCPTab->CANRXCMD[IRQVar.CPS].REQ+i].IDE = CANStype;
                TransmitMailbox = CAN_Transmit(CAN1,&CANCPTab->CANTXCMD[CANCPTab->CANRXCMD[IRQVar.CPS].REQ+i]);
                while(CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK);
            }

            IRQVar.Flag30H = RESET;
            IRQVar.CPL = RESET;
        }
    }
}

实践截图如下:
AT指令:AT+ISO15765-4STD_500K (协议使能)
串口接收:ISO15765-4 11bit 500K enabled
AT指令:AT+DTC03:P1101;P1102;P1103(模拟故障号)
串口接收: Confirmed diagnostic trouble codes:P1101;P1102;P1103
AT指令:AT+VIN=123456789ABCDEF12 (模拟车架号)
串口接收:VIN:123456789ABCDEF12
AT指令:AT+SPEEDS (模拟量开始)
串口接收: Speed Start
在这里插入图片描述
在这里插入图片描述
本项目用的是STM32精英板,另外一个板子也是STM32F103 的MCU。
至此,项目得主体代码全部附上。篇幅较长,花了一下午时间,还有很多地方注释的不够清楚,望谅解~~!!
原创不易,转载请标明出处,谢谢!
交流群:916385027
本人QQ:971312944

发布了5 篇原创文章 · 获赞 10 · 访问量 2769

猜你喜欢

转载自blog.csdn.net/weixin_43729724/article/details/101287363