📄 can.c
字号:
#include "can.h"
unsigned char xdata uchDataRecBuf[8][250]; //收到的数据
unsigned char idata uchDataRecBufIndex=0; //缓冲区中包数
unsigned char idata uchReadDataRecBufIndex=0; //读取数据的包指针
unsigned char uchRePID;
unsigned char uchReDesID;
unsigned char xdata uchReSendDataBuf[300];
unsigned char idata uchFrameRotateIndex = 0;
unsigned char uchInforBagNum = 0xFF;
unsigned char idata uchCanAddress;
//--------------------------------------------------------------------------------------------------
//函数名称:void CANModuleParaInit(void)
//功 能:初始化CAN模块的参数
//输入参数:无
//返 回:无
//完成日期:4/13/2007
//-------------------------------------------------------------------------------------------------
void CANModuleParaInit(void) //tong add
{
uchCanAddress = ReadCANAddress();
}
/////////////////////////////////////////////////////////////////////////////////////////
//void SendPackage(unsigned char pID, unsigned char desID, unsigned char* SendData)
//入口参数:pID:事件类型,desID:目的地址,*SendData:发送数据包
//函数返回:无
//全局变量:souID:源地址,从插槽上读出的数据
//功能描述:把要解决的问题整理为数据,等候发送
//函数说明:如果发送失败,长度不对
//编写人: 郑福
//编写完成时间: 2007-04-20
//修改人:
//修改完成时间:
//修改原因:
/////////////////////////////////////////////////////////////////////////////////////////
void SendPackage(unsigned char pID, unsigned char desID, unsigned char* SendData)
{
unsigned char idata uchValue;
unsigned char idata uchResponFlag;
unsigned char idata uchSouID;
unsigned char idata uchMsgLength;
unsigned char idata uchFrameNum;
unsigned char idata uchResidByteNum;
unsigned char idata uchCycIndex,uchSendi,uchSendj;
unsigned char idata uchFrameFlag;
unsigned char xdata uchRemotAndData[13];
unsigned char idata uchDesID = desID;
unsigned int idata uii;
unsigned int idata uchSendNum;
unsigned char idata uchFrameIndex = 0;
LEDConfigControl();
uchRePID = pID;
uchReDesID = desID;
for (uii=0; uii<((SendData[1]<<8 | SendData[2])+3); uii++)
{
uchReSendDataBuf[uii] = SendData[uii];
}
// read_TRX_error();
uchInforBagNum++;
if(uchInforBagNum >= 8)
{
uchInforBagNum = 0;
}
if ((SendData[1] == 0x00)&&(SendData[2] == 0x00))
{
uchRemotAndData[0]= 0xc0; //远程帧
uchRemotAndData[1] = 0x44 | pID;
desID = 0xc0 | desID; // 0xc0 = 0x03<<6; 11只有一帧
uchRemotAndData[2]= desID;
uchSouID = uchCanAddress;
uchResponFlag = SendData[0]<<6;
uchSouID = uchResponFlag | uchSouID;
uchRemotAndData[3]= uchSouID;
// uchRemotAndData[4]= 0x00;
uchRemotAndData[4] = (uchInforBagNum<<3) & 0x3C; //bagNum and 0frame
uchRemotAndData[5]= '\0';
uchRemotAndData[6]= '\0';
uchRemotAndData[7]= '\0';
uchRemotAndData[8]= '\0';
uchRemotAndData[9]= '\0';
uchRemotAndData[10]= '\0';
uchRemotAndData[11]= '\0';
uchRemotAndData[12]= '\0';
writeCANdata(uchRemotAndData);
}
else //CAN数据帧打包开始
{
uchSendNum = ((SendData[1]<<8) + SendData[2]);
uchFrameNum = uchSendNum/8; //帧数
uchResidByteNum = uchSendNum%8; //不够一帧的字节数
for (uchCycIndex=0; uchCycIndex<=uchFrameNum; uchCycIndex++)
{
if (uchFrameNum == uchCycIndex)
{
if (uchResidByteNum==0x00)
{
break;
}
else
{
if (uchResidByteNum!=0x00 && uchFrameNum==0)
{
uchMsgLength = uchResidByteNum;
uchFrameFlag = 0x03;//0x03只有一帧
}
else
{
uchMsgLength = uchResidByteNum;
uchFrameFlag = 0x02; // 10 最后一帧
}
}
}
else
{
uchMsgLength = 0x08;
if (uchCycIndex == 0x00)
{
if ((uchResidByteNum==0x00)&&(uchFrameNum==0x01))
{
uchFrameFlag = 0x03; //0x03只有一帧
}
else
{
uchFrameFlag = 0x00; // 00 起始帧
}
}
else
{
if ((uchResidByteNum==0x00)&&((uchFrameNum-1)==uchCycIndex))
{
uchFrameFlag = 0x02; // 10 最后一帧
}
else
{
uchFrameFlag = 0x01;// 01 中间帧
}
}
}
uchValue = 0x80 + uchMsgLength;// Bit7=1:EFF;Bit6=0:data
uchRemotAndData[0] = uchValue;
uchRemotAndData[1] = 0x44 | pID;
desID = (uchFrameFlag<<6) | uchDesID;
uchRemotAndData[2] = desID;
uchSouID = uchCanAddress;
uchResponFlag = SendData[0]<<6;
uchSouID = uchResponFlag | uchSouID;
uchRemotAndData[3] = uchSouID;
uchRemotAndData[4] = (uchFrameIndex<<6 | uchInforBagNum<<3);
uchFrameIndex++;
if(uchFrameIndex == 0x04)
{
uchFrameIndex = 0;
}
if (0x08 == uchMsgLength)
{
uchRemotAndData[5] = SendData[uchCycIndex*8+3];
uchRemotAndData[6] = SendData[uchCycIndex*8+4];
uchRemotAndData[7] = SendData[uchCycIndex*8+5];
uchRemotAndData[8] = SendData[uchCycIndex*8+6];
uchRemotAndData[9] = SendData[uchCycIndex*8+7];
uchRemotAndData[10] = SendData[uchCycIndex*8+8];
uchRemotAndData[11] = SendData[uchCycIndex*8+9];
uchRemotAndData[12] = SendData[uchCycIndex*8+10];
}
else
{
uchSendj = 0x00;
for (uchSendi=0; uchSendi<uchMsgLength; uchSendi++)
{
uchRemotAndData[5+uchSendi] = SendData[uchCycIndex*8+3+uchSendi];
uchSendj++;
}
for (uchSendi=uchSendj; uchSendi<0x08; uchSendi++)
{
uchRemotAndData[5+uchSendi] = '\0';
}
uchFrameIndex = 0;
}
writeCANdata(uchRemotAndData);
if (SendData[0] == 0x01)
{
if(uchCycIndex == 0x00)
{
// CAN_ReSendSetInitia(20); //启动发送超时定时器4单位是(ms)
}
else
{
// CAN_ReSendReVal(20); //重写超时定时器4
}
}
} //for(uchCycIndex=0; uchCycIndex<=uchFrameNum; uchCycIndex++)结束
} //CAN数据帧打包结束
LEDConfigControl();
}
void SendPackageRemoteFrame(unsigned char pID, unsigned char desID, unsigned char *SendData)
{
unsigned char uchResponFlag;
unsigned char uchSouID;
unsigned char uchCycIndexCopy = 0;
unsigned char uchPackIndex = 0;
unsigned char xdata uchRemotAndData[5];
unsigned char uchDesID = desID;
uchRePID = pID;
uchReDesID = desID;
uchInforBagNum++;
if(uchInforBagNum >= 8)
{
uchInforBagNum = 0;
}
uchRemotAndData[0]= 0xc0; //远程帧
uchRemotAndData[1] = 0x44 | pID;
desID = 0xc0 | desID; // 0xc0 = 0x03<<6; 11只有一帧
uchRemotAndData[2]= desID;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -