文章目录

  • 前言
  • 一、bsp
    • bsp_can.h
    • bsp_can.c
  • 二、如何使用
  • 总结


前言

stm32 cubemx can通讯(1)回环模式
stm32 cubemx can通讯(2)过滤器设置说明代码分析
根据前两篇文章已经能够实现can标准帧的收发,但是调用的函数没有标准化和可扩展性。
所以本文讲解bsp,在bsp中已经有了发送函数和接受回调函数的任务映射处理回调函数。
暂时(2023.8.10)还未加入过滤器配置,所以过滤器还是需要在can_init中进行配置。

文件


一、bsp

bsp_can.h

#ifndef __BSP_CAN_H
#define __BSP_CAN_H
#include "main.h"#include "can.h"uint8_t  CANSend(CAN_HandleTypeDef *hcan,uint32_t Source_ID,uint32_t IDE,uint32_t RTR,uint8_t* Datum,uint8_t DataLength);typedef struct {uint32_t id;uint32_t idType;  // CAN_ID_STD or CAN_ID_EXTvoid (*callback)(uint8_t* data);
} CAN_CallbackMapType;#endif

bsp_can.c

#include "bsp_can.h"/*** 发送CAN数据* @param hcan: 使用的CAN句柄* @param Source_ID: 消息ID* @param IDE: 标识符类型 (CAN_ID_STD 或 CAN_ID_EXT)* @param RTR: 消息类型 (CAN_RTR_DATA 或 CAN_RTR_REMOTE)* @param Datum: 要发送的数据* @param DataLength: 数据长度* @return: HAL的状态 (		1 成功 		0 失败			)*/
#define CAN_MAX_DATA_LENGTH 8
uint8_t  CANSend(CAN_HandleTypeDef *hcan,uint32_t Source_ID,uint32_t IDE,uint32_t RTR,uint8_t* Datum,uint8_t DataLength)
{// 参数验证if (!hcan || !Datum || (IDE != CAN_ID_STD && IDE != CAN_ID_EXT) || DataLength > CAN_MAX_DATA_LENGTH) {return 0;}CAN_TxHeaderTypeDef TXHeader;  uint32_t pTxMailbox = 0;if (IDE == CAN_ID_STD) {TXHeader.StdId = Source_ID;} else {TXHeader.ExtId = Source_ID;               }TXHeader.IDE = IDE;TXHeader.DLC = DataLength;TXHeader.RTR = RTR;TXHeader.TransmitGlobalTime = DISABLE;HAL_StatusTypeDef status = HAL_CAN_AddTxMessage(hcan, &TXHeader, Datum, &pTxMailbox);if (status == HAL_OK) {return 1;  // 返回1表示成功} else {return 0;  // 返回0表示失败}		
}/* USER CODE BEGIN mapping_function */
int  cc =0;
// 示例的回调函数
void handle_ID_0x01(uint8_t *data) {// 对于ID 0x01的处理代码cc=1;
}void handle_ID_0x02(uint8_t *data) {// 对于ID 0x02的处理代码cc=2;
}
void handle_ID_0x12345678(uint8_t *data) {// 对于ID 0x02的处理代码cc=4;
}
// 初始化映射表
CAN_CallbackMapType callbackMap[] = {{0x01, CAN_ID_STD, handle_ID_0x01},{0x02, CAN_ID_STD, handle_ID_0x02},// 添加一个扩展ID的例子{0x12345678, CAN_ID_EXT, handle_ID_0x12345678}  
};/* USER CODE mapping_function */
const uint8_t mapSize = sizeof(callbackMap) / sizeof(CAN_CallbackMapType);void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) 
{if(hcan->Instance == CAN1) {// 获取数据CAN_RxHeaderTypeDef RXHeader;uint8_t RXmessage[8];  // 确保这里的数组大小正确if(HAL_CAN_GetRxMessage(hcan, CAN_FILTER_FIFO0, &RXHeader, RXmessage) == HAL_OK) {for(uint8_t i = 0; i < mapSize; i++) {if(RXHeader.IDE == callbackMap[i].idType && (RXHeader.IDE == CAN_ID_STD && RXHeader.StdId == callbackMap[i].id || RXHeader.IDE == CAN_ID_EXT && RXHeader.ExtId == callbackMap[i].id) && callbackMap[i].callback) {callbackMap[i].callback(RXmessage);break;}}}}
}

二、如何使用

发送函数可以直接调用。

uint8_t TXmessage[8] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77};
CANSend(&hcan,0x12,CAN_ID_STD,CAN_RTR_DATA,TXmessage,8);

接收函数的回调函数不需要进行修改,当有任务需要处理的时候先写任务处理的回调函数也就是示例代码中的void handle_ID_0x01(uint8_t *data)之类的。
然后再进行初始化映射CAN_CallbackMapType callbackMap[]
所以只需要在/* USER CODE BEGIN mapping_function */之间修改函数即可。其他的不需要更改。


总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/35875.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/35875.shtml
英文地址,请注明出处:http://en.pswp.cn/news/35875.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年国赛数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…

软考高级之系统架构师之数据通信与计算机网络

概念 OSPF 在划分区域之后&#xff0c;OSPF网络中的非主干区域中的路由器对于到外部网络的路由&#xff0c;一定要通过ABR(区域边界路由器)来转发&#xff0c;既然如此&#xff0c;对于区域内的路由器来说&#xff0c;就没有必要知道通往外部网络的详细路由&#xff0c;只要由…

保持城市天际线(力扣)贪心 JAVA

给你一座由 n x n 个街区组成的城市&#xff0c;每个街区都包含一座立方体建筑。给你一个下标从 0 开始的 n x n 整数矩阵 grid &#xff0c;其中 grid[r][c] 表示坐落于 r 行 c 列的建筑物的 高度 。 城市的 天际线 是从远处观察城市时&#xff0c;所有建筑物形成的外部轮廓。…

html2canvas生成图片地址Base64格式转成blob在转成file(二进制)可正常发送(保姆教程,复制粘贴可用)

开始: 最终结果: 1. html2canvas方法生成的图片地址已Base64编码形式放在img标签src中可直接展示生成的图片(注意页面标签获取位置,还有个setTimeout页面渲染需要时间) setTimeout(function () {var result {};v…

Python 使用Hadoop 3 之HDFS 总结

Hadoop 概述 Hadoop 是一个由Apache 软件基金会开发的分布式基础架构。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序&#xff0c;充分利用集群的威力进行高速运算和存储。 Hadoop 实现一个分布式文件系统&#xff08;Hadoop Distributed File Sy…

Python爬虫——selenium_交互

交互&#xff1a; 点击&#xff1a;button.click() 输入&#xff1a;inputs.send_keys() 后退操作&#xff1a;browser.back() 前进操作&#xff1a;browser.forword() 模拟js滚动&#xff1a;browser. js_bottom document.documentElement.scrollTop100000 browser.execute_…

将本地项目上传至gitee的详细步骤

将本地项目上传至gitee的详细步骤 1.在gitee上创建以自己项目名称命名的空项目2.进入想上传的项目的文件夹&#xff0c;然后右键点击3. 初始化本地环境&#xff0c;把该项目变成可被git管理的仓库4.添加该项目下的所有文件5.使用如下命令将文件添加到仓库中去6.将本地代码库与远…

Stable Diffusion 插件开发基础讲解

近来Stable diffusion扩散网络大热,跟上时代,简单的文生图,图生图,其实可以满足绝大多数设计师的应用,但是有什么是赛博画手无法做到的呢? 那就是他们使用到的stable diffusion的插件开发,他们并不清楚stable diffusino的代码结构,如果遇到一些代码层面的报错问题,他们…

生信豆芽菜-单基因KM曲线

网址&#xff1a;http://www.sxdyc.com/panCancerKMCurve 该工具主要用于查看单基因在泛癌组织中&#xff0c;高低表达的预后情况&#xff0c;这里可以选择合适的截断值&#xff0c;比如最佳截断&#xff0c;中位值&#xff0c;平均值&#xff0c;当然也可以自己输入&#xff0…

基于长短期神经网络的客流量预测,基于长短期神经网络的超短期客流量预测,lstm详细原理

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的客流量预测 完整代码: 基于长短期神经网络LSTM的公交站客流量预测资源-CSDN文库 https://download.csdn.net/download/abc991835105/88184734 效果图 结果分析 展望 参考论文 背影 碳排放越来越受到重…

java将字符串中文转为拼音

可以使用第三方库来实现中文转拼音的功能&#xff0c;比如使用pinyin4j这个库。 首先&#xff0c;需要将pinyin4j库添加到项目的依赖中。可以通过Maven或者Gradle来添加依赖。 对于Maven&#xff0c;可以在pom.xml文件中添加以下代码&#xff1a; <dependency><group…

原生信息流广告特点,如何帮APP开发者增加变现收益?

简单来说&#xff1a;原生广告&#xff0c;就是把广告片和账号&#xff0c;一起用消耗推流的买量模式&#xff0c;一同投放出去。 用户看到的广告/内容&#xff0c;与原生视频没有差别——用户可以点头像关注、也可以查看账号历史信息。原生广告本质&#xff0c;是显得真实、原…

聊一聊Sentinel背后的原理

Sentinel简介 Sentinel是阿里开源的一款面向分布式、多语言异构化服务架构的流量治理组件。 主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 上面两句话来自Sentin…

Android自定义侧滑Item

源码地址&#xff1a;https://github.com/LanSeLianMa/CustomizeView/tree/master/cehuaitem 使用方式一&#xff1a;XML布局中直接使用 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com…

Python爬虫 爬取图片

在我们日常上网浏览网页的时候&#xff0c;经常会看到一些好看的图片&#xff0c;我们就希望把这些图片保存下载&#xff0c;或者用户用来做桌面壁纸&#xff0c;或者用来做设计的素材。 我们最常规的做法就是通过鼠标右键&#xff0c;选择另存为。但有些图片鼠标右键的时候并没…

CVPR 2023 | 用户可控的条件图像到视频生成方法(基于Diffusion)

注1:本文系“计算机视觉/三维重建论文速递”系列之一&#xff0c;致力于简洁清晰完整地介绍、解读计算机视觉&#xff0c;特别是三维重建领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, NeurIPS, ICLR, ICML, TPAMI, IJCV 等)。 本次介绍的论…

使用chatGPT-4 畅聊量子物理学(二)

Omer 量子力学的主导哲学或模型或解释是什么&#xff1f; ChatGPT 量子力学是一门描述微观世界中粒子行为的物理学理论&#xff0c;但它的解释和哲学观点在学术界存在多种不同的观点和争议。以下是几种主要的哲学观点或解释&#xff1a; 哥本哈根解释&#xff1a;这是最为广泛…

Windows 11清除无效、回收站、过期、缓存、补丁更新文件

Windows 11与之前的Windows版本类似&#xff0c;也需要定期清理无效、垃圾、过期、缓存文件来保持系统性能和存储空间的优化。以下是在Windows 11中进行这些清理操作的一些建议方法&#xff1a; 磁盘清理工具 Windows 11内置了磁盘清理工具&#xff0c;可以帮助你删除临时文件…

Node.js学习笔记-03

七、网络编程 1. 构建 TCP 服务 TCP 是面向连接的协议&#xff0c;显著特征 在传输之前需要3次握手形成会话。 客户端 ——请求连接——> 服务器端 ——响应——> 客户端 ——开始传输——> 服务器端。 2. 构建 UDP 服务 3. 构建 HTTP 服务 http模块 在node中HTT…