一、初始化环形容器
具体初始化不做细致讲解
#define BUFFER_SIZE 100
struct SIMPLE
{
u32 StID ;//CANID
u8 DLC;//报文长度
u8 data[8];//报文内容
};
struct SIMPLE t1[BUFFER_SIZE];//用来接收can报文
二、初始化CAN中断
初始化不做细致讲解
void USB_LP_CAN1_RX0_IRQHandler(void)
{
u8 count = 0;
CanRxMsg RxMessage;
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
count=RxMessage.DLC;
t1[can_rec_head].DLC=RxMessage.DLC; //接收的报文长度
t1[can_rec_head].StID= RxMessage.StdId; //接收的报文CANID
memcpy( t1[can_rec_head].data,RxMessage.Data,count);//接收的报文的数据
can_rec_head++;
if(can_rec_head>=BUFFER_SIZE)
{
can_rec_head=0;
}
}
三、处理容器中的CAN报文函数
void Read_buffer(void)
{
u8 i;
u8 count=0;
u16 canid=0;
static u8 th; //用于标记poll_buffer[th]
if(can_rec_head != can_deal_tail)
{
//-------------处理刚收到的can报文
//-------------
can_deal_tail++;
}
else
{
//---------------其他功能
}
if(can_deal_tail>=BUFFER_SIZE)
{
can_deal_tail=0;
}
四、在while大循环中处理中断接收到的CAN报文
、、、
while(1)
{
Read_buffer();//读取canbuffer中的数据
}
实测不丢包
以上!!!