kw_can库说明
本库是针对CAN类型数据的收发设计:
- 主要应用于大数据量(数据处理速度高于缓存CAN_RTX_FIFO_SIZE大小)接收不丢包
- 可快速进出接收中断
- 可跨线程调用发送接口。
本库开源连接地址:gitee连接
实现思路
本库采用C语言进行编程,方便移植,用户只通过调用库接口函数即可使用。
主要接口函数如下:
项目 | 函数 | 功能 |
---|---|---|
1 | kw_CANInit | 初始化,初始化设备信息,和CAN发送回调函数 |
2 | kw_CANFlush | 周期发送指定CAN设备信息中的发送缓存中的数据 |
3 | kw_CANBufferPop | 弹出指定Buffer中的CAN帧 |
4 | kw_CANBufferPush | 压入CAN帧到指定Buffer中 |
主要变量结构体定义如下:
项目 | 变量 | 类型 | 说明 |
---|---|---|---|
1 | _canSendCB | 函数指针变量 | can发送回调变量 |
2 | kw_CanFrame_t | CAN帧结构体 | id:CAN发送ID datas:CAN帧数组 len:CAN帧数组长度 |
3 | kw_CanBuffer_t | CAN帧环形队列结构体 | frame:CAN帧结构体 read:读指针 write:写指针 |
4 | kw_CanDev_t | CAN设备结构体 | rx:接收队列 tx:发送队列 io:发送接口 |
测试代码
c
#include "kw_baseDrvCFG.h"
static kw_CanDev_t _canDev;
/// @brief can接收回调,该函数可放在can接收中断中
/// @param rx
static void _CanRx_CB(const kw_CanFrame_t *rx)
{
kw_CANBufferPush(&_canDev.rx, rx->id, rx->datas, rx->len);
}
/// @brief 调用硬件层CAN发送接口
/// @param tx
/// @return
int _canSendCB(const kw_CanFrame_t *tx)
{
return HAL_CanTransmit(&hcan1, tx->id, tx->datas, tx->len, 1000);
}
void main()
{
kw_CANInit(&_canDev, _canSendCB);
kw_CanFrame_t ret = {0};
while (1)
{
if (kw_CANBufferPop(&_canDev.rx, &ret) == 0)
{
if (ret.id == 0x1234567 && ret.len == 2 && ret.datas[0] == 0x5A && ret.datas[1] == 0xA5)
{ // 回传指定的can frame
kw_CANBufferPush(&_canDev, &ret);
}
}
kw_CANFlush(&_canDev);
HAL_Delay(1); //
}
}