int tcp_client_read_data_timeout=0;
uint8_t tcp_client_read_data_switch=0;
uint8_t tcp_client_read_data[1460];
uint16_t tcp_client_read_data_len=0;
/**
* @brief 设备接收数据(高速处理模式,可以处理分包和粘包)
* @param None
* @retval None
* @warning None
* @example
**/
void tcp_client_data_while(void)
{
int len=0,i=0,sum=0;
uint32_t CAN_IDE=0;
if(tcp_client_read_data_switch==0)
{
len = rbCanRead(&rb_t_net_read);//获取模组返回的TCP数据
if(len>0)
{
memset(tcp_client_read_data,0,sizeof(tcp_client_read_data));
rbRead(&rb_t_net_read, &tcp_client_read_data[0], 1);
if(tcp_client_read_data[0]==0x55)
{
tcp_client_read_data_switch=1;
tcp_client_read_data_timeout=0;
}
}
}
else if(tcp_client_read_data_switch==1)
{
len = rbCanRead(&rb_t_net_read);//获取模组返回的TCP数据
if(len>0)
{
rbRead(&rb_t_net_read, &tcp_client_read_data[1], 1);
if(tcp_client_read_data[1]==0xAA)
{
tcp_client_read_data_switch=2;
}
else
{
if(tcp_client_read_data[1]==0x55)
{
tcp_client_read_data_switch=1;
}
else
{
tcp_client_read_data_switch=0;
}
}
tcp_client_read_data_timeout=0;
}
else
{
if(tcp_client_read_data_timeout>=5000)
{
tcp_client_read_data_timeout=0;
tcp_client_read_data_switch=0;
}
}
}
else if(tcp_client_read_data_switch==2)
{
len = rbCanRead(&rb_t_net_read);//获取模组返回的TCP数据
if(len>1)
{
rbRead(&rb_t_net_read, &tcp_client_read_data[2], 2);
tcp_client_read_data_len = tcp_client_read_data[2];
tcp_client_read_data_len = tcp_client_read_data_len<<8;
tcp_client_read_data_len = tcp_client_read_data_len+tcp_client_read_data[3];
tcp_client_read_data_switch=3;
tcp_client_read_data_timeout=0;
}
else
{
if(tcp_client_read_data_timeout>=5000)
{
tcp_client_read_data_timeout=0;
tcp_client_read_data_switch=0;
}
}
}
else if(tcp_client_read_data_switch==3)
{
len = rbCanRead(&rb_t_net_read);//获取模组返回的TCP数据
if(len>=tcp_client_read_data_len)
{
rbRead(&rb_t_net_read, &tcp_client_read_data[4], tcp_client_read_data_len);
sum=0;
for(i=0;i<(tcp_client_read_data_len+3);i++)
{
sum = sum+tcp_client_read_data[i];
}
sum = sum%256;
if(sum == tcp_client_read_data[tcp_client_read_data_len+3])
{
memset(tcp_client_buff,0,sizeof(tcp_client_buff));
memcpy(tcp_client_buff, &tcp_client_read_data[4], tcp_client_read_data_len-1);
debug_printf("\r\ncan data:");
for(i=0;i<len;i++)
{
debug_printf("%02x,",tcp_client_buff[i]);
}
debug_printf("\r\n");
CAN_IDE = tcp_client_buff[1]; CAN_IDE = CAN_IDE<<8;
CAN_IDE = CAN_IDE + tcp_client_buff[2]; CAN_IDE = CAN_IDE<<8;
CAN_IDE = CAN_IDE + tcp_client_buff[3]; CAN_IDE = CAN_IDE<<8;
CAN_IDE = CAN_IDE + tcp_client_buff[4];//ID
if(CAN_IDE>0x7FF)//扩展帧
{
CanTxMsgValue.IDE = CAN_ID_EXT;
CanTxMsgValue.ExtId = CAN_IDE;
debug_printf("CAN_ID_EXT\r\n");
}
else//标准帧
{
CanTxMsgValue.IDE = CAN_ID_STD;
CanTxMsgValue.StdId = CAN_IDE;
debug_printf("CAN_ID_STD\r\n");
}
CanTxMsgValue.RTR=CAN_RTR_DATA;
if((tcp_client_buff[0]&0x10) == 0x10)//遥控帧
{
CanTxMsgValue.RTR = CAN_RTR_REMOTE;
debug_printf("CAN_RTR_REMOTE\r\n");
}
CanTxMsgValue.DLC = 8;
memcpy(CanTxMsgValue.Data, &tcp_client_buff[5], 8);//拷贝数据
if((tcp_client_buff[0]&0x01) == 0x01)//发送给CAN1口
{
debug_printf("CAN_SendData(CAN1, &CanTxMsgValue)\r\n");
CAN_SendData(CAN1, &CanTxMsgValue);//发送CAN数据
}
else if((tcp_client_buff[0]&0x02) == 0x02)//发送给CAN2口
{
debug_printf("CAN_SendData(CAN2, &CanTxMsgValue)\r\n");
CAN_SendData(CAN2, &CanTxMsgValue);//发送CAN数据
}
tcp_client_read_data_switch=0;
}
else
{
tcp_client_read_data_switch=0;
}
}
else
{
if(tcp_client_read_data_timeout>=5000)
{
tcp_client_read_data_timeout=0;
tcp_client_read_data_switch=0;
}
}
}
}
/**
* @brief 设备接收数据
* @param None
* @retval None
* @warning None
* @example
**/
void tcp_client_into_data(char *data, int length)
{
int len = length;
uint32_t CAN_IDE=0;
int i=0;
debug_printf("\r\ntcp read:");
for(i=0;i<len;i++)
{
debug_printf("%02x,",data[i]);
}
debug_printf("\r\n");
memset(tcp_client_buff,0,sizeof(tcp_client_buff));
if(len> sizeof(tcp_client_buff))
{
len = sizeof(tcp_client_buff);
memcpy(tcp_client_buff, data, sizeof(tcp_client_buff));
}
else{ memcpy(tcp_client_buff, data, len); }
if(length==13)
{
CAN_IDE = tcp_client_buff[1]; CAN_IDE = CAN_IDE<<8;
CAN_IDE = CAN_IDE + tcp_client_buff[2]; CAN_IDE = CAN_IDE<<8;
CAN_IDE = CAN_IDE + tcp_client_buff[3]; CAN_IDE = CAN_IDE<<8;
CAN_IDE = CAN_IDE + tcp_client_buff[4];//ID
if(CAN_IDE>0x7FF)//扩展帧
{
CanTxMsgValue.IDE = CAN_ID_EXT;
CanTxMsgValue.ExtId = CAN_IDE;
debug_printf("CAN_ID_EXT\r\n");
}
else//标准帧
{
CanTxMsgValue.IDE = CAN_ID_STD;
CanTxMsgValue.StdId = CAN_IDE;
debug_printf("CAN_ID_STD\r\n");
}
CanTxMsgValue.RTR=CAN_RTR_DATA;
if((tcp_client_buff[0]&0x10) == 0x10)//遥控帧
{
CanTxMsgValue.RTR = CAN_RTR_REMOTE;
debug_printf("CAN_RTR_REMOTE\r\n");
}
CanTxMsgValue.DLC = 8;
memcpy(CanTxMsgValue.Data, &tcp_client_buff[5], 8);//拷贝数据
if((tcp_client_buff[0]&0x01) == 0x01)//发送给CAN1口
{
debug_printf("CAN_SendData(CAN1, &CanTxMsgValue)\r\n");
CAN_SendData(CAN1, &CanTxMsgValue);//发送CAN数据
}
else if((tcp_client_buff[0]&0x02) == 0x02)//发送给CAN2口
{
debug_printf("CAN_SendData(CAN2, &CanTxMsgValue)\r\n");
CAN_SendData(CAN2, &CanTxMsgValue);//发送CAN数据
}
}
}
.