CAN环stm32代码

CANRing.h代码如下:

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CANRINGQ_H__
#define __CANRINGQ_H__
/* Includes ------------------------------------------------------------------*/
#include "can_driver.h"
#include <stdio.h>
#include "stm32f10x_can.h"

#ifdef __cplusplus
 CanRxMsgRing space; 
extern "C" {
#endif 
/* Private define ------------------------------------------------------------*/
	#define QUEUE_MAX 128
	/* Private typedef -----------------------------------------------------------*/
	typedef struct RxRing{
		int head; 
		int tail; 
		int tag ; 
		int size ;  
		CanRxMsg CANRxSpace[QUEUE_MAX];
}CANRxRINGQ;
	typedef struct TxRing{
		int head; 
		int tail; 
		int tag ; 
		int size ;  
		CanTxMsg CANTxSpace[QUEUE_MAX];
}CANTxRINGQ;
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
extern CANRxRINGQ CANRxBuf, * RxPtr;
extern CANTxRINGQ CANTxBuf, * TxPtr;
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
int CANRxRINGQ_init(CANRxRINGQ * p_queue);
int CANRxRINGQ_free(CANRxRINGQ * p_queue);
int CANRxRINGQ_push(CANRxRINGQ * p_queue,CanRxMsg data);
int CANRxRINGQ_poll(CANRxRINGQ * p_queue,CanRxMsg *p_data);
#define CANRxRINGQ_is_empty(q) ( (q->head == q->tail) && (q->tag == 0))
#define CANRxRINGQ_is_full(q) ( (q->head == q->tail) && (q->tag == 1))

int CANTxRINGQ_init(CANTxRINGQ * p_queue);
int CANTxRINGQ_free(CANTxRINGQ * p_queue);
int CANTxRINGQ_push(CANTxRINGQ * p_queue,CanTxMsg data);
int CANTxRINGQ_poll(CANTxRINGQ * p_queue,CanTxMsg *p_data);
#define CANTxRINGQ_is_empty(q) ( (q->head == q->tail) && (q->tag == 0))
#define CANTxRINGQ_is_full(q) ( (q->head == q->tail) && (q->tag == 1))
	#ifdef __cplusplus
}
	#endif 
	#endif /* __CANRxRINGQ_H__ */
/*********************************END OF FILE**********************************/

CANRing.C代码如下:

/* Define to prevent recursive inclusion -------------------------------------*/
/* Includes ------------------------------------------------------------------*/
#include "CANRing.h"
/* Private typedef -----------------------------------------------------------*/ 
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
CANRxRINGQ CANRxBuf={0,0,0,0,{0}};
CANRxRINGQ *RxPtr;
CANTxRINGQ CANTxBuf = {0,0,0,0,{0}};
CANTxRINGQ *TxPtr;
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

int CANRxRINGQ_init(CANRxRINGQ * p_queue)
{
	p_queue->size = QUEUE_MAX ;
	p_queue->head = 0;
	p_queue->tail = 0;
	p_queue->tag = 0;
	return 0;
}

int CANRxRINGQ_free(CANRxRINGQ * p_queue){
		return 0;
}

int CANRxRINGQ_push(CANRxRINGQ * p_queue,CanRxMsg data)
{
	
	if(CANRxRINGQ_is_full(p_queue))
		{
			return -1;
		}
		p_queue->CANRxSpace[p_queue->tail] = data;
		p_queue->tail = (p_queue->tail + 1) % p_queue->size ;
		if(p_queue->tail == p_queue->head)
			{
				p_queue->tag = 1;
			}
			return p_queue->tag;
			
}

int CANRxRINGQ_poll(CANRxRINGQ * p_queue,CanRxMsg * p_data)
{
	if(CANRxRINGQ_is_empty(p_queue))
		{
			return -1;
		}
		*p_data = p_queue->CANRxSpace[p_queue->head];
		p_queue->head = (p_queue->head + 1) % p_queue->size ;
		if(p_queue->tail == p_queue->head)
			{
				p_queue->tag = 0;
			}
			return p_queue->tag ;
}

int CANTxRINGQ_init(CANTxRINGQ * p_queue)
{
	p_queue->size = QUEUE_MAX ;
	p_queue->head = 0;
	p_queue->tail = 0;
	p_queue->tag = 0;
	return 0;
}

int CANTxRINGQ_free(CANTxRINGQ * p_queue){
		return 0;
}

int CANTxRINGQ_push(CANTxRINGQ * p_queue,CanTxMsg data)
{
	
	if(CANRxRINGQ_is_full(p_queue))
		{
			return -1;
		}
		p_queue->CANTxSpace[p_queue->tail] = data;
		p_queue->tail = (p_queue->tail + 1) % p_queue->size ;
		if(p_queue->tail == p_queue->head)
			{
				p_queue->tag = 1;
			}
			return p_queue->tag;
			
}

int CANTxRINGQ_poll(CANTxRINGQ * p_queue,CanTxMsg * p_data)
{
	if(CANRxRINGQ_is_empty(p_queue))
		{
			return -1;
		}
		*p_data = p_queue->CANTxSpace[p_queue->head];
		p_queue->head = (p_queue->head + 1) % p_queue->size ;
		if(p_queue->tail == p_queue->head)
			{
				p_queue->tag = 0;
			}
			return p_queue->tag ;
}

/*********************************END OF FILE**********************************/

main.c 代码如下:


*/  
/* Includes ------------------------------------------------------------------*/
#include "CANRing.h"

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
int main(void)
{
  	RxPtr = &CANRxBuf;
	CANRxRINGQ_init(RxPtr);
	
	TxPtr = &CANTxBuf;
	CANTxRINGQ_init(TxPtr);
    	
        CanRxMsg test_RxMessage = {0x00,02000000, 0x00,0x00, 0x08, {0},0x00};
        CANRxRINGQ_push(RxPtr, test_RxMessage);
       
  while (1)
  {
	 if(!CANRxRINGQ_is_empty(RxPtr)){
		CanRxMsg Rxmsg;
		CANRxRINGQ_poll(RxPtr,&Rxmsg);
        //To deal with CANRX message 
                //CAN_cmd_ExecutiveCommand(&Rxmsg);
          }
	if(!CANTxRINGQ_is_empty(TxPtr)){
		CanTxMsg Txmsg;
		CANTxRINGQ_poll(TxPtr,&Txmsg);
        //To deal with CANTX message 
		//CAN_WriteData(&Txmsg);
        }
  }
}

/*********************************END OF FILE**********************************/

CANRxRINGQ_push()可以放入CAN接受中断处理函数中,CANTxRINGQ_push()可以放任意想放的位置将要发的CANmessage压入CAN环内。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值