Commit af19864e authored by 梁百峰's avatar 梁百峰

🐞 fix:版本号波动问题

parent ffa58caa
......@@ -48,6 +48,7 @@ uint8_t powerstdio = 0;
uint8_t get_num_buf[34];
uint8_t comparestart;
uint8_t blename[5];
uint8_t btmac[6];
uint8_t firstpowerflag = 0;
uint16_t lightnumber = 0;
void get_key(void)
......@@ -62,11 +63,12 @@ void get_key(void)
key_value = key_value | (uint32_t)key_array[3];
}
uint8_t recvflag111 = 0;
uint8_t xierucishu = 0;
void datacheck(void)
{
RS485_send_time = 0;
RS485_TX_finish = 0;
// RS485_send_time = 0;
// RS485_TX_finish = 0;
uint16_t checksum = 0;
uint8_t arraynum = 0;
if(zhenduanflag == 0)
......@@ -121,6 +123,12 @@ void datacheck(void)
break;
case 0x81:
{
btmac[0] = RS485_data[0];
btmac[1] = RS485_data[1];
btmac[2] = RS485_data[2];
btmac[3] = RS485_data[3];
btmac[4] = RS485_data[4];
btmac[5] = RS485_data[5];
blename[0] = RS485_data[6];
blename[1] = RS485_data[7];
blename[2] = RS485_data[8];
......@@ -195,11 +203,13 @@ void datacheck(void)
default:
break;
}
break;
}
default:
break;
}
memset(RS485_data,0,64);
memset(BarCode,0,sizeof(BarCode));
RS485_TX_finish = 0;
}
......@@ -211,7 +221,7 @@ void datacheck(void)
}
else
{
RS485_TX_finish = 0;
// RS485_TX_finish = 0;
}
}
else if(zhenduanflag == 1)
......@@ -277,9 +287,20 @@ void datacheck(void)
case 3:
if(BarCode[2] == 0x4F)
{
if((BarCode[4] == 0x6E) && (BarCode[5] == 0x50) && (BarCode[6] == 0))
{
zhenduansendStep++;
// if(xierucishu > 4)
// {
zhenduansendStep++;
xierucishu = 0;
// }
// else
// {
// xierucishu++;
// }
RS485_TX_finish = 0;
}
if(BarCode[4] == 0x7F && BarCode[5] == 0x2E && BarCode[6] == 0x78 )
......@@ -435,20 +456,21 @@ void UART_Put2(uint32_t Value)
}
else
{
UARTRxBuf.Rx_Buffer [ UARTRxBuf.write_pos ] = Value;
UARTRxBuf.write_pos = (UARTRxBuf.write_pos + 1) % UART_RX_MAX_DEPTH;
// UARTRxBuf.Rx_Buffer [ UARTRxBuf.write_pos ] = Value;
// UARTRxBuf.write_pos = (UARTRxBuf.write_pos + 1) % UART_RX_MAX_DEPTH;
}
RS485_send_time = 0;
// RS485_send_time = 0;
return;
}
void Recv_Byte(void)
{
int i = 0;
int j = 0;
uint32_t len;
readNum = Protocol_UartRead(mDataBufPtr + mDataBufLen, 1024 - mDataBufLen);
int k = 0;
readNum = Protocol_UartRead(mDataBufPtr + mDataBufLen, 1025 - mDataBufLen);
uint8_t testflag = 0;
if ( readNum > 0 )
{
mDataBufLen += readNum;
......@@ -457,9 +479,16 @@ void Recv_Byte(void)
{
for(i = 0; i < mDataBufLen; i++)
{
if(i > 5)
{
if((mDataBufPtr[i] == 0x4A ) && (mDataBufPtr[i - 1] == 0x4B))
// if(i > 5)
// {
if(mDataBufPtr[i - 1] == 0x59 && mDataBufPtr[i] == 0x44)
{
k = i - 1;
}
if((mDataBufPtr[k] == 0x59 && mDataBufPtr[k+1] == 0x44) && (mDataBufPtr[i] == 0x4A ) && (mDataBufPtr[i - 1] == 0x4B))
{
if( i < 1)
{
......@@ -470,20 +499,32 @@ void Recv_Byte(void)
{
BarCode[j] = mDataBufPtr[j];
}
testflag = 0;
break;
}
}
else
{
testflag = 1;
// break;
}
// }
}
if(testflag)
{
testflag = 0;
break;
}
// 解析协议
len = i;
len = i+1;
if ( (len > 0) && (len < mDataBufLen) )
{
// 将未解析的数据移到头部
// Move unparsed data to the head
memcpy(mDataBufLen, mDataBufLen + len, mDataBufLen - len);
memcpy(mDataBufPtr, mDataBufPtr + len, mDataBufLen - len);
// memcpy(nowdata,mDataBufPtr + len,len);
// datacheck();
......
......@@ -37,4 +37,5 @@ extern uint8_t blename[5];
extern uint8_t recvflag111;
extern uint8_t firstpowerflag;
extern uint16_t lightnumber;
extern uint8_t btmac[6];
#endif
\ No newline at end of file
......@@ -673,7 +673,7 @@ void Function_Check_Ctrl(uint32_t cmd)
POWER_CTRL_KL30_Current = 0;
LED4 = 0;
POWER_CTRL_KL30 = 0;
queren = 0 ;
// queren = 0 ;
// ABStime = 0;
break;
}
......@@ -692,7 +692,7 @@ void Function_Check_Ctrl(uint32_t cmd)
}
else
{
queren = 1;
// queren = 1;
ABStime = 0;
}
......@@ -707,7 +707,7 @@ void Function_Check_Ctrl(uint32_t cmd)
POWER_CTRL_KL30_Current = 0;
LED4 = 0;
POWER_CTRL_KL30 = 0;
queren = 0;
// queren = 0;
// ABStime = 0;
break;
}
......
/******************************************************************************
文 件 名:DoCAN_ISO15765.c
功能描述:ISO 15765 规范规定的诊断服务函数库文件
作 者:张暄
版 本:V1.0
日 期:2016.7.18
文 件 名:DoCAN_ISO15765.c
功能描述:ISO 15765 规范规定的诊断服务函数库文件
作 者:张暄
版 本:V1.0
日 期:2016.7.18
******************************************************************************/
#include "DoCAN_ISO15765.h"
......@@ -27,15 +27,15 @@ extern void UDS_N_USData_FF_Indication(uint32_t N_TAtype, uint16_t Length);
extern void UDS_N_USData_Indication(uint32_t N_TAtype, uint8_t *MessageData, uint16_t Length, N_ResultEnum N_Result);
/******************************************************************************
后台服务
后台服务
******************************************************************************/
/******************************************************************************
函数名:DoCAN_Communication_Service
功 能:基于CAN总线的诊断通信服务后台控制函数
参 数:无
返回值:无
函数名:DoCAN_Communication_Service
功 能:基于CAN总线的诊断通信服务后台控制函数
参 数:无
返回值:无
*******************************************************************************
注 意:该服务函数必须被实时调用
注 意:该服务函数必须被实时调用
******************************************************************************/
void DoCAN_Communication_Service(void)
{
......@@ -62,12 +62,12 @@ void DoCAN_Communication_Service(void)
}
/******************************************************************************
函数名:DoCAN_Timer_Update
功 能:更新定时器数值,用于时序控制以及STmin计时
参 数:Interval:定时器两次更新的时间间隔,单位us
返回值:无
函数名:DoCAN_Timer_Update
功 能:更新定时器数值,用于时序控制以及STmin计时
参 数:Interval:定时器两次更新的时间间隔,单位us
返回值:无
*******************************************************************************
注 意:该服务函数必须被嵌入到定时中断中
注 意:该服务函数必须被嵌入到定时中断中
******************************************************************************/
void DoCAN_Timer_Update(uint16_t Interval)
{
......@@ -78,14 +78,14 @@ void DoCAN_Timer_Update(uint16_t Interval)
Services provided by network layer to higher layers
******************************************************************************/
/******************************************************************************
函数名:DoCAN_N_USData_Request
功 能:该服务函数用于请求传输数据
函数名:DoCAN_N_USData_Request
功 能:该服务函数用于请求传输数据
This service is used to request the transfer of data. If necessary, the
network layer segments the data.
参 数:N_TAtype :目标地址类型,发送数据请使用 DIAG_ID_Tx
MessageData :请求传输的数据
Length :数据长度
返回值:无
参 数:N_TAtype :目标地址类型,发送数据请使用 DIAG_ID_Tx
MessageData :请求传输的数据
Length :数据长度
返回值:无
******************************************************************************/
void DoCAN_N_USData_Request(uint32_t N_TAtype, uint8_t MessageData [], uint16_t Length)
{
......@@ -94,20 +94,20 @@ void DoCAN_N_USData_Request(uint32_t N_TAtype, uint8_t MessageData [], uint16_t
uint8_t dlc;
uint8_t data [ 8 ];
/*非空闲状态下不允许发送*/
/*非空闲状态下不允许发送*/
if ( TpCtrl.Process != TP_IDLE )
{
DoCAN_N_USData_Confirm(N_TAtype, N_ERROR);
}
else
{
if ( (Length == 0u) || (Length > N_USDATA_TX_BUFFER_SIZE) ) /*非法的长度*/
if ( (Length == 0u) || (Length > N_USDATA_TX_BUFFER_SIZE) ) /*非法的长度*/
{
DoCAN_N_USData_Confirm(N_TAtype, N_ERROR);
}
else
{
/*将数据缓存到发送Buffer中*/
/*将数据缓存到发送Buffer中*/
N_USDataTxBuffer.N_TAtype = N_TAtype;
N_USDataTxBuffer.Length = Length;
......@@ -116,18 +116,18 @@ void DoCAN_N_USData_Request(uint32_t N_TAtype, uint8_t MessageData [], uint16_t
N_USDataTxBuffer.MsgData [ i ] = MessageData [ i ];
}
/*更新传输层状态*/
/*更新传输层状态*/
TpCtrl.NonStopMode = 0u;
TpCtrl.TotalLen = Length; /*记录字节总数*/
TpCtrl.BSMax = 0xFFu; /*初始化BSMax数值*/
TpCtrl.TotalLen = Length; /*记录字节总数*/
TpCtrl.BSMax = 0xFFu; /*初始化BSMax数值*/
TpCtrl.STmin = 0x7Fu;
/*拆分为N_PDU*/
if ( TpCtrl.TotalLen < 8u ) /*数据总长度小于8,采用单帧发送*/
/*拆分为N_PDU*/
if ( TpCtrl.TotalLen < 8u ) /*数据总长度小于8,采用单帧发送*/
{
TpCtrl.BlockSize = 1u; /*单帧,Block总数为1*/
TpCtrl.Len = TpCtrl.TotalLen; /*单帧发出全部的数据*/
TpCtrl.BlockCnt = 1u; /*记录已发送Block数*/
TpCtrl.BlockSize = 1u; /*单帧,Block总数为1*/
TpCtrl.Len = TpCtrl.TotalLen; /*单帧发出全部的数据*/
TpCtrl.BlockCnt = 1u; /*记录已发送Block数*/
TransportTxData.N_PDU_SF.N_TAtype = N_USDataTxBuffer.N_TAtype;
TransportTxData.N_PDU_SF.N_PCI.Type = SINGLE_FRAME;
......@@ -139,18 +139,18 @@ void DoCAN_N_USData_Request(uint32_t N_TAtype, uint8_t MessageData [], uint16_t
TransportTxData.N_PDU_SF.N_Data [ i ] = N_USDataTxBuffer.MsgData [ i ];
}
}
else /*数据总长度大于等于8,采用多帧发送,首先发送首帧*/
else /*数据总长度大于等于8,采用多帧发送,首先发送首帧*/
{
if ( (Length + 1u) % 7u ) /*计算BlockSize*/
if ( (Length + 1u) % 7u ) /*计算BlockSize*/
{
TpCtrl.BlockSize = (Length + 8u) / 7u; /*等效于(Length + 1) / 7 + 1*/
TpCtrl.BlockSize = (Length + 8u) / 7u; /*等效于(Length + 1) / 7 + 1*/
}
else
{
TpCtrl.BlockSize = (Length + 1u) / 7u;
}
TpCtrl.Len = 6u; /*首帧发出数据长度为6*/
TpCtrl.BlockCnt = 1u; /*记录已发送Block数*/
TpCtrl.Len = 6u; /*首帧发出数据长度为6*/
TpCtrl.BlockCnt = 1u; /*记录已发送Block数*/
TransportTxData.N_PDU_FF.N_TAtype = N_USDataTxBuffer.N_TAtype;
TransportTxData.N_PDU_FF.N_PCI.Type = FIRST_FRAME;
......@@ -171,23 +171,23 @@ void DoCAN_N_USData_Request(uint32_t N_TAtype, uint8_t MessageData [], uint16_t
data [ i ] = TransportTxData.Frame.Data [ i ];
}
/*TpCtrl.TxReq = 1u;*/
DoCAN_Start_Timer(TIMING_PARA_N_As); /*启动N_As计时*/
TpCtrl.Process = TP_TX_INIT; /*数据帧已发出,等待发送完成*/
DoCAN_Start_Timer(TIMING_PARA_N_As); /*启动N_As计时*/
TpCtrl.Process = TP_TX_INIT; /*数据帧已发出,等待发送完成*/
DoCAN_L_Data_Request(id, dlc, data);
}
}
}
/******************************************************************************
函数名:DoCAN_N_USData_Confirm
功 能:该服务函数由网络层发起,用于确认前一次使用N_USData.request服务向
N_TAtype地址发送的数据是否发送完成
函数名:DoCAN_N_USData_Confirm
功 能:该服务函数由网络层发起,用于确认前一次使用N_USData.request服务向
N_TAtype地址发送的数据是否发送完成
The N_USData.confirm service is issued by the network layer. The service
primitive confirms the completion of an N_USData.request service
identified by the address information in N_TAtype.
参 数:N_TAtype :N_USData.confirm服务请求的发送地址
N_Result :N_USData.request服务的传输状态
返回值:无
参 数:N_TAtype :N_USData.confirm服务请求的发送地址
N_Result :N_USData.request服务的传输状态
返回值:无
******************************************************************************/
void DoCAN_N_USData_Confirm(uint32_t N_TAtype, N_ResultEnum N_Result)
{
......@@ -195,16 +195,16 @@ void DoCAN_N_USData_Confirm(uint32_t N_TAtype, N_ResultEnum N_Result)
}
/******************************************************************************
函数名:DoCAN_N_USData_FF_Indication
功 能:该服务函数由网络层发起,用于向上层指示地址为N_TAtype的一组多帧数据的首帧
的到来
函数名:DoCAN_N_USData_FF_Indication
功 能:该服务函数由网络层发起,用于向上层指示地址为N_TAtype的一组多帧数据的首帧
的到来
The N_USData_FF.indication service is issued by the network layer. The
service primitive indicates to the adjacent upper layer the arrival of
a FirstFrame (FF) of a segmented message received from a peer protocol
entity, identified by the address information N_TAtype.
参 数:N_TAtype :新到的多帧数据首帧的地址信息
Length :新到的多帧数据的总长度
返回值:无
参 数:N_TAtype :新到的多帧数据首帧的地址信息
Length :新到的多帧数据的总长度
返回值:无
******************************************************************************/
void DoCAN_N_USData_FF_Indication(uint32_t N_TAtype, uint16_t Length)
{
......@@ -212,19 +212,19 @@ void DoCAN_N_USData_FF_Indication(uint32_t N_TAtype, uint16_t Length)
}
/******************************************************************************
函数名:DoCAN_N_USData_Indication
功 能:该服务函数由网络层发起,用于向上层指出由N_TAtype地址发送来的长度为Length
的MessageData数据的传送结果N_Result,并同时传递这一数据
函数名:DoCAN_N_USData_Indication
功 能:该服务函数由网络层发起,用于向上层指出由N_TAtype地址发送来的长度为Length
的MessageData数据的传送结果N_Result,并同时传递这一数据
The N_USData.indication service is issued by the network layer. The
service primitive indicates <N_Result> events and delivers
<MessageData> with <Length> bytes received from a peer protocol entity
identified by the address information in N_TAtype to the adjacent upper
layer.
参 数:N_TAtype :接收到的数据地址信息
MessageData :接收到的数据 (仅在N_Result为N_OK时有效)
Length :接收到的数据长度 (仅在N_Result为N_OK时有效)
N_Result :数据的接收结果
返回值:无
参 数:N_TAtype :接收到的数据地址信息
MessageData :接收到的数据 (仅在N_Result为N_OK时有效)
Length :接收到的数据长度 (仅在N_Result为N_OK时有效)
N_Result :数据的接收结果
返回值:无
******************************************************************************/
void DoCAN_N_USData_Indication(uint32_t N_TAtype, uint8_t *MessageData, uint16_t Length, N_ResultEnum N_Result)
{
......@@ -232,19 +232,19 @@ void DoCAN_N_USData_Indication(uint32_t N_TAtype, uint8_t *MessageData, uint16_t
}
/******************************************************************************
下层接口函数
下层接口函数
******************************************************************************/
/******************************************************************************
函数名:DoCAN_L_Data_Request
功 能:该服务原语请求向<Identifier>传输特定格式的<Data>数据
函数名:DoCAN_L_Data_Request
功 能:该服务原语请求向<Identifier>传输特定格式的<Data>数据
The service primitive requests transmission of <Data> that shall be
mapped within specific attributes of the data link protocol data unit
selected by means of <Identifier>.
参 数:Identifier :报文ID
dlc :数据长度
Data :数据<Data>于数据链路层的存放地址
返回值:无
参 数:Identifier :报文ID
dlc :数据长度
Data :数据<Data>于数据链路层的存放地址
返回值:无
******************************************************************************/
void DoCAN_L_Data_Request(uint32_t Identifier, uint8_t dlc, uint8_t Data [])
{
......@@ -282,20 +282,20 @@ void DoCAN_L_Data_Request(uint32_t Identifier, uint8_t dlc, uint8_t Data [])
}
/******************************************************************************
函数名:DoCAN_L_Data_Confirm
功 能:该服务原语用于确认具有特定<Identifier>的报文是否发送完成。
<TransferStatus>参数用于传递发送完成与否的状态。
函数名:DoCAN_L_Data_Confirm
功 能:该服务原语用于确认具有特定<Identifier>的报文是否发送完成。
<TransferStatus>参数用于传递发送完成与否的状态。
The service primitive confirms the completion of an L_Data.request
service for a specific <Identifier>.The parameter <TransferStatus>
provides the status of the service request.
参 数:Identifier :报文ID
TransferStatus :Not_Complete - 未完成
Complete - 已发送完成
返回值:无
参 数:Identifier :报文ID
TransferStatus :Not_Complete - 未完成
Complete - 已发送完成
返回值:无
******************************************************************************/
void DoCAN_L_Data_Confirm(uint32_t Identifier, uint8_t TransferStatus)
{
/*如果数据发送成功,收发状态相应改变*/
/*如果数据发送成功,收发状态相应改变*/
if ( LinkTxCtrl.Identifier == Identifier )
{
if ( TransferStatus == DIAG_COMPLETE )
......@@ -303,32 +303,32 @@ void DoCAN_L_Data_Confirm(uint32_t Identifier, uint8_t TransferStatus)
switch ( TpCtrl.Process )
{
case TP_TX_INIT:
if ( TpCtrl.BlockSize == 1u ) /*BlockSize为1,单帧发送成功*/
if ( TpCtrl.BlockSize == 1u ) /*BlockSize为1,单帧发送成功*/
{
TpCtrl.Process = TP_IDLE; /*所有数据发送完毕,回到空闲状态*/
DoCAN_Stop_Timer( ); /*停止计时*/
TpCtrl.Process = TP_IDLE; /*所有数据发送完毕,回到空闲状态*/
DoCAN_Stop_Timer( ); /*停止计时*/
DoCAN_N_USData_Confirm(N_USDataTxBuffer.N_TAtype, N_OK);
}
else /*BlockSize不为1,首帧发送成功*/
else /*BlockSize不为1,首帧发送成功*/
{
DoCAN_Start_Timer(TIMING_PARA_N_Bs); /*启动N_Bs计时*/
TpCtrl.Process = TP_TX_RTS; /*等待接收机许可多帧发送*/
DoCAN_Start_Timer(TIMING_PARA_N_Bs); /*启动N_Bs计时*/
TpCtrl.Process = TP_TX_RTS; /*等待接收机许可多帧发送*/
}
break;
case TP_TX_CTS:
TpCtrl.BlockCnt++;
if ( TpCtrl.BlockCnt == TpCtrl.BlockSize ) /*最后一帧发送完成*/
if ( TpCtrl.BlockCnt == TpCtrl.BlockSize ) /*最后一帧发送完成*/
{
TpCtrl.Process = TP_IDLE; /*所有数据发送完毕,回到空闲状态*/
DoCAN_Stop_Timer( ); /*停止计时*/
TpCtrl.Process = TP_IDLE; /*所有数据发送完毕,回到空闲状态*/
DoCAN_Stop_Timer( ); /*停止计时*/
/* DoCAN_Start_Timer(TIMING_PARA_N_Bs);*/
DoCAN_N_USData_Confirm(N_USDataTxBuffer.N_TAtype, N_OK);
}
else
{
/* DoCAN_Start_Timer ( TIMING_PARA_N_Bs ); //启动/重启N_Bs计时*/
if ( TpCtrl.BSMax ) /*还可以继续发送数据帧,则启动STmin计时*/
/* DoCAN_Start_Timer ( TIMING_PARA_N_Bs ); //启动/重启N_Bs计时*/
if ( TpCtrl.BSMax ) /*还可以继续发送数据帧,则启动STmin计时*/
{
DoCAN_Stop_Timer( );
DoCAN_Start_STmin_Timer(TpCtrl.STmin);
......@@ -341,18 +341,18 @@ void DoCAN_L_Data_Confirm(uint32_t Identifier, uint8_t TransferStatus)
break;
case TP_RX_RTS:
DoCAN_Start_Timer(TIMING_PARA_N_Cr); /*启动N_Cr计时*/
DoCAN_Start_Timer(TIMING_PARA_N_Cr); /*启动N_Cr计时*/
TpCtrl.Process = TP_RX_CTS;
break;
case TP_RX_WAIT:
DoCAN_Start_Timer(TIMING_PARA_N_Cr); /*启动N_Cr计时*/
DoCAN_Start_Timer(TIMING_PARA_N_Cr); /*启动N_Cr计时*/
TpCtrl.Process = TP_RX_CTS;
break;
case TP_RX_OVFL:
TpCtrl.Process = TP_IDLE; /*停止接收过程*/
DoCAN_Stop_Timer( ); /*停止计时*/
TpCtrl.Process = TP_IDLE; /*停止接收过程*/
DoCAN_Stop_Timer( ); /*停止计时*/
DoCAN_N_USData_Indication(N_USDataRxBuffer.N_TAtype, N_USDataRxBuffer.MsgData,
N_USDataRxBuffer.Length, N_ERROR);
break;
......@@ -363,26 +363,26 @@ void DoCAN_L_Data_Confirm(uint32_t Identifier, uint8_t TransferStatus)
}
else
{
/* TpCtrl.TxReq = 1u;*/ /*发送失败,重发*/
/* TpCtrl.TxReq = 1u;*/ /*发送失败,重发*/
}
}
}
/******************************************************************************
函数名:DoCAN_L_Data_Indication
功 能:该服务原语标示一个数据链路层事件到相邻上层并根据<Identifier>传送<Data>
函数名:DoCAN_L_Data_Indication
功 能:该服务原语标示一个数据链路层事件到相邻上层并根据<Identifier>传送<Data>
The service primitive indicates a data link layer event to the adjacent
upper layer and delivers <Data> identified by <Identifier>
参 数:Identifier :报文ID
dlc :数据长度
pData :数据<Data>于数据链路层的存放地址
返回值:无
参 数:Identifier :报文ID
dlc :数据长度
pData :数据<Data>于数据链路层的存放地址
返回值:无
******************************************************************************/
void DoCAN_L_Data_Indication(uint32_t Identifier, uint8_t dlc, uint8_t pData [])
{
uint8_t i;
if ( LinkRxFIFO.Depth >= LINK_RX_FIFO_MAX_DEPTH ) /*FIFO未满时装入报文,否则抛弃报文*/
if ( LinkRxFIFO.Depth >= LINK_RX_FIFO_MAX_DEPTH ) /*FIFO未满时装入报文,否则抛弃报文*/
{
/*#if DOCAN_DEBUG_EN
LINK_RX_FIFO_OVERFLOW_INDICATOR();
......@@ -390,15 +390,15 @@ void DoCAN_L_Data_Indication(uint32_t Identifier, uint8_t dlc, uint8_t pData [])
}
else
{
LinkRxFIFO.LinkData [ LinkRxFIFO.IPtr ].Identifier = Identifier; /*装入报文ID*/
for ( i = 0u; i < dlc; i++ ) /*拷贝报文*/
LinkRxFIFO.LinkData [ LinkRxFIFO.IPtr ].Identifier = Identifier; /*装入报文ID*/
for ( i = 0u; i < dlc; i++ ) /*拷贝报文*/
{
LinkRxFIFO.LinkData [ LinkRxFIFO.IPtr ].Data [ i ] = pData [ i ];
}
LinkRxFIFO.LinkData [ LinkRxFIFO.IPtr ].DLC = dlc; /*保存报文长度*/
LinkRxFIFO.LinkData [ LinkRxFIFO.IPtr ].DLC = dlc; /*保存报文长度*/
LinkRxFIFO.Depth++; /*新报文装入,深度+1*/
LinkRxFIFO.IPtr++; /*输入指针+1*/
LinkRxFIFO.Depth++; /*新报文装入,深度+1*/
LinkRxFIFO.IPtr++; /*输入指针+1*/
if ( LinkRxFIFO.IPtr >= LINK_RX_FIFO_MAX_DEPTH )
{
LinkRxFIFO.IPtr = 0u;
......@@ -407,14 +407,14 @@ void DoCAN_L_Data_Indication(uint32_t Identifier, uint8_t dlc, uint8_t pData [])
}
/******************************************************************************
传输层协议解析
传输层协议解析
******************************************************************************/
/******************************************************************************
函数名:DoCAN_Receive_And_Assemble_N_USData();
功 能:接收N_PDU并重组数据
参 数:无
返回值:无
函数名:DoCAN_Receive_And_Assemble_N_USData();
功 能:接收N_PDU并重组数据
参 数:无
返回值:无
******************************************************************************/
void DoCAN_Receive_And_Assemble_N_USData(void)
{
......@@ -430,12 +430,12 @@ void DoCAN_Receive_And_Assemble_N_USData(void)
case FIRST_FRAME:
DoCAN_Receive_First_Frame_N_Data( );
DoCAN_Transmit_Flow_Control( ); /*首帧发送完毕后必须发送流控帧*/
DoCAN_Transmit_Flow_Control( ); /*首帧发送完毕后必须发送流控帧*/
break;
case CONSECUTIVE_FRAME:
DoCAN_Receive_Consecutive_Frame_N_Data( );
DoCAN_Transmit_Flow_Control( ); /*当接收满一个BlockSize时,需要发送流控帧*/
DoCAN_Transmit_Flow_Control( ); /*当接收满一个BlockSize时,需要发送流控帧*/
break;
case FLOW_CONTROL:
......@@ -451,27 +451,27 @@ void DoCAN_Receive_And_Assemble_N_USData(void)
}
/******************************************************************************
函数名:DoCAN_Get_N_PDU
功 能:从数据链路层获取N_PDU(network protocol data unit)
参 数:无
返回值:无
函数名:DoCAN_Get_N_PDU
功 能:从数据链路层获取N_PDU(network protocol data unit)
参 数:无
返回值:无
******************************************************************************/
void DoCAN_Get_N_PDU(void)
{
uint8_t i;
if ( LinkRxFIFO.Depth ) /*FIFO中有数据*/
if ( LinkRxFIFO.Depth ) /*FIFO中有数据*/
{
TransportRxData.Frame.Identifier = LinkRxFIFO.LinkData [ LinkRxFIFO.OPtr ].Identifier; /*取出ID*/
for ( i = 0u; i < 8u; i++ ) /*拷贝报文*/
TransportRxData.Frame.Identifier = LinkRxFIFO.LinkData [ LinkRxFIFO.OPtr ].Identifier; /*取出ID*/
for ( i = 0u; i < 8u; i++ ) /*拷贝报文*/
{
TransportRxData.Frame.Data [ i ] = LinkRxFIFO.LinkData [ LinkRxFIFO.OPtr ].Data [ i ];
}
TransportRxData.Frame.DLC = LinkRxFIFO.LinkData [ LinkRxFIFO.OPtr ].DLC; /*取出报文长度*/
TransportRxData.Frame.DLC = LinkRxFIFO.LinkData [ LinkRxFIFO.OPtr ].DLC; /*取出报文长度*/
TransportRxData.Frame.New = 1u;
LinkRxFIFO.Depth--; /*报文已取出,深度-1*/
LinkRxFIFO.OPtr++; /*输出指针+1*/
LinkRxFIFO.Depth--; /*报文已取出,深度-1*/
LinkRxFIFO.OPtr++; /*输出指针+1*/
if ( LinkRxFIFO.OPtr >= LINK_RX_FIFO_MAX_DEPTH )
{
LinkRxFIFO.OPtr = 0u;
......@@ -480,16 +480,16 @@ void DoCAN_Get_N_PDU(void)
}
/******************************************************************************
函数名:DoCAN_Receive_Single_Frame_N_Data
功 能:单帧数据接收
参 数:无
返回值:无
函数名:DoCAN_Receive_Single_Frame_N_Data
功 能:单帧数据接收
参 数:无
返回值:无
******************************************************************************/
void DoCAN_Receive_Single_Frame_N_Data(void)
{
uint8_t i;
uint32_t temp;
if ( (TpCtrl.Process & TP_DIR_MASK) == TP_TX ) /*发送中不接收*/
if ( (TpCtrl.Process & TP_DIR_MASK) == TP_TX ) /*发送中不接收*/
{
}
else
......@@ -508,7 +508,7 @@ void DoCAN_Receive_Single_Frame_N_Data(void)
/*---------------------------------------------------------------------------
Tester sends a Single frame with a CAN-DLC shorter and equal to the transport
protocol data length field. ECU must not send a response.
2018.11.28添加长度还要等于8
2018.11.28添加长度还要等于8
---------------------------------------------------------------------------*/
i = TransportRxData.N_PDU_SF.N_PCI.SF_DL;
if ( TransportRxData.N_PDU_SF.DLC <= i )
......@@ -537,7 +537,7 @@ void DoCAN_Receive_Single_Frame_N_Data(void)
N_USDataRxBuffer.MsgData [ i ] = TransportRxData.N_PDU_SF.N_Data [ i ];
}
TpCtrl.Process = TP_IDLE; /*接收完成,回到IDLE状态*/
TpCtrl.Process = TP_IDLE; /*接收完成,回到IDLE状态*/
DoCAN_Stop_Timer( );
DoCAN_N_USData_Indication(N_USDataRxBuffer.N_TAtype, N_USDataRxBuffer.MsgData,
N_USDataRxBuffer.Length, N_OK);
......@@ -548,17 +548,17 @@ void DoCAN_Receive_Single_Frame_N_Data(void)
}
/******************************************************************************
函数名:DoCAN_Receive_First_Frame_N_Data
功 能:接收首帧数据并初始化多帧数据接收
参 数:无
返回值:无
函数名:DoCAN_Receive_First_Frame_N_Data
功 能:接收首帧数据并初始化多帧数据接收
参 数:无
返回值:无
******************************************************************************/
void DoCAN_Receive_First_Frame_N_Data(void)
{
uint8_t i;
uint16_t Len;
if ( (TpCtrl.Process & TP_DIR_MASK) == TP_TX ) /*发送中不接收*/
if ( (TpCtrl.Process & TP_DIR_MASK) == TP_TX ) /*发送中不接收*/
{
}
else
......@@ -575,7 +575,7 @@ void DoCAN_Receive_First_Frame_N_Data(void)
(8.3) A FirstFrame protocol data unit (FF N_PDU), containing the first six
data bytes
---------------------------------------------------------------------------*/
if ( TransportRxData.N_PDU_FF.DLC != 8u ) /*首帧总长(N_PCI + N_Data)应为8*/
if ( TransportRxData.N_PDU_FF.DLC != 8u ) /*首帧总长(N_PCI + N_Data)应为8*/
{
}
else
......@@ -608,23 +608,23 @@ void DoCAN_Receive_First_Frame_N_Data(void)
TpCtrl.NonStopMode = 1u;
#endif
TpCtrl.Len = 6u; /*首帧接收6字节*/
TpCtrl.TotalLen = Len; /*记录字节总数*/
TpCtrl.BlockCnt = 1u; /*首帧接收1个block*/
TpCtrl.BSMax = N_MAX_BS; /*装入最大的BS数*/
TpCtrl.WFTCnt = N_WFTmax; /*装入最大等待次数*/
TpCtrl.Len = 6u; /*首帧接收6字节*/
TpCtrl.TotalLen = Len; /*记录字节总数*/
TpCtrl.BlockCnt = 1u; /*首帧接收1个block*/
TpCtrl.BSMax = N_MAX_BS; /*装入最大的BS数*/
TpCtrl.WFTCnt = N_WFTmax; /*装入最大等待次数*/
/*首帧含6字节数据,连续帧含7字节数据,根据字节数计算Block总数*/
/*首帧含6字节数据,连续帧含7字节数据,根据字节数计算Block总数*/
if ( (TpCtrl.TotalLen + 1u) % 7u )
{
TpCtrl.BlockSize = (TpCtrl.TotalLen + 8u) / 7u; /*等效于(TpCtrl.TotalLen + 1) / 7 + 1*/
TpCtrl.BlockSize = (TpCtrl.TotalLen + 8u) / 7u; /*等效于(TpCtrl.TotalLen + 1) / 7 + 1*/
}
else
{
TpCtrl.BlockSize = (TpCtrl.TotalLen + 1u) / 7u;
}
/*开始接收首帧数据*/
/*开始接收首帧数据*/
N_USDataRxBuffer.N_TAtype = TransportRxData.N_PDU_FF.N_TAtype;
N_USDataRxBuffer.Length = Len;
for ( i = 0u; i < 6u; i++ )
......@@ -632,7 +632,7 @@ void DoCAN_Receive_First_Frame_N_Data(void)
N_USDataRxBuffer.MsgData [ i ] = TransportRxData.N_PDU_FF.N_Data [ i ];
}
DoCAN_Start_Timer(TIMING_PARA_N_Br); /*启动N_Br计时*/
DoCAN_Start_Timer(TIMING_PARA_N_Br); /*启动N_Br计时*/
TpCtrl.Process = TP_RX_INIT;
DoCAN_N_USData_FF_Indication(N_USDataRxBuffer.N_TAtype, N_USDataRxBuffer.Length);
}
......@@ -642,10 +642,10 @@ void DoCAN_Receive_First_Frame_N_Data(void)
}
/******************************************************************************
函数名:DoCAN_Receive_Consecutive_Frame_N_Data
功 能:接收连接帧数据
参 数:无
返回值:无
函数名:DoCAN_Receive_Consecutive_Frame_N_Data
功 能:接收连接帧数据
参 数:无
返回值:无
******************************************************************************/
void DoCAN_Receive_Consecutive_Frame_N_Data(void)
{
......@@ -678,19 +678,19 @@ void DoCAN_Receive_Consecutive_Frame_N_Data(void)
---------------------------------------------------------------------------*/
if ( TransportRxData.N_PDU_CF.N_PCI.SN != ( uint8_t )(TpCtrl.BlockCnt & (0x000Fu)) )
{
TpCtrl.Process = TP_IDLE; /*停止接收过程*/
DoCAN_Stop_Timer( ); /*停止计时*/
TpCtrl.Process = TP_IDLE; /*停止接收过程*/
DoCAN_Stop_Timer( ); /*停止计时*/
DoCAN_N_USData_Indication(N_USDataRxBuffer.N_TAtype, N_USDataRxBuffer.MsgData,
N_USDataRxBuffer.Length, N_WRONG_SN);
}
else
{
TpCtrl.BlockCnt++; /*接收到1个Block*/
TpCtrl.BlockCnt++; /*接收到1个Block*/
TpCtrl.BSMax--;
if ( TpCtrl.BlockCnt < TpCtrl.BlockSize ) /*此次接收不是最后一帧*/
if ( TpCtrl.BlockCnt < TpCtrl.BlockSize ) /*此次接收不是最后一帧*/
{
/*if ( TransportRxData.N_PDU_CF.DLC != 8u )*/ /*此时连续帧总长(N_PCI + N_Data)应为8*/
/*if ( TransportRxData.N_PDU_CF.DLC != 8u )*/ /*此时连续帧总长(N_PCI + N_Data)应为8*/
/*{}
else
{*/
......@@ -699,21 +699,21 @@ void DoCAN_Receive_Consecutive_Frame_N_Data(void)
N_USDataRxBuffer.MsgData [ TpCtrl.Len ] = TransportRxData.N_PDU_CF.N_Data [ i ];
TpCtrl.Len++;
}
DoCAN_Start_Timer(TIMING_PARA_N_Cr); /*重启N_Cr计时*/
DoCAN_Start_Timer(TIMING_PARA_N_Cr); /*重启N_Cr计时*/
/*}*/
}
else /*此次接收是最后一帧*/
else /*此次接收是最后一帧*/
{
/*-------------------------------------------------------------------------
In a segmented request the Tester sends a Consecutive frame with a CAN-DLC
shorter or equal to transport protocol data length field. ECU must not send
a response.
2018.11.28添加长度应该等于8
2018.11.28添加长度应该等于8
-------------------------------------------------------------------------*/
if ( TransportRxData.N_PDU_CF.DLC <= TpCtrl.TotalLen - TpCtrl.Len )
{
}
else if ( TransportRxData.N_PDU_CF.DLC != 8u ) /*此时连续帧总长应不小于剩余数据长度*/
else if ( TransportRxData.N_PDU_CF.DLC != 8u ) /*此时连续帧总长应不小于剩余数据长度*/
{
}
else
......@@ -726,7 +726,7 @@ void DoCAN_Receive_Consecutive_Frame_N_Data(void)
TpCtrl.Len++;
}
TpCtrl.Process = TP_IDLE; /*接收完成,回到IDLE状态*/
TpCtrl.Process = TP_IDLE; /*接收完成,回到IDLE状态*/
DoCAN_Stop_Timer( );
DoCAN_N_USData_Indication(N_USDataRxBuffer.N_TAtype, N_USDataRxBuffer.MsgData,
N_USDataRxBuffer.Length, N_OK);
......@@ -738,10 +738,10 @@ void DoCAN_Receive_Consecutive_Frame_N_Data(void)
}
/******************************************************************************
函数名:DoCAN_Receive_Flow_Control
功 能:接收流控帧数据
参 数:无
返回值:无
函数名:DoCAN_Receive_Flow_Control
功 能:接收流控帧数据
参 数:无
返回值:无
******************************************************************************/
void DoCAN_Receive_Flow_Control(void)
{
......@@ -765,8 +765,8 @@ void DoCAN_Receive_Flow_Control(void)
if ( TransportRxData.N_PDU_FC.N_TAtype != DIAG_ID_Rx_PHY )
{
DoCAN_N_USData_Confirm(N_USDataTxBuffer.N_TAtype, N_ERROR);
DoCAN_Stop_Timer( ); /*停止计时*/
TpCtrl.Process = TP_IDLE; /*中止数据发送,回到空闲状态*/
DoCAN_Stop_Timer( ); /*停止计时*/
TpCtrl.Process = TP_IDLE; /*中止数据发送,回到空闲状态*/
}
else
{
......@@ -778,8 +778,8 @@ void DoCAN_Receive_Flow_Control(void)
if ( TransportRxData.N_PDU_FC.DLC < 3u )
{
DoCAN_N_USData_Confirm(N_USDataTxBuffer.N_TAtype, N_ERROR);
DoCAN_Stop_Timer( ); /*停止计时*/
TpCtrl.Process = TP_IDLE; /*中止数据发送,回到空闲状态*/
DoCAN_Stop_Timer( ); /*停止计时*/
TpCtrl.Process = TP_IDLE; /*中止数据发送,回到空闲状态*/
}
else
{
......@@ -825,7 +825,7 @@ void DoCAN_Receive_Flow_Control(void)
Tester verifies that the time between the Consecutive
Frames is not below STMin time. This is tested for STMin
values 1,10,20,30,40,50 and 60.
2018.11.29添加为了在发连续帧时忽略第二个流控的stmin
2018.11.29添加为了在发连续帧时忽略第二个流控的stmin
-------------------------------------------------------*/
if ( TpCtrl.Process != TP_TX_CTS )
{
......@@ -843,9 +843,9 @@ void DoCAN_Receive_Flow_Control(void)
one response frame. Tester sends two Flow Controls (FC)
instead of one. A response from the ECU is expected.
-------------------------------------------------------*/
TpCtrl.Process = TP_TX_CTS; /*发送机被许可发送*/
TpCtrl.Process = TP_TX_CTS; /*发送机被许可发送*/
DoCAN_Stop_Timer( );
DoCAN_Start_STmin_Timer(TpCtrl.STmin); /*启动STmin计时*/
DoCAN_Start_STmin_Timer(TpCtrl.STmin); /*启动STmin计时*/
break;
case FC_FS_WAIT:
......@@ -862,8 +862,8 @@ void DoCAN_Receive_Flow_Control(void)
send (CTS). Then the tester sends a new request. ECU must
send a response for the last request.
-------------------------------------------------------*/
TpCtrl.Process = TP_TX_WAIT; /*接收机请求发送机等待*/
DoCAN_Start_Timer(TIMING_PARA_N_Bs); /*启动/重启N_Bs计时*/
TpCtrl.Process = TP_TX_WAIT; /*接收机请求发送机等待*/
DoCAN_Start_Timer(TIMING_PARA_N_Bs); /*启动/重启N_Bs计时*/
break;
case FC_FS_OVFL:
......@@ -887,8 +887,8 @@ void DoCAN_Receive_Flow_Control(void)
if ( TpCtrl.Process == TP_TX_RTS )
{
DoCAN_N_USData_Confirm(N_USDataTxBuffer.N_TAtype, N_BUFFER_OVFLW);
DoCAN_Stop_Timer( ); /*停止计时*/
TpCtrl.Process = TP_IDLE; /*中止数据发送,回到空闲状态*/
DoCAN_Stop_Timer( ); /*停止计时*/
TpCtrl.Process = TP_IDLE; /*中止数据发送,回到空闲状态*/
}
break;
......@@ -898,8 +898,8 @@ void DoCAN_Receive_Flow_Control(void)
must not send a response.
-------------------------------------------------------*/
DoCAN_N_USData_Confirm(N_USDataTxBuffer.N_TAtype, N_INVALID_FS);
DoCAN_Stop_Timer( ); /*停止计时*/
TpCtrl.Process = TP_IDLE; /*中止数据发送,回到空闲状态*/
DoCAN_Stop_Timer( ); /*停止计时*/
TpCtrl.Process = TP_IDLE; /*中止数据发送,回到空闲状态*/
break;
}
}
......@@ -908,10 +908,10 @@ void DoCAN_Receive_Flow_Control(void)
}
/******************************************************************************
函数名:DoCAN_Transmit_Flow_Control
功 能:根据当前的接收机状态发送流控帧
参 数:无
返回值:无
函数名:DoCAN_Transmit_Flow_Control
功 能:根据当前的接收机状态发送流控帧
参 数:无
返回值:无
******************************************************************************/
void DoCAN_Transmit_Flow_Control(void)
{
......@@ -957,23 +957,23 @@ void DoCAN_Transmit_Flow_Control(void)
{
data [ i ] = TransportTxData.Frame.Data [ i ];
}
DoCAN_Start_Timer(TIMING_PARA_N_Ar); /*启动N_Ar计时*/
DoCAN_Start_Timer(TIMING_PARA_N_Ar); /*启动N_Ar计时*/
DoCAN_L_Data_Request(id, dlc, data);
}
else if ( TpCtrl.Process == TP_RX_CTS )
{
if ( TpCtrl.BSMax ) /*仍然没有接收满一个BS的N_PDU*/
if ( TpCtrl.BSMax ) /*仍然没有接收满一个BS的N_PDU*/
{
}
else
{
if ( TpCtrl.NonStopMode ) /*如果是连续接收模式(BS本来就是0)*/
if ( TpCtrl.NonStopMode ) /*如果是连续接收模式(BS本来就是0)*/
{
}
else
{
/*
if (0) //如果满足等待条件,则发送等待FC帧
if (0) //如果满足等待条件,则发送等待FC帧
{
if(TpCtrl.WFTCnt == 0)
{
......@@ -988,9 +988,9 @@ void DoCAN_Transmit_Flow_Control(void)
TransportTxData.N_PDU_FC.N_PCI.FS = FC_FS_WAIT;
}*/
TpCtrl.BSMax = N_MAX_BS; /*重新装入最大的BS数*/
TpCtrl.BSMax = N_MAX_BS; /*重新装入最大的BS数*/
TransportTxData.N_PDU_FC.N_PCI.FS = FC_FS_CTS;
TpCtrl.Process = TP_RX_RTS; /*等待RTS发送完成*/
TpCtrl.Process = TP_RX_RTS; /*等待RTS发送完成*/
TransportTxData.N_PDU_FC.N_TAtype = DIAG_ID_Tx;
TransportTxData.N_PDU_FC.N_PCI.Type = FLOW_CONTROL;
......@@ -1009,7 +1009,7 @@ void DoCAN_Transmit_Flow_Control(void)
{
data [ i ] = TransportTxData.Frame.Data [ i ];
}
DoCAN_Start_Timer(TIMING_PARA_N_Ar); /*启动N_Ar计时*/
DoCAN_Start_Timer(TIMING_PARA_N_Ar); /*启动N_Ar计时*/
DoCAN_L_Data_Request(id, dlc, data);
}
}
......@@ -1020,20 +1020,20 @@ void DoCAN_Transmit_Flow_Control(void)
}
/******************************************************************************
函数名:DoCAN_Handle_Unknown_N_PDU
功 能:处理接收到的未知类型的N_PDU
参 数:无
返回值:无
函数名:DoCAN_Handle_Unknown_N_PDU
功 能:处理接收到的未知类型的N_PDU
参 数:无
返回值:无
******************************************************************************/
void DoCAN_Handle_Unknown_N_PDU(void)
{
}
/******************************************************************************
函数名:DoCAN_Disassemble_And_Transmit_N_USData
功 能:将数据拆分为连续帧(CF)并发送出去
参 数:无
返回值:无
函数名:DoCAN_Disassemble_And_Transmit_N_USData
功 能:将数据拆分为连续帧(CF)并发送出去
参 数:无
返回值:无
******************************************************************************/
void DoCAN_Disassemble_And_Transmit_N_USData(void)
{
......@@ -1043,24 +1043,24 @@ void DoCAN_Disassemble_And_Transmit_N_USData(void)
uint8_t data [ 8 ];
uint8_t Len;
if ( TpCtrl.Process != TP_TX_CTS ) /*未被许可时不可以发送连续帧*/
if ( TpCtrl.Process != TP_TX_CTS ) /*未被许可时不可以发送连续帧*/
{
}
else
{
/*仅在STmin计时时间到后发送一次*/
/*仅在STmin计时时间到后发送一次*/
if ( DoCAN_Get_STmin_Timer_Status( ) == STmin_TIME_UP )
{
TransportTxData.N_PDU_CF.N_TAtype = N_USDataTxBuffer.N_TAtype;
TransportTxData.N_PDU_CF.N_PCI.Type = CONSECUTIVE_FRAME;
TransportTxData.N_PDU_CF.N_PCI.SN = ( uint8_t )(TpCtrl.BlockCnt & 0x000Fu);
/*当BSMax减小到0时,链路层数据发送完毕后,将不会再启动STmin计数器(详情见DoCAN_L_Data_Confirm函数)*/
/*因此STmin_TIME_UP状态将不会再出现,从而停止了连续帧的发送*/
/*直到有新的CF帧到来给BSMax赋予新值,或N_Bs计时超时*/
/*当BSMax减小到0时,链路层数据发送完毕后,将不会再启动STmin计数器(详情见DoCAN_L_Data_Confirm函数)*/
/*因此STmin_TIME_UP状态将不会再出现,从而停止了连续帧的发送*/
/*直到有新的CF帧到来给BSMax赋予新值,或N_Bs计时超时*/
TpCtrl.BSMax--;
if ( TpCtrl.BlockCnt < TpCtrl.BlockSize - 1u ) /*将要发送的不是最后一帧*/
if ( TpCtrl.BlockCnt < TpCtrl.BlockSize - 1u ) /*将要发送的不是最后一帧*/
{
TransportTxData.N_PDU_CF.DLC = 8u;
for ( i = 0u; i < 7u; i++ )
......@@ -1076,10 +1076,10 @@ void DoCAN_Disassemble_And_Transmit_N_USData(void)
{
data [ i ] = TransportTxData.Frame.Data [ i ];
}
DoCAN_Start_Timer(TIMING_PARA_N_As); /*启动N_As计时*/
DoCAN_Start_Timer(TIMING_PARA_N_As); /*启动N_As计时*/
DoCAN_L_Data_Request(id, dlc, data);
}
else if ( TpCtrl.BlockCnt == TpCtrl.BlockSize - 1u ) /*将要发送最后一帧*/
else if ( TpCtrl.BlockCnt == TpCtrl.BlockSize - 1u ) /*将要发送最后一帧*/
{
Len = ( uint8_t )(TpCtrl.TotalLen - TpCtrl.Len);
......@@ -1095,14 +1095,14 @@ void DoCAN_Disassemble_And_Transmit_N_USData(void)
{
data [ i ] = TransportTxData.Frame.Data [ i ];
}
DoCAN_Start_Timer(TIMING_PARA_N_As); /*启动N_As计时*/
DoCAN_Start_Timer(TIMING_PARA_N_As); /*启动N_As计时*/
DoCAN_L_Data_Request(id, dlc, data);
/* TpCtrl.TxReq = 1u;*/
}
else /*已发送帧数不可能大于帧总数,除非有错误发生*/
else /*已发送帧数不可能大于帧总数,除非有错误发生*/
{
DoCAN_Stop_Timer( ); /*停止计时*/
TpCtrl.Process = TP_IDLE; /*中止数据发送,回到空闲状态*/
DoCAN_Stop_Timer( ); /*停止计时*/
TpCtrl.Process = TP_IDLE; /*中止数据发送,回到空闲状态*/
DoCAN_N_USData_Confirm(N_USDataTxBuffer.N_TAtype, N_ERROR);
}
}
......@@ -1110,13 +1110,13 @@ void DoCAN_Disassemble_And_Transmit_N_USData(void)
}
/******************************************************************************
传输层时序管理
传输层时序管理
******************************************************************************/
/******************************************************************************
函数名:DoCAN_Update_Timer
功 能:定时器更新函数
参 数:无
返回值:无
函数名:DoCAN_Update_Timer
功 能:定时器更新函数
参 数:无
返回值:无
******************************************************************************/
void DoCAN_Update_Timer(void)
{
......@@ -1124,7 +1124,7 @@ void DoCAN_Update_Timer(void)
uint16_t Dec;
CurrentCnt = TpTimingCtrl.Cnt;
if ( CurrentCnt != TpTimingCtrl.LastCnt ) /*定时器计数值有更新*/
if ( CurrentCnt != TpTimingCtrl.LastCnt ) /*定时器计数值有更新*/
{
if ( CurrentCnt > TpTimingCtrl.LastCnt )
{
......@@ -1175,21 +1175,21 @@ void DoCAN_Update_Timer(void)
}
/******************************************************************************
函数名:DoCAN_Handle_Time_Out
功 能:超时处理
参 数:无
返回值:无
函数名:DoCAN_Handle_Time_Out
功 能:超时处理
参 数:无
返回值:无
******************************************************************************/
void DoCAN_Handle_Time_Out(void)
{
if ( TpTimingCtrl.NTimer == 0u ) /*计时超时*/
if ( TpTimingCtrl.NTimer == 0u ) /*计时超时*/
{
switch ( TpTimingCtrl.Type )
{
case TIMING_PARA_N_As:
if ( TpCtrl.Process != TP_IDLE )
{
TpCtrl.Process = TP_IDLE; /*中止数据收发,回到空闲状态*/
TpCtrl.Process = TP_IDLE; /*中止数据收发,回到空闲状态*/
DoCAN_N_USData_Confirm(N_USDataTxBuffer.N_TAtype, N_TIMEOUT_A);
}
break;
......@@ -1197,7 +1197,7 @@ void DoCAN_Handle_Time_Out(void)
case TIMING_PARA_N_Ar:
if ( TpCtrl.Process != TP_IDLE )
{
TpCtrl.Process = TP_IDLE; /*中止数据收发,回到空闲状态*/
TpCtrl.Process = TP_IDLE; /*中止数据收发,回到空闲状态*/
DoCAN_N_USData_Indication(N_USDataRxBuffer.N_TAtype, N_USDataRxBuffer.MsgData,
N_USDataRxBuffer.Length, N_TIMEOUT_A);
}
......@@ -1206,7 +1206,7 @@ void DoCAN_Handle_Time_Out(void)
case TIMING_PARA_N_Bs:
if ( TpCtrl.Process != TP_IDLE )
{
TpCtrl.Process = TP_IDLE; /*中止数据发送,回到空闲状态*/
TpCtrl.Process = TP_IDLE; /*中止数据发送,回到空闲状态*/
DoCAN_N_USData_Confirm(N_USDataTxBuffer.N_TAtype, N_TIMEOUT_Bs);
}
break;
......@@ -1214,7 +1214,7 @@ void DoCAN_Handle_Time_Out(void)
case TIMING_PARA_N_Br:
if ( TpCtrl.Process != TP_IDLE )
{
TpCtrl.Process = TP_IDLE; /*中止数据收发,回到空闲状态*/
TpCtrl.Process = TP_IDLE; /*中止数据收发,回到空闲状态*/
DoCAN_N_USData_Indication(N_USDataRxBuffer.N_TAtype, N_USDataRxBuffer.MsgData,
N_USDataRxBuffer.Length, N_ERROR);
}
......@@ -1223,7 +1223,7 @@ void DoCAN_Handle_Time_Out(void)
case TIMING_PARA_N_Cs:
if ( TpCtrl.Process != TP_IDLE )
{
TpCtrl.Process = TP_IDLE; /*中止数据收发,回到空闲状态*/
TpCtrl.Process = TP_IDLE; /*中止数据收发,回到空闲状态*/
DoCAN_N_USData_Confirm(N_USDataTxBuffer.N_TAtype, N_ERROR);
}
break;
......@@ -1231,7 +1231,7 @@ void DoCAN_Handle_Time_Out(void)
case TIMING_PARA_N_Cr:
if ( TpCtrl.Process != TP_IDLE )
{
TpCtrl.Process = TP_IDLE; /*中止数据接收,回到空闲状态*/
TpCtrl.Process = TP_IDLE; /*中止数据接收,回到空闲状态*/
DoCAN_N_USData_Indication(N_USDataRxBuffer.N_TAtype, N_USDataRxBuffer.MsgData,
N_USDataRxBuffer.Length, N_TIMEOUT_Cr);
}
......@@ -1241,7 +1241,7 @@ void DoCAN_Handle_Time_Out(void)
break;
}
DoCAN_Stop_Timer( ); /*停止计时*/
DoCAN_Stop_Timer( ); /*停止计时*/
}
}
......@@ -1252,16 +1252,16 @@ void UDS_TP_ArTimeOutHandle(void)
}
/******************************************************************************
函数名:DoCAN_Start_Timer
功 能:启动时序定时器
参 数:TimingParameter :时序参数,可以是下列参数中的一种
函数名:DoCAN_Start_Timer
功 能:启动时序定时器
参 数:TimingParameter :时序参数,可以是下列参数中的一种
TIMING_PARA_N_As
TIMING_PARA_N_Ar
TIMING_PARA_N_Bs
TIMING_PARA_N_Br
TIMING_PARA_N_Cs
TIMING_PARA_N_Cr
返回值:无
返回值:无
******************************************************************************/
void DoCAN_Start_Timer(uint8_t TimingParameter)
{
......@@ -1305,10 +1305,10 @@ void DoCAN_Start_Timer(uint8_t TimingParameter)
}
/******************************************************************************
函数名:DoCAN_Stop_Timer
功 能:停止时序定时器
参 数:无
返回值:无
函数名:DoCAN_Stop_Timer
功 能:停止时序定时器
参 数:无
返回值:无
******************************************************************************/
void DoCAN_Stop_Timer(void)
{
......@@ -1316,39 +1316,39 @@ void DoCAN_Stop_Timer(void)
}
/******************************************************************************
函数名:DoCAN_Start_STmin_Timer
功 能:启动STmin定时器
参 数:STminTime:STmin时间
返回值:无
函数名:DoCAN_Start_STmin_Timer
功 能:启动STmin定时器
参 数:STminTime:STmin时间
返回值:无
******************************************************************************/
void DoCAN_Start_STmin_Timer(uint8_t STminTime)
{
if ( STminTime <= 0x7Fu ) /*0x00 - 0x7F:0ms - 127ms*/
if ( STminTime <= 0x7Fu ) /*0x00 - 0x7F0ms - 127ms*/
{
STminTime++;
TpTimingCtrl.STimer = (( uint32_t )(STminTime) * ( uint32_t )1000);
}
else if ( (STminTime >= 0xF1u) && (STminTime <= 0xF9u) ) /*0xF1 - 0xF9:100us - 900us*/
else if ( (STminTime >= 0xF1u) && (STminTime <= 0xF9u) ) /*0xF1 - 0xF9100us - 900us*/
{
TpTimingCtrl.STimer = ((( uint32_t )STminTime) & ( uint32_t )0x0000000F) * ( uint32_t )100;
}
else /*Reserved :127ms*/
else /*Reserved 127ms*/
{
TpTimingCtrl.STimer = ( uint32_t )128000;
}
TpTimingCtrl.STminStatus = STmin_TIMING; /*STmin开始计时*/
TpTimingCtrl.STminStatus = STmin_TIMING; /*STmin开始计时*/
}
/******************************************************************************
函数名:DoCAN_Get_STmin_Timer_Status
功 能:获取当前STmin定时器的状态
参 数:无
返回值:STmin_TIMER_IDLE:STmin定时器空闲
STmin_TIME_UP :STmin定时时间到
STmin_TIMING :STmin定时器计时中
函数名:DoCAN_Get_STmin_Timer_Status
功 能:获取当前STmin定时器的状态
参 数:无
返回值:STmin_TIMER_IDLE:STmin定时器空闲
STmin_TIME_UP :STmin定时时间到
STmin_TIMING :STmin定时器计时中
******************************************************************************/
uint8_t DoCAN_Get_STmin_Timer_Status(void)
{
......
......@@ -206,10 +206,11 @@ void Key_Operation_SW3(Key_Event_en_t enKeyEvent)
clearOdoFlag = 1;
}
else
{
clearOdoFlag = 0;
}
RS485_TX_finish = 0;
// else
// {
// clearOdoFlag = 0;
// }
queren = 0;
}
}
......
/**
* @file Protocol_CRC16.c
* @brief CRC16计算
* @details CRC16计算
* @author myliu
* @date 2022.05.09
* @version V1.0
* @copyright myiu
*/
#include "Protocol_CRC16.h"
static const Protocol_uint8_t CRC16_TAB_H [ 256 ] = {0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x01u, 0xC0u, 0x80u, 0x41u, 0x00u, 0xC1u, 0x81u, 0x40u};
static const Protocol_uint8_t CRC16_TAB_L [ 256 ] = {0x00u, 0xC0u, 0xC1u, 0x01u, 0xC3u, 0x03u, 0x02u, 0xC2u, 0xC6u, 0x06u, 0x07u, 0xC7u, 0x05u, 0xC5u, 0xC4u, 0x04u, 0xCCu, 0x0Cu, 0x0Du, 0xCDu, 0x0Fu, 0xCFu, 0xCEu, 0x0Eu, 0x0Au, 0xCAu, 0xCBu, 0x0Bu, 0xC9u, 0x09u, 0x08u, 0xC8u, 0xD8u, 0x18u, 0x19u, 0xD9u, 0x1Bu, 0xDBu, 0xDAu, 0x1Au, 0x1Eu, 0xDEu, 0xDFu, 0x1Fu, 0xDDu, 0x1Du, 0x1Cu, 0xDCu, 0x14u, 0xD4u, 0xD5u, 0x15u, 0xD7u, 0x17u, 0x16u, 0xD6u, 0xD2u, 0x12u, 0x13u, 0xD3u, 0x11u, 0xD1u, 0xD0u, 0x10u, 0xF0u, 0x30u, 0x31u, 0xF1u, 0x33u, 0xF3u, 0xF2u, 0x32u, 0x36u, 0xF6u, 0xF7u, 0x37u, 0xF5u, 0x35u, 0x34u, 0xF4u, 0x3Cu, 0xFCu, 0xFDu, 0x3Du, 0xFFu, 0x3Fu, 0x3Eu, 0xFEu, 0xFAu, 0x3Au, 0x3Bu, 0xFBu, 0x39u, 0xF9u, 0xF8u, 0x38u, 0x28u, 0xE8u, 0xE9u, 0x29u, 0xEBu, 0x2Bu, 0x2Au, 0xEAu, 0xEEu, 0x2Eu, 0x2Fu, 0xEFu, 0x2Du, 0xEDu, 0xECu, 0x2Cu, 0xE4u, 0x24u, 0x25u, 0xE5u, 0x27u, 0xE7u, 0xE6u, 0x26u, 0x22u, 0xE2u, 0xE3u, 0x23u, 0xE1u, 0x21u, 0x20u, 0xE0u, 0xA0u, 0x60u, 0x61u, 0xA1u, 0x63u, 0xA3u, 0xA2u, 0x62u, 0x66u, 0xA6u, 0xA7u, 0x67u, 0xA5u, 0x65u, 0x64u, 0xA4u, 0x6Cu, 0xACu, 0xADu, 0x6Du, 0xAFu, 0x6Fu, 0x6Eu, 0xAEu, 0xAAu, 0x6Au, 0x6Bu, 0xABu, 0x69u, 0xA9u, 0xA8u, 0x68u, 0x78u, 0xB8u, 0xB9u, 0x79u, 0xBBu, 0x7Bu, 0x7Au, 0xBAu, 0xBEu, 0x7Eu, 0x7Fu, 0xBFu, 0x7Du, 0xBDu, 0xBCu, 0x7Cu, 0xB4u, 0x74u, 0x75u, 0xB5u, 0x77u, 0xB7u, 0xB6u, 0x76u, 0x72u, 0xB2u, 0xB3u, 0x73u, 0xB1u, 0x71u, 0x70u, 0xB0u, 0x50u, 0x90u, 0x91u, 0x51u, 0x93u, 0x53u, 0x52u, 0x92u, 0x96u, 0x56u, 0x57u, 0x97u, 0x55u, 0x95u, 0x94u, 0x54u, 0x9Cu, 0x5Cu, 0x5Du, 0x9Du, 0x5Fu, 0x9Fu, 0x9Eu, 0x5Eu, 0x5Au, 0x9Au, 0x9Bu, 0x5Bu, 0x99u, 0x59u, 0x58u, 0x98u, 0x88u, 0x48u, 0x49u, 0x89u, 0x4Bu, 0x8Bu, 0x8Au, 0x4Au, 0x4Eu, 0x8Eu, 0x8Fu, 0x4Fu, 0x8Du, 0x4Du, 0x4Cu, 0x8Cu, 0x44u, 0x84u, 0x85u, 0x45u, 0x87u, 0x47u, 0x46u, 0x86u, 0x82u, 0x42u, 0x43u, 0x83u, 0x41u, 0x81u, 0x80u, 0x40u};
/**
* 获取CRC16校验和
*/
/**
* @brief 计算传入数据的CRC16
* @param[in] pData 计算的数据内容
* @param[in] len 计算的数据长度
*
* @return 校验和
*
* @since 1.0.0
*/
Protocol_uint16_t getCheckSum(const Protocol_uint8_t *getCheckSum_pData, int len)
{
Protocol_uint8_t u8_crc_h = 0xFFu;
Protocol_uint8_t u8_crc_l = 0xFFu;
Protocol_uint8_t u8_index = 0u;
Protocol_uint8_t i = 0u;
Protocol_uint16_t re_value;
int length = len;
while ( length-- )
{
u8_index = u8_crc_h ^ (getCheckSum_pData [ i++ ]);
u8_crc_h = u8_crc_l ^ CRC16_TAB_H [ u8_index ];
u8_crc_l = CRC16_TAB_L [ u8_index ];
}
re_value = ( Protocol_uint16_t )u8_crc_h << 8u;
re_value |= u8_crc_l;
return re_value;
}
#ifndef PROTOCOL_CRC16_H
#define PROTOCOL_CRC16_H
//#include "Application.h"
#include "Protocol_Lib.h"
#include <stdio.h>
#include <stdint.h>
Protocol_uint16_t getCheckSum(const Protocol_uint8_t *getCheckSum_pData, int len);
#endif
/**
* @file Protocol_Lib.c
* @brief 串口协议解析
* @details 串口协议解析
* @author myliu
* @date 2022.05.09
* @version V1.0
* @copyright myiu
*/
#include <stdio.h>
#include <string.h>
#include "Protocol_CRC16.h"
#include "debugger.h"
static UARTOpen UARTOpen_Cbk;
static UARTSend UARTSend_Cbk;
static UARTRead UARTRead_Cbk;
static ProcParse ProcParseCbk;
static UARTClose UARTClose_Cbk;
static ProtocolSetData ProtocolSetData_Cbk;
static Protocol_uint8_t *mDataBufPtr = Protocol_NULL;
static Protocol_uint16_t mDataBufLen = 0;
static Protocol_uint32_t DataBufMaxLen = 0;
// #define DEBUG_PRO_DATA 0
/**
* @brief 初始化函数
* @param[in] pMemSpace 分配给协议库的内存空间,用来缓存串口数据
* @param[in] MemLen 分配的内存空间大小
* @param[in] pFunc 回调函数,包括串口打开、发送、读取、关闭,也包括解析后数据回传
* @param[in] ProcParseCbk 此回调函数,返回数据从FrameNo开始到CRC16之前,和ProtocolSetData_Cbk二选一
* @param[in] ProtocolSetData_Cbk 此回调函数,返回数据区分命令字、电源状态等,和ProcParseCbk二选一,详见结构体Protocol_Data_t
*
* @warning 此函数KL30和Wakeup都要调用,否则未分配内存,功能不好使,也有可能造成野指针复位
*
* @since 1.0.0
*/
void Protocol_Init(Protocol_uint8_t *pMemSpace, Protocol_uint32_t MemLen, Protocol_Func_t *pFunc)
{
mDataBufPtr = pMemSpace;
DataBufMaxLen = MemLen;
UARTOpen_Cbk = pFunc->UARTOpen_Cbk;
UARTSend_Cbk = pFunc->UARTSend_Cbk;
UARTRead_Cbk = pFunc->UARTRead_Cbk;
ProcParseCbk = pFunc->ProcParseCbk;
UARTClose_Cbk = pFunc->UARTClose_Cbk;
ProtocolSetData_Cbk = pFunc->ProtocolSetData_Cbk;
if ( UARTOpen_Cbk != Protocol_NULL )
{
UARTOpen_Cbk( );
}
return;
}
/**
* @brief 串口协议服务函数,包括读取数据,解析数据,如在外部读取数据,可不调用此函数
*
* @warning 此函数可自定义周期调用,建议20ms周期调用,最大不可超过协议的最小发送周期
*
* @since 1.0.0
*/
void Protocol_Service(void)
{
int len;
Protocol_uint32_t readNum = 0;
if ( UARTRead_Cbk != Protocol_NULL )
{
readNum = UARTRead_Cbk(mDataBufPtr + mDataBufLen, 256 - mDataBufLen);
if ( readNum > 0 )
{
mDataBufLen += readNum;
// 解析协议
len = Protocol_Parse(mDataBufPtr, mDataBufLen);
if ( (len > 0) && (len < mDataBufLen) )
{
// 将未解析的数据移到头部
// Move unparsed data to the head
memcpy(mDataBufPtr, mDataBufPtr + len, mDataBufLen - len);
}
mDataBufLen -= len;
}
}
}
/**
* @brief 协议解析函数,如外部获取数据(例如中断),可直接调用此函数解析数据
* @param[in] pData 协议数据内容
* @param[in] len 需要处理的协议数据长度
*
* @return 剩余已处理的数据长度
*
* @since 1.0.0
*/
Protocol_uint32_t Protocol_Parse(const Protocol_uint8_t *pData, Protocol_uint32_t len)
{
Protocol_uint32_t remainLen = len; // 剩余数据长度 Remaining data length
Protocol_uint32_t dataLen; // 数据包长度 Packet length
Protocol_uint32_t frameLen; // 帧长度 Frame length
Protocol_uint8_t frameSum; // 校验和 Checksum
Protocol_uint8_t calcSum = 0; // 计算得到的校验和 Calculated Checksum
Protocol_Data_t ProcData;
int i = 0;
int dataBuf [ 256 ];
/**
* 以下部分根据协议格式进行相应的修改,解析出每一帧的数据
*/
while ( remainLen >= DATA_PACKAGE_MIN_LEN )
{
// 找到一帧数据的数据头
// Find the data header of a frame of data
while ( (remainLen >= 2) && ((pData [ 0 ] != CMD_HEAD1) || (pData [ 1 ] != CMD_HEAD2)) )
{
pData++;
remainLen--;
continue;
}
if ( remainLen < DATA_PACKAGE_MIN_LEN )
{
#ifdef DEBUG_PRO_DATA
d_printf("too short!!!!!!\n");
#endif
break;
}
// 获取数据长度
dataLen = pData [ 3 ];
// 计算帧总长度 (起始字节2 + ID1 + Len1 + 数据内容dataLen + 校验和1 + 结束字节2)
frameLen = 2 + 1 + 1 + dataLen + 1 + 2;
if ( frameLen > remainLen )
{
// 数据内容不全
#ifdef DEBUG_PRO_DATA
d_printf("Incomplete data packet!!!!!!\n");
#endif
break;
}
// 检查结束字节
if ( (pData [ frameLen - 2 ] != CMD_END1) || (pData [ frameLen - 1 ] != CMD_END2) )
{
#ifdef DEBUG_PRO_DATA
d_printf("End bytes error!!!!!!\n");
#endif
pData++;
remainLen--;
continue;
}
// 打印一帧数据,需要时在CommDef.h文件中打开DEBUG_PRO_DATA宏
#ifdef DEBUG_PRO_DATA
for ( i = 0; i < frameLen; ++i )
{
d_printf("%x ", pData [ i ]);
}
d_printf("\n");
#endif
// 计算和校验 (ID + Len + 数据内容)
calcSum = 0;
for ( i = 2; i < frameLen - 3; i++ )
{
calcSum += pData [ i ];
}
// 获取接收到的校验和
frameSum = pData [ frameLen - 3 ];
if ( calcSum == frameSum )
{
// 解析一帧数据
if ( ProcParseCbk != Protocol_NULL )
{
// 传递从ID开始到校验和之前的数据
ProcParseCbk(pData + 2, dataLen + 2);
}
if ( ProtocolSetData_Cbk != Protocol_NULL )
{
// 填充协议数据结构
ProcData.ID = pData [ 2 ];
ProcData.DataLen = dataLen;
// 复制数据内容
memcpy(ProcData.Data, pData + 4, dataLen);
// 回调处理
ProtocolSetData_Cbk(&ProcData);
}
}
else
{
#ifdef DEBUG_PRO_DATA
d_printf("CheckSum error: calc = %x, recv = %x!!!!!!\n", calcSum, frameSum);
#endif
}
pData += frameLen;
remainLen -= frameLen;
}
return len - remainLen;
}
/**
* 根据协议格式进行拼接
*/
/**
* @brief 串口协议数据拼接,如初始化发送函数,调用此函数后,数据已通过串口发送
* @param[in] cmdID 命令字
* @param[in] pData 协议数据内容(不包括协议头、长度、帧序号、命令字、校验和,从数据域算起)
* @param[in] len 数据域长度
*
* @return 已发送的数据长度
*
* @since 1.0.0
*/
Protocol_uint32_t Protocol_Send(const Protocol_uint16_t cmdID, const Protocol_uint8_t *pData, Protocol_uint8_t len)
{
int i;
Protocol_uint8_t checksum = 0;
Protocol_uint8_t dataBuf [ 256 ];
Protocol_uint32_t frameLen;
if ( len + DATA_PACKAGE_MIN_LEN > 256 )
{
// printf("sendProtocol data is too len !!!\n");
return 0;
}
dataBuf [ 0 ] = CMD_HEAD1;
dataBuf [ 1 ] = CMD_HEAD2; // 同步帧头 Sync frame header
dataBuf [ 2 ] = ( Protocol_uint8_t )cmdID; // 报文ID
dataBuf [ 3 ] = len; // 数据长度
frameLen = 4;
// 数据内容 Data
for ( i = 0; i < len; ++i )
{
dataBuf [ frameLen ] = pData [ i ];
frameLen++;
}
// 计算校验和 (ID + Len + 数据内容)
checksum = 0;
for ( i = 2; i < frameLen; i++ )
{
checksum += dataBuf [ i ];
}
// 添加校验和
dataBuf [ frameLen ] = checksum;
frameLen++;
// 添加结束字节
dataBuf [ frameLen ] = CMD_END1;
frameLen++;
dataBuf [ frameLen ] = CMD_END2;
frameLen++;
if ( UARTSend_Cbk != Protocol_NULL )
{
return UARTSend_Cbk(dataBuf, frameLen);
}
else
{
return 0;
}
}
#ifndef PROTOCOL_LIB_H
#define PROTOCOL_LIB_H
/*
Platform_32Bit
Platform_16Bit
*/
#ifdef Platform_16Bit
#define Protocol_uint8_t unsigned char
#define Protocol_uint16_t unsigned int
#define Protocol_uint32_t unsigned long
#else
#define Protocol_uint8_t unsigned char
#define Protocol_uint16_t unsigned short
#define Protocol_uint32_t unsigned int
#define Protocol_uint64_t unsigned long long
#endif
#ifndef Protocol_NULL
#define Protocol_NULL ( void * )0u
#endif /* NULL */
/**<0x59 0x44 ID Len DATA0-DATAN SUM 0x4B 0x4A*/
#define DATA_PACKAGE_MIN_LEN 7 /**< 0x59 0x44 + ID + Len + 至少一个数据字节 + SUM + 0x4B 0x4A */
#define DATA_PACKAGE_FIXED_LEN 6 /**< 未计算在长度内的数据 0x59 0x44 + ID + Len + SUM + 0x4B 0x4A */
#define CMD_HEAD1 0x59
#define CMD_HEAD2 0x44
#define CMD_END1 0x4B
#define CMD_END2 0x4A
/**@struct Protocol_Data_t
* @brief 解析后的协议数据
*/
typedef struct
{
Protocol_uint8_t ID; /**< 报文ID */
Protocol_uint8_t DataLen; /**< 有效数据长度 DATA0-DATAN*/
Protocol_uint8_t Data [ 256 ]; /**< 有效数据内容 DATA0-DATAN*/
} Protocol_Data_t;
typedef Protocol_uint8_t (*UARTOpen)(void);
typedef Protocol_uint32_t (*UARTSend)(const Protocol_uint8_t *pData, Protocol_uint32_t u32Len);
typedef Protocol_uint32_t (*UARTRead)(Protocol_uint8_t *pData, Protocol_uint32_t u32Len);
typedef void (*ProtocolSetData)(const Protocol_Data_t *pData);
typedef void (*ProcParse)(const Protocol_uint8_t *pData, Protocol_uint32_t u32Len);
typedef void (*UARTClose)(void);
/**@struct Protocol_Func_t
* @brief 协议解析回调函数
*/
typedef struct
{
UARTOpen UARTOpen_Cbk; /**< 串口打开回调 */
UARTSend UARTSend_Cbk; /**< 串口发送回调 */
UARTRead UARTRead_Cbk; /**< 串口读取回调 */
UARTClose UARTClose_Cbk; /**< 串口关闭回调 */
ProcParse ProcParseCbk; /**< 解析后的数据, 不包含协议头尾和校验,和ProtocolSetData_Cbk二选一 */
ProtocolSetData ProtocolSetData_Cbk; /**< 不包含 0x59 0x44 + ID + Len + SUM + 0x4B 0x4A,和ProcParse二选一 */
} Protocol_Func_t;
void Protocol_Init(Protocol_uint8_t *pMemSpace, Protocol_uint32_t MemLen, Protocol_Func_t *pFunc);
void Protocol_Service(void);
Protocol_uint32_t Protocol_Parse(const Protocol_uint8_t *pData, Protocol_uint32_t len);
Protocol_uint32_t Protocol_Send(const Protocol_uint16_t cmdID, const Protocol_uint8_t *pData, Protocol_uint8_t len);
#endif
#include "Protocol_User.h"
#include "RTE_GPIO.h"
#include "api_RS485.h"
#include "Barcode_Scanner.h"
#include "Protocol_Lib.h" // 添加Protocol_Data_t定义
#include <string.h> // 添加memcpy等函数声明
#define UART_TX_MAX_DEPTH 1024UL //(2 * 1024UL) // 4K
#define UART_RX_MAX_DEPTH (2 * 1024UL) // 4K
#define UART_DATA_BUF_LEN (2 * 1024UL) // 4K
uint32_t u32ActiveCount = 0;
uint32_t u32ActiveReset = 0;
typedef struct __attribute__((aligned(4)))
{
Protocol_uint32_t read_pos;
Protocol_uint32_t write_pos;
Protocol_uint8_t Rx_Buffer [ UART_RX_MAX_DEPTH ];
} UARTRxBuf_t;
typedef struct __attribute__((aligned(4)))
{
Protocol_uint32_t read_pos;
Protocol_uint32_t write_pos;
Protocol_uint8_t Tx_Buffer [ UART_TX_MAX_DEPTH ];
} UARTTxBuf_t;
static UARTRxBuf_t UARTRxBuf;
static UARTTxBuf_t UARTTxBuf;
static Protocol_uint8_t UsartDataBuf [ 256 ];
static Protocol_uint8_t mDataBufPtr [ UART_DATA_BUF_LEN ];
static Protocol_uint8_t Protocol_OpenUart(void);
static Protocol_uint32_t Protocol_UartRead(Protocol_uint8_t *UartRea_pData, Protocol_uint32_t len);
static Protocol_uint32_t Protocol_UartSend(const Protocol_uint8_t *UartSend_pData, Protocol_uint32_t u32Len);
static void Protocol_UartHandle(const Protocol_Data_t *UartHandle_pData);
void Protocol_KL30_Wakeup_Init(void)
{
Protocol_Func_t pFunc;
pFunc.UARTOpen_Cbk = Protocol_OpenUart;
pFunc.UARTSend_Cbk = Protocol_UartSend;
pFunc.UARTRead_Cbk = Protocol_UartRead;
pFunc.UARTClose_Cbk = Protocol_NULL;
pFunc.ProcParseCbk = Protocol_NULL;
pFunc.ProtocolSetData_Cbk = Protocol_UartHandle;
UARTTxBuf.read_pos = 0;
UARTTxBuf.write_pos = 0;
UARTRxBuf.read_pos = 0;
UARTRxBuf.write_pos = 0;
Protocol_Init(mDataBufPtr, UART_DATA_BUF_LEN, &pFunc);
}
void Protocol_Send_Service(void)
{
Protocol_uint32_t i = 0u;
Protocol_uint32_t DataLen = 0u;
Protocol_uint32_t SendLen = 0u;
if ( UARTTxBuf.write_pos == UARTTxBuf.read_pos )
{
return;
}
if ( UARTTxBuf.write_pos > UARTTxBuf.read_pos )
{
DataLen = UARTTxBuf.write_pos - UARTTxBuf.read_pos;
}
else
{
DataLen = UART_TX_MAX_DEPTH - (UARTTxBuf.read_pos - UARTTxBuf.write_pos);
}
if ( DataLen > 255 )
{
SendLen = 255;
}
else
{
SendLen = DataLen;
}
for ( i = 0u; i < SendLen; i++ )
{
UsartDataBuf [ i ] = UARTTxBuf.Tx_Buffer [ UARTTxBuf.read_pos ];
UARTTxBuf.read_pos = (UARTTxBuf.read_pos + 1) % UART_TX_MAX_DEPTH;
}
Uart0_IntSend(UsartDataBuf, SendLen);
}
static Protocol_uint8_t Protocol_OpenUart(void)
{
#if 0
UART_Channel_Config_st_t loc_config;
loc_config.u32UARTChEn = 1;
loc_config.u32UARTbps = 115200;
loc_config.pfnUARTConfirmCallBack = Protocol_NULL;
loc_config.pfnUARTReadMsgCallBack = UART_Put;
UART_Init(UART_RLIN31, &loc_config);
#endif
return 1;
}
static Protocol_uint32_t Protocol_UartRead(Protocol_uint8_t *UartRea_pData, Protocol_uint32_t len)
{
Protocol_uint32_t i = 0;
Protocol_uint32_t DataLen = 0u;
Protocol_uint32_t ReadLen = 0u;
if ( UARTRxBuf.write_pos == UARTRxBuf.read_pos )
{
return 0; //队列空
}
if ( UARTRxBuf.write_pos > UARTRxBuf.read_pos )
{
DataLen = UARTRxBuf.write_pos - UARTRxBuf.read_pos;
}
else
{
DataLen = UART_RX_MAX_DEPTH - (UARTRxBuf.read_pos - UARTRxBuf.write_pos);
}
if ( len > DataLen )
{
ReadLen = DataLen;
}
else
{
ReadLen = len;
}
for ( i = 0u; i < ReadLen; i++ )
{
UartRea_pData [ i ] = UARTRxBuf.Rx_Buffer [ UARTRxBuf.read_pos ];
UARTRxBuf.read_pos = (UARTRxBuf.read_pos + 1) % UART_RX_MAX_DEPTH;
}
return ReadLen;
}
static Protocol_uint32_t Protocol_UartSend(const Protocol_uint8_t *UartSend_pData, Protocol_uint32_t u32Len)
{
Protocol_uint8_t dataBuf[256];
Protocol_uint32_t frameLen = 0;
// 构建协议帧(适配Protocol_Lib格式)
dataBuf[frameLen++] = CMD_HEAD1; // 帧头
dataBuf[frameLen++] = CMD_HEAD2;
dataBuf[frameLen++] = u32Len + 4; // 总长度(数据+4字节固定)
dataBuf[frameLen++] = 0; // 帧序号
dataBuf[frameLen++] = BARCODE_CMD_ID; // 条码指令ID
// 拷贝有效数据
if(u32Len > 0 && UartSend_pData != Protocol_NULL) {
memcpy(&dataBuf[frameLen], UartSend_pData, u32Len);
frameLen += u32Len;
}
// 计算CRC16校验和
Protocol_uint16_t checksum = getCheckSum(dataBuf + 2, frameLen - 2);
dataBuf[frameLen++] = (checksum >> 8) & 0xFF;
dataBuf[frameLen++] = checksum & 0xFF;
// 写入发送缓冲区
Protocol_uint32_t RemainLen = 0u;
if ( UARTTxBuf.write_pos >= UARTTxBuf.read_pos ) {
RemainLen = UART_TX_MAX_DEPTH - (UARTTxBuf.write_pos - UARTTxBuf.read_pos);
} else {
RemainLen = UARTTxBuf.read_pos - UARTTxBuf.write_pos;
}
if ( frameLen > RemainLen ) {
return 1; // 队列已满
}
for (Protocol_uint32_t i = 0; i < frameLen; i++ ) {
UARTTxBuf.Tx_Buffer [ UARTTxBuf.write_pos ] = dataBuf[i];
UARTTxBuf.write_pos = (UARTTxBuf.write_pos + 1) % UART_TX_MAX_DEPTH;
}
return 0;
}
static void Protocol_UartHandle(const Protocol_Data_t *UartHandle_pData)
{
uint8_t ID04[1] = {0};
u32ActiveCount = 0;
if ( UartHandle_pData->CmdID == ESP32_MCU_0x10 )
{
BlueTooth.BlueTooth_St = UartHandle_pData->Data[0];
if (BlueTooth.BlueTooth_St == BLUE_STATE_ON)
{
Protocol_Send(MCU_ESP32_0x20, Protocol_NULL, 0);
}
}
else if ( UartHandle_pData->CmdID == ESP32_MCU_0x12 )
{
BlueTooth.BLE_St = UartHandle_pData->Data[0];
}
else if ( UartHandle_pData->CmdID == ESP32_MCU_0x05 )
{
BlueTooth.ESP32_SWV = UartHandle_pData->Data[0];
}
else if ( UartHandle_pData->CmdID == ESP32_MCU_0x02 )
{
BlueTooth.ESP32_Reset = UartHandle_pData->Data[0];
if (BlueTooth.ESP32_Reset == 1)
{
ID04[0] = 1;
Protocol_Send(MCU_ESP32_0x04, ID04, 1);
}
else if(BlueTooth.ESP32_Reset == 2)
{
__NVIC_SystemReset();
}
else
{
;
}
}
else if(UartHandle_pData->CmdID == ESP32_MCU_0x01 )
{
if (UartHandle_pData->Data[0] == 0x33)
{
BlueTooth.Navigation_St = EM_ESP32_NAVI_ST_NAVIGATING;
}
else if (UartHandle_pData->Data[0] == 0x35)
{
BlueTooth.Navigation_St = EM_ESP32_NAVI_ST_STANDBY;
}
else
{
;
}
BlueTooth.Navigation_Code = UartHandle_pData->Data[1];
BlueTooth.Navigation_Mileage = ((UartHandle_pData->Data[5] << 24) | (UartHandle_pData->Data[4] << 16) |
(UartHandle_pData->Data[3] << 8) | UartHandle_pData->Data[2]);
}
else if ( UartHandle_pData->CmdID == BARCODE_CMD_ID )
{
// 处理条码数据
memcpy(BarCode, UartHandle_pData->Data, UartHandle_pData->DataLen);
BarCode[UartHandle_pData->DataLen] = '\0'; // 添加字符串结束符
}
else
{
//非本协议数据,不处理
}
}
void Protocol_ESP32_Active_Service(void)
{
if (RTE_GPIO_Get_Level(L_BIASBITSW_POW) == 1)
{
if (u32ActiveCount >= 200)
{
u32ActiveReset = 0;
RTE_GPIO_Set_Level(L_BIASBITSW_POW, RTE_GPIO_LEVEL_LOW);
}
else
{
u32ActiveCount++;
}
}
else
{
if(u32ActiveReset <= 2)
{
u32ActiveReset++;
}
else
{
u32ActiveReset = 0;
u32ActiveCount = 0;
RTE_GPIO_Set_Level(L_BIASBITSW_POW, RTE_GPIO_LEVEL_HIGH);
}
}
}
void UART_Put(Protocol_uint16_t Data)
{
Protocol_uint32_t nextPos = 0u;
nextPos = (UARTRxBuf.write_pos + 1) % UART_RX_MAX_DEPTH;
if ( nextPos == UARTRxBuf.read_pos )
{
//队列已满,无法插入队列
}
else
{
UARTRxBuf.Rx_Buffer [ UARTRxBuf.write_pos ] = (Protocol_uint8_t)Data;
UARTRxBuf.write_pos = (UARTRxBuf.write_pos + 1) % UART_RX_MAX_DEPTH;
}
//return;
}
#ifndef PROTOCOL_USER_H
#define PROTOCOL_USER_H
//#include "Application.h"
#include "Protocol_Lib.h"
#include <stdio.h>
#include <stdint.h>
void Protocol_KL30_Wakeup_Init(void);
void Protocol_Send_Service(void); // 10ms任务调用
void UART_Put(Protocol_uint16_t Data);
void Protocol_ESP32_Active_Service(void);
#endif
......@@ -52,6 +52,7 @@ void Sys_Run_Mode_Pseudo_Real_Time_Tasks(void)
TFT_LCD_Display_Update_Service( );
Fre_In_Service(FRE_VEHICLE);
MENU_CHECK_STEP = 11;
//Fre_In_Service(FRE_ENGINE);
}
/*============================================================================*/
......@@ -258,14 +259,45 @@ void Sys_Run_Mode_10ms_Tasks_Group(void)
{
MENU_CHECK_STEP = 3;
backsend();
RS485_User_Tx_Data();
// RS485_TX_finish = 0;
// backsend();
if(RS485_TX_finish == 0)
{
LINE_OUT_NEG_09 = 1;
if(1 == LINE_OUT_NEG_09)
{
RS485_User_Tx_Data();
}
}
else
{
LINE_OUT_NEG_09 = 0;
if (LINE_OUT_NEG_09 == 0)
{
Recv_Byte();
}
}
if(clearodotime < 3000)
{
clearodotime++;
}
else
{
clearodotime = 0;
}
if(clearodotime >= 1500)
{
// Port_SetPortPinLevel(2,9,PortGpioHigh);
queren = 1;
}
else
{
queren = 0;
}
}
}
......@@ -572,7 +604,7 @@ void Sys_Exact_50us_Tasks(void)
/*==============================================================================
��ȷ��100ms��ʱ���� ��ֹ�����޸��б��е�����
------------------------------------------------------------------------------*/
uint32_t clearodotime = 0;
uint32_t clearodotimeflash = 0;
void Sys_Exact_100ms_Tasks(void)
{
if(connectbleFlag == 1)
......@@ -610,10 +642,10 @@ void Sys_Exact_100ms_Tasks(void)
startIGONtime = 0;
}
}
if (clearodotime < 0xFFFFFFFF)
if (clearodotimeflash < 0xFFFFFFFF)
{
clearodotime++;
if (clearodotime % 20 == 0)
clearodotimeflash++;
if (clearodotimeflash % 20 == 0)
{
if (R485_0x80_msg[11] < 5)
{
......@@ -630,7 +662,7 @@ void Sys_Exact_100ms_Tasks(void)
}
else
{
clearodotime = 0;
clearodotimeflash = 0;
}
}
/*============================================================================*/
......
......@@ -499,9 +499,18 @@ void RS485_User_Tx_Data(void)
#endif
}
uint8_t backtime = 0;
void backsend(void)
{
if(RS485_send_time>=50)
if(clearOdoFlag == 0)
{
backtime = 20;
}
else
{
backtime = 10;
}
if(RS485_send_time>=backtime)
{
RS485_send_time = 0;
RS485_TX_finish = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment