📄 can.c
字号:
uchSouID = uchCanAddress;
uchResponFlag = SendData[0]<<6;
uchSouID = uchResponFlag | uchSouID;
uchRemotAndData[3]= uchSouID;
uchRemotAndData[4] = (uchInforBagNum<<3) & 0x3C; //bagNum and 0frame
uchRemotAndData[5]= '\0';
uchRemotAndData[6]= '\0';
writeCANdataRemateFrame(uchRemotAndData);
}
/////////////////////////////////////////////////////////////////////////////////////////
//void CanFrameInterrupt();
//入口参数:无
//函数返回:无
//全局变量:uchDataRecBuf[][9]:收到的数据,send_address:发送芯片的地址
//功能描述:整理接收区内的数据
//函数说明
//编写人: 郑福
//编写完成时间: 2007-04-20
//修改人:
//修改完成时间:
//修改原因:
/////////////////////////////////////////////////////////////////////////////////////////
void CanFrameInterrupt(unsigned char *uchReceiData)
{
unsigned char uchFrameType;
unsigned char uchFrameFlag;
unsigned char uchFrameNum;
unsigned char uchResidByteNum;
unsigned char uchRemoFrameAdd; //远程帧发送方地址
unsigned char uchBagResponFlag; //00:不需要回应 01:需要回应
unsigned char uchRemoFramedata[3];
unsigned char *puchReceiData; //接收数据的指针
unsigned char uchReceiFrameSerial = 0;
unsigned char uchtemp = 0;
puchReceiData=uchReceiData;
uchRemoFramedata[0] = 0x10; //响应帧
uchRemoFramedata[1] = 0x00; //远程帧无数据
uchRemoFramedata[2] = '\0';
uchReceiFrameSerial = (puchReceiData[4]>>6) & 0x03;
uchFrameNum = uchReceiFrameSerial;
uchFrameType = puchReceiData[0] & 0xc0;
if (uchFrameType == 0xc0)
{
uchRemoFrameAdd = puchReceiData[3] & 0x3f;//发送芯片的地址
// Close_CANReSend();//关闭发送超时定时器4
}
else//开始else
{
uchFrameFlag = puchReceiData[2] & 0xc0; //11 00 00000
if (uchFrameFlag == 0x00) //0000 0000
{
uchDataRecBuf[uchDataRecBufIndex][0] = puchReceiData[3] & 0x3f;//发送芯片的地址
uchDataRecBuf[uchDataRecBufIndex][3] = puchReceiData[5];
uchDataRecBuf[uchDataRecBufIndex][4] = puchReceiData[6];
uchDataRecBuf[uchDataRecBufIndex][5] = puchReceiData[7];
uchDataRecBuf[uchDataRecBufIndex][6] = puchReceiData[8];
uchDataRecBuf[uchDataRecBufIndex][7] = puchReceiData[9];
uchDataRecBuf[uchDataRecBufIndex][8] = puchReceiData[10];
uchDataRecBuf[uchDataRecBufIndex][9] = puchReceiData[11];
uchDataRecBuf[uchDataRecBufIndex][10] = puchReceiData[12];
uchFrameRotateIndex = 0;
}
else
if( uchFrameFlag == 0x40 ) //0100 0000
{
uchtemp = uchFrameRotateIndex*4*8;
uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+3] = puchReceiData[5];
uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+4] = puchReceiData[6];
uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+5] = puchReceiData[7];
uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+6] = puchReceiData[8];
uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+7] = puchReceiData[9];
uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+8] = puchReceiData[10];
uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+9] = puchReceiData[11];
uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+10] = puchReceiData[12];
if (uchFrameNum==0x03)
{
uchFrameRotateIndex++;
}
}
else
if (uchFrameFlag == 0x80)
{
puchReceiData[0] = puchReceiData[0] & 0x0f;//数据长度
uchDataRecBuf[uchDataRecBufIndex][1] = (uchFrameRotateIndex*4*8+uchFrameNum*8+puchReceiData[0])/256;
uchDataRecBuf[uchDataRecBufIndex][2] = (uchFrameRotateIndex*4*8+uchFrameNum*8+puchReceiData[0])%256;
for (uchResidByteNum=0; uchResidByteNum<puchReceiData[0]; uchResidByteNum++)
{
uchDataRecBuf[uchDataRecBufIndex][uchFrameRotateIndex*4*8+uchFrameNum*0x08+3+uchResidByteNum] = puchReceiData[5+uchResidByteNum];
}
uchDataRecBuf[uchDataRecBufIndex][uchFrameRotateIndex*4*8+uchFrameNum*0x08+3+uchResidByteNum+1] = '\0';
uchFrameRotateIndex = 0;
uchDataRecBufIndex++;//增加一包记录
if (uchDataRecBufIndex>=8)
{
uchDataRecBufIndex = 0;//到了包的边界
}
if (uchDataRecBufIndex==uchReadDataRecBufIndex)
{
uchReadDataRecBufIndex++; //说明前面的包没有读走,后面的包将要覆盖前面的数据
}
uchRemoFrameAdd = puchReceiData[3] & 0x3f;
uchBagResponFlag = puchReceiData[3] & 0x40;
if ((puchReceiData[2]<<2)!=0xfc)
{
if (uchBagResponFlag == 0x40)
{
SendPackageRemoteFrame(0x47, uchRemoFrameAdd, uchRemoFramedata); //发送响应帧
}
}
}
else
if (uchFrameFlag == 0xc0)
{
puchReceiData[0] = puchReceiData[0] & 0x0f;
uchDataRecBuf[uchDataRecBufIndex][0] = puchReceiData[3] & 0x3f;//发送芯片的地址
uchDataRecBuf[uchDataRecBufIndex][1] = 0;
uchDataRecBuf[uchDataRecBufIndex][2] = puchReceiData[0];
for (uchResidByteNum=0; uchResidByteNum<puchReceiData[0]; uchResidByteNum++)
{
uchDataRecBuf[uchDataRecBufIndex][3+uchResidByteNum] = puchReceiData[5+uchResidByteNum];
}
uchDataRecBuf[uchDataRecBufIndex][3+uchResidByteNum+1] = '\0';
uchDataRecBufIndex++;//增加一包记录
if (uchDataRecBufIndex>=8)
{
uchDataRecBufIndex=0; //到了包的边界
}
if (uchDataRecBufIndex==uchReadDataRecBufIndex)
{
uchReadDataRecBufIndex++; //说明前面的包没有读走,后面的包将要覆盖前面的数据
}
uchRemoFrameAdd = puchReceiData[3] & 0x3f;
uchBagResponFlag = puchReceiData[3] & 0x40;
if ((puchReceiData[2]<<2)!=0xfc)
{
if (uchBagResponFlag == 0x40)
{
SendPackageRemoteFrame(0x47, uchRemoFrameAdd, uchRemoFramedata); //发送响应帧
}
}
}
}// 结束ELSE
}
/////////////////////////////////////////////////////////////////////////////////////////
//unsigned char BagNum(void)
//入口参数:
//函数返回:包数
//全局变量:uchDataRecBuf[][9]:收到的数据,send_address:发送芯片的地址
//功能描述:读出接收区内的数据
//函数说明:
//编写人: 郑福
//编写完成时间: 2007-04-20
//修改人:
//修改完成时间:
//修改原因:
/////////////////////////////////////////////////////////////////////////////////////////
unsigned char BagNum(void)
{
unsigned char idata uchInforBagNum;
if (uchDataRecBufIndex>=uchReadDataRecBufIndex)
{
uchInforBagNum = uchDataRecBufIndex-uchReadDataRecBufIndex;//接收缓存区数据
}
else
{
uchInforBagNum = 8+uchDataRecBufIndex-uchReadDataRecBufIndex;
}
return uchInforBagNum;
}
/////////////////////////////////////////////////////////////////////////////////////////
//unsigned char* GetAMessage(void)
//入口参数:
//函数返回:优先级(即事件类型)0:报警事件,1:系统事件,2:信号,3:初始化数据,4:数据读写
//全局变量:uchDataRecBuf[][9]:收到的数据,send_address:发送芯片的地址
//功能描述:读出接收区内的数据
//函数说明:一定要在指针减一前,关闭CAN中断,指针减一后,打开CAN中断
//编写人: 郑福
//编写完成时间: 2007-04-20
//修改人:
//修改完成时间:
//修改原因:
/////////////////////////////////////////////////////////////////////////////////////////
unsigned char *GetAMessage(void)
{
unsigned char *puchGetRec;
if (uchReadDataRecBufIndex==uchDataRecBufIndex)
{
puchGetRec = '\0'; //没有数据包
}
else
{
puchGetRec = uchDataRecBuf[uchReadDataRecBufIndex];
if (uchReadDataRecBufIndex<7)
{
uchReadDataRecBufIndex++;
}
else
{
uchReadDataRecBufIndex = 0;
}
}
return puchGetRec; //收到的数据指针
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//void ClearAllMessage();
//入口参数: 无
//函数返回: 无
//功能描述: 清除CAN接收的整包数据
//编写人: 郑福
//编写完成时间: 2007-04-20
//修改人:
//修改完成时间:
//修改原因:
/////////////////////////////////////////////////////////////////////////////////////////////////
void ClearAllMessage()
{
uchDataRecBufIndex = uchReadDataRecBufIndex;//清除接收缓存区数据
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -