#include"queue.h"
CAN_Queue CANQueue;
unsigned char rx_buf[8];//读取队列数据缓存用来判断
/*******************************************************************
函数功能: 清除通信队列
入口参数: 无
返 回 值: 无
********************************************************************/
void ClearCanQueue(void)
{
int i;
for(i = 0; i < MAX_CAN_SIZE; i++)
{
memset(&CANQueue.Elem[i],0,sizeof(CanRxMsg));
}
CANQueue.front = 0;
CANQueue.rear = 0;
}
/*******************************************************************
函数功能: 判断串口队列是否为空
入口参数:
返 回 值: 1: 空; 0:非空
********************************************************************/
unsigned char IsEmptyCanQueue(void)
{
if(CANQueue.front == CANQueue.rear)
{
return 1;
}
else
{
return 0;
}
}
/*******************************************************************
函数功能: 判队列是否满
入口参数:
返 回 值: 1: 满; 0:非满
********************************************************************/
unsigned char IsFullCanQueue(void)
{
if( CANQueue.front == (CANQueue.rear+1) % MAX_CAN_SIZE)
{
return 1;
}
else
{
return 0;
}
}
/*******************************************************************
函数功能: 将数据插入队列
入口参数: element:被插元素
返 回 值: 1: 成功; 0:失败
********************************************************************/
unsigned char InsertCanQueue(CanRxMsg element)
{
if(!IsFullCanQueue()) //是否为满
{
memcpy((void*)&CANQueue.Elem[CANQueue.rear],(void*)&element,sizeof(CanRxMsg));
CANQueue.rear = (CANQueue.rear + 1) % MAX_CAN_SIZE;
return 1;
}
else //队列满
{
// printf("CAN queue is full\r\n");
return 0;
}
}
/*******************************************************************
函数功能: 重新设置队列头指针
入口参数: head: 新头
返 回 值: 无
********************************************************************/
void SetHeadCanQueue(unsigned char head)
{
if(CANQueue.front != CANQueue.rear)
{
CANQueue.front = head;
}
}
/*******************************************************************
函数功能: 取对头
入口参数: head:对头;*element;数据
返 回 值: 1: 成功 0: 失败
********************************************************************/
unsigned char GetCanQueue(unsigned char head,CanRxMsg *element)
{
if(head != CANQueue.rear) //到队列尾
{
memcpy(element,(void*)&CANQueue.Elem[head],sizeof(CanRxMsg));//得到数据
return 1;
}
else
{
return 0; //无指定对头数据
}
}
/*******************************************************************
函数功能: can数据处理
入口参数:
返 回 值:
********************************************************************/
void Can_data_process(void)
{
unsigned char head;
CanRxMsg Rxmessage;
head = CANQueue.front;
if(1 == GetCanQueue(head,&Rxmessage))//不为空
{
head = (head + 1) % MAX_CAN_SIZE; //查询头前滚
SetHeadCanQueue(head);
memcpy((void*)&rx_buf,(void*)Rxmessage.CanRX_buf,sizeof(CanRxMsg));
if (rx_buf[0] != 0x01) //本例中的本机地址设定为0x01,
{ //如数据帧中的地址字节与本机地址不符,
return; //则直接退出,即丢弃本帧数据不做任何处理
}
switch (rx_buf[1])
{
case 0x03: //做为主机 发送读取指令后 对从设备返回数据进行处理并显示 01 03 02
if ((rx_buf[2]==0x20) && (rx_buf[3]==0x00))
{
led_control(ON);
}else if((rx_buf[2]==0x20) && (rx_buf[3]==0x01))
{
led_control(OFF);
}
break;
case 0x06: //写单个寄存器
break;
default: //其它不支持的功能码
rx_buf[1] |= 0x80; //功能码最高位置1
rx_buf[2] = 0x01; //设置异常码为01-无效功能
break;
}
}else if(1==IsEmptyCanQueue()) //为空
{
ClearCanQueue();
}
}