//------------------------------------------------------------------------------
// Purpose: J1850PWM-3 传输层函数
// Funtion: 协议中并没有规定该层,但在实际的传输过程中出现了基于数据块的多包
// 交互,并且有相应的分包策略和数据包的格式自动设定过程
// Dependent:CML_J1850PWM
// Designer:
// Date.Ver:
//------------------------------------------------------------------------------
#ifndef CMT_J1850PWM_C
#define CMT_J1850PWM_C
#include "CMT_J1850PWM.h"
//------------------------------------------------------------------------------
// Funtion: J1850PWM 开始建立传输 初始化协议通讯模块
// Input : Pakpara - 数据包传输参数
// PakTime - 传输时间参数
// Lenth - 发送的一个数据帧长度
// Data - 发送的一个数据帧
// Output : Ecuname - 应答的 ECU 节点地址集
// Return : 应答的 ECU 节点数量
// Info : 本函数之外所有 J1850PWM 协议函数都必须在本函数调用后才有效
//------------------------------------------------------------------------------
char CMT_J1850PWM_StartTrans( CMLJ1850PWMpara Pakpara, CMLJ1850PWMtime PakTime,
unsigned char Lenth, unsigned char *Data,
unsigned long *Ecuname )
{
unsigned char ECUnumb;
unsigned char i;
PAKSEND Paksend;
PAKRECV Pakrecv;
if( false == CML_J1850PWM_Open( Pakpara, PakTime ) )//如果打开端口失败
{
return false;
}
if( Lenth )//判断发送数据长度
{
Paksend.PakLenth = ( unsigned char )Lenth;//构造发送数据包
Paksend.Pakdata = Data;
CML_J1850PWM_Send( &Paksend );//发送
}
else
{
return false;
}
ECUnumb = 0;//ECU回应数量初始化
while( 1 )//循环等待接收数据
{
if( (CML_J1850PWM_Recv( &Pakrecv ) != false) )//接收到有效数据
{
Ecuname[ ECUnumb ] = Pakrecv.PakID;//接收ECU地址到Ecuname
ECUnumb++;
}
else//接收完毕则返回回应ECU数量
{
return ECUnumb;
}
}
}
//------------------------------------------------------------------------------
// Funtion: J1850PWM 停止传输
// Input : none
// Output : none
// Return : 停止传输成功时返回 true 停止传输失败返回 false
// Info : none
//------------------------------------------------------------------------------
char CMT_J1850PWM_StopTrans( )
{
CML_J1850PWM_Close( );
return true;
}
//------------------------------------------------------------------------------
// Funtion: J1850PWM 命令传输
// Input : Paksend - 待发送数据包
// MaxPak - 最大接收包数
// Output : Pakrecv - 待接收数据
// PakNumb - 接收到的包数量
// Return : 应答码
// Info : none
//------------------------------------------------------------------------------
char CMT_J1850PWM_TransCMD( PAKSEND *Paksend, PAKRECV *Pakrecv,
unsigned char *PakNumb, char MaxPak )
{
unsigned char Repcode;
unsigned char i;
// 数据发送
if( ( NULL != Paksend ) && ( NULL != Pakrecv ) )
{
CML_J1850PWM_Send( Paksend );
}
else
{
return false;
}
i = 0;
Repcode = true;
//一只等待后续帧传输完成,等待时间为一个 P2
while( true == Repcode )
{
// 数据接收
Repcode = CML_J1850PWM_Recv( &Pakrecv[ i ] );
i++;
if( MaxPak <= i )
{
break;
}
}
if( i == MaxPak )
{
(*PakNumb) = i - 1;
}
else
{
(*PakNumb) = i;
}
return Repcode;
}
//------------------------------------------------------------------------------
// Funtion: J1850PWM 命令传输
// Output : RecvLenth - 接收到的数据长度
// Recdata - 回送的数据
// Input : Lenth - 待传输数据长度
// data - 待传输数据
// Userpos - 用户自定义起始区位置
// RecvLenth - 接收的最大长度
// Return : 应答码
// Info : 本函数仅用在对地址信息和包长度不关心的情况内,本函数可根据 Userpos
// 的值重组用户区
//------------------------------------------------------------------------------
unsigned char CMT_J1850PWM_TransCMDFix( int Lenth, unsigned char *data,
int *RecvLenth, unsigned char *Recdata,
char Userpos )
{
unsigned char Repcode;
PAKSEND Paksend;
PAKRECV Pakrecv;
unsigned char i, j;
unsigned char Stemp[ 200 ];
unsigned char Rtemp[ 400 ];
// 数据发送
if( Lenth )
{
Paksend.Pakdata = Stemp;
Paksend.PakLenth = ( unsigned char )Lenth;
Pakrecv.Pakdata = Rtemp;
for( i = 0; i < Paksend.PakLenth; i++ )
{
Paksend.Pakdata[ i ] = data[ i ];
}
CML_J1850PWM_Send( &Paksend );
}
else
{
return false;
}
Repcode = true;
i = 0;
j = 0;
//一只等待后续帧传输完成,等待时间为一个 P2
while( true == Repcode )
{
// 数据接收
Repcode = CML_J1850PWM_Recv( &Pakrecv );
if( true == Repcode )
{
for( j = Userpos; j < Pakrecv.PakLenth; j++ )
{
Recdata[ i + j - Userpos ] = Pakrecv.Pakdata[ j ];
if( (i + j) >= (*RecvLenth) )
{
break;
}
}
if( Pakrecv.PakLenth > Userpos )
{
i = i + j - Userpos;
}
}
}
if( i > Userpos )
{
(*RecvLenth) = i - Userpos - 1;
}
return Repcode;
}
//------------------------------------------------------------------------------
// Funtion: J1850PWM 设定传输参数
// Input : Paktime - 传输时间详细参数
// Pakpara - 传输详细参数
// Output : none
// Return : true or false
// Info : none
//------------------------------------------------------------------------------
char CMT_J1850PWM_Setpara( CMTJ1850PWMtime Paktime, CMTJ1850PWMpara Pakpara )
{
if( false == CML_J1850PWM_ConfTime( Paktime ) )
{
return false;
}
CML_J1850PWM_ConfPak( Pakpara );
return true;
}
//------------------------------------------------------------------------------
// Funtion: J1850PWM 读取已设定传输参数
// Input : Paktime - 传输时间详细参数
// Pakpara - 传输详细参数
// Output : none
// Return : none
// Info : none
//------------------------------------------------------------------------------
void CMT_J1850PWM_Readpara( CMTJ1850PWMtime *Paktime, CMTJ1850PWMpara *Pakpara )
{
CML_J1850PWM_ReadPakConf( Pakpara );
CML_J1850PWM_ReadTimeConf( Paktime );
}
//------------------------------------------------------------------------------
// Funtion: J1850PWM 选择一个 ECU 节点作为当前通讯对象节点
// Input : EcuAddr - Ecu 节点地址
// Output : none
// Return : none
// Info : J1850PWM 最初被设定为 点对点通讯 因此每次仅选择一个节点作为通讯对象
//------------------------------------------------------------------------------
void CMT_J1850PWM_ChooseNode( unsigned int EcuAddr )
{
CMTJ1850PWMpara Pakpara;
// 保存通讯时间
CML_J1850PWM_ReadPakConf( &Pakpara );
Pakpara.ECUID = EcuAddr;
CML_J1850PWM_ConfPak( Pakpara );
}
//------------------------------------------------------------------------------
// Funtion: 设置通讯参数到初始化状态
// Input : none
// Output : init - 启动链路参数
// para - 数据包传输参数
// time - 链路时间参数
// Return : none
// Info : 初始化状态:
// para 不需要数据包过滤
// 数据包地址 0x6AF1
// 数据包类型 0x61
// time 帧超时等待 100MS 回复等待超时时间 1S
//------------------------------------------------------------------------------
void CMT_J1850PWM_SetDefault( CMTJ1850PWMpara *para, CMTJ1850PWMtime *time )
{
if( 0 != para )
{
// 设置数据包参数
para->PakType = 0x61; // 包头
para->ECUID = 0; // 不需要数据包过滤,需要过滤时请填写 ECU 地址如:0x6BF1
para->Address = 0x6AF1; // 数据包地址 0x6AF1
}
if( 0 != time )
{
// 设置通信时间参数
time->VehFrametime = 100; //多帧超时等待 100MS
time->Maxwaittime = 1000; //回复等待超时时间 1S
}
}
#endif
//------------------------------------------------------ End Of File ----------- |