STM32 printf 重定向到CAN
最近在调试一款电机驱动板 使用的是CAN总线而且板子上只有一个CAN
想移植Easylogger到上面试试easylogger的效果,先实现pritnf的重定向功能来打印输出
只需要添加以下代码即可实现
代码
#include <stdarg.h>
uint8_t FDCAN_UserTxBuffer[512];
void FDCAN_printf(const char *format, ...)
{va_list args;uint32_t length;va_start(args, format);length = vsnprintf((char *)FDCAN_UserTxBuffer, 512, (char *)format, args);va_end(args);FDCAN_Send_Data(0x100,FDCAN_UserTxBuffer,length);
}
/* CAN 发送一帧数据 */
void FDCAN_Send_Message(uint32_t id, uint8_t *buf, uint8_t len)
{FDCAN_TxHeaderTypeDef TxHeader;/* 配置Tx缓冲区消息 */TxHeader.Identifier = id; /* 报文ID */TxHeader.IdType = FDCAN_EXTENDED_ID; /* 扩展ID模式 */TxHeader.TxFrameType = FDCAN_DATA_FRAME; /* 数据帧 */#if defined(CLASSIC_CAN)if (len >= 8)len = 8;uint32_t CAN_FRAME_DL = len ;
#elseuint32_t CAN_FRAME_DL = FDCAN_DLC_BYTES_64; /* FDCAN 默认使用64*/
#endifTxHeader.DataLength = CAN_FRAME_DL; /* 数据帧长度 */TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE; /*发送节点错误 */TxHeader.BitRateSwitch = FDCAN_BRS_OFF; /* 无波特率切换 */TxHeader.FDFormat = CAN_MODE; /* CAN模式*/TxHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;TxHeader.MessageMarker = 0x01;/* 发送缓冲区消息 */HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, buf);while (HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) != 3); /*等待发送完成*/
}
/* CAN发送多帧数据 */
void FDCAN_Send_Data(uint32_t id, uint8_t *buf, uint32_t len)
{uint32_t transmission_times = 0; /* 发送次数 */uint32_t remian_bytes = 0; /* 剩余字节 */uint32_t frame_length = 0; /* 帧长度 */#if defined(CLASSIC_CAN)frame_length = 8;
#elseframe_length = 64;
#endiftransmission_times = len / frame_length;remian_bytes = len % frame_length;int i = 0;while (i < transmission_times){FDCAN_Send_Message(id, buf + i * frame_length, len);i++;}if (remian_bytes > 0){FDCAN_Send_Message(id, buf + transmission_times * frame_length, remian_bytes);}
}
定义了一个宏定义来实现log测试和应用的分离
/*** @brief 输出日志任务* @param argument */
void USER_LOG_Task(void *argument)
{for (;;){#ifdef USER_LOG_ENABLEFDCAN_printf("\n Hellow world!\n");#endifosDelay(1000);}
}
实验效果

参考文章
STM32 printf 重定向到USB-CDC
相关文章:
STM32 printf 重定向到CAN
最近在调试一款电机驱动板 使用的是CAN总线而且板子上只有一个CAN 想移植Easylogger到上面试试easylogger的效果,先实现pritnf的重定向功能来打印输出 只需要添加以下代码即可实现 代码 #include <stdarg.h> uint8_t FDCAN_UserTxBuffer[512]; void FDCAN_p…...
jmeter性能优化之mysql监控sql慢查询语句分析
接上次博客:基础配置 多用户登录并退出jmx文件:百度网盘 提取码:0000 一、练习jmeter脚本检测mysql慢查询 随意找一个脚本(多用户登录并退出),并发数设置300、500后分别查看mysql监控平台 启动后查看,主要查看mysql…...
海南聚广众达电子商务咨询有限公司引领行业变革
在数字化浪潮席卷全球的今天,电商行业正以前所未有的速度发展。海南聚广众达电子商务咨询有限公司,凭借其在抖音电商领域的深厚积累和不断创新,正逐步成为行业的佼佼者。这家以专注、专业、专注为核心理念的公司,不仅为客户提供全…...
Unity API学习之资源的动态加载
资源的动态加载 在实际游戏开发的更新换代中,随着开发的软件不断更新,我们在脚本中需要拖拽赋值的变量会变空,而要想重新拖拽又太花费时间,因此我们就需要用到Resources.Load<文件类型>("文件名")函数来在一开始…...
C++算法——回溯
回溯算法 实现思想 先看一个实例: //暴力枚举的算法 int n 5; for (int a 1; i < n; i) {for (int b 1; b < n; b){for (int c 1; c < n; c){for (int d 1; d < n; d){for (int e 1; e < n; e){//判断 abcde 是否互补相同if (a ! b &&a…...
java的深拷贝和浅拷贝
总结: 深拷贝:无论是基本类型还是引用类型都会创建新的实例。 浅拷贝:对于基本类型就是复制其值,对于引用类型则是复制了指向这些数据类型的内存地址。 浅拷贝(Shallow Copy) 浅拷贝是指在创建新对象时&am…...
AI产品经理,应掌握哪些技术?
美国的麻省理工学院(Massachusetts Institute of Technology)专门负责科技成果转化商用的部门研究表明: 每一块钱的科研投入,需要100块钱与之配套的投资(人、财、物),才能把思想转化为产品&…...
同三维T80004EHL-W-4K30 4K HDMI编码器,支持WEBRTC协议
输入:1路HDMI1路3.5音频,1路HDMI环出1路3.5音频解嵌输出 4K30超高清,支持U盘/移动硬盘/TF卡录制,支持WEBRTC协议,超低延时,支持3个点外网访问 1个主流1个副流输出,可定制选配POE供电模块,WEBR…...
Hi3861 OpenHarmony嵌入式应用入门--点灯
本篇实现对gpio的控制,通过控制输出进行gpio的点灯操作。 硬件 我们来操作IO2,控制绿色的灯。 软件 GPIO API API名称 说明 hi_u32 hi_gpio_deinit(hi_void); GPIO模块初始化 hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val); 设置某个IO…...
SaaS案例分享:成功构建销售渠道的实战经验
面对SaaS产品推广的难题,你是否曾感到迷茫,不知如何选择有效的销售渠道?Shopify独立站联盟营销或许能为你提供新的思路。Shopify作为领先的电商解决方案提供商,其独立站功能为众多商家提供了强大的在线销售平台。而联盟营销&#…...
密钥管理简介
首先我们要知道什么是密钥管理? 密钥管理是一种涉及生成、存储、使用和更新密钥的过程。 密钥的种类 我们知道,对称密码主要包括分组密码和序列密码。但有时也可以将杂凑函数和消息认证码划分为这一类,将它们的密钥称为对称密钥;…...
2024中国应急(消防)品牌巡展成都站成功召开!
汇聚品牌力量,共同相聚成都。6月14日,由中国安全产业协会指导,中国安全产业协会应急创新分会、应急救援产业网联合主办,四川省消防协会协办的“一切为了安全”2024年中国应急(消防)品牌巡展-成都站成功举办。该巡展旨在展示中国应…...
ansible-Role角色批量按照node_export节点,并追加信息到Prometheus文件中
文章目录 剧本功能 inventory.yaml文件定义deploy.yaml角色定义node_exporter_lock角色定义任务角色main.yamlnode_exporter_tasks.yml角色触发任务notifyextra_tasks.yml角色prometheus_node_config.j2模板文件 执行命令查看变量 剧本功能 功能1: 批量执行node_ex…...
求最小公倍数 、小球走过路程计算 题目
题目 JAVA11 求最小公倍数分析:代码:大佬代码: JAVA12 小球走过路程计算分析:代码: JAVA11 求最小公倍数 描述 编写一个方法,该方法的返回值是两个不大于100的正整数的最小公倍数。 输入描述:…...
【Android面试八股文】你能说一说为什么IO是耗时操作?
IO(输入/输出)操作之所以是耗时操作,主要是由于以下几个原因: 1. 物理设备的限制 机械动作:传统的硬盘驱动器(HDD)包含旋转的磁盘和移动的磁头,以读取或写入数据。这些机械动作需要时间完成。虽然固态硬盘(SSD)没有机械部件,但它们仍然受到电子信号传输速度的限制。…...
怎样增强 CLike 游戏的社交功能,促进玩家之间的互动和交流?
要增强CLike游戏的社交功能,以促进玩家之间的互动和交流,可以考虑以下几个方面: 添加聊天功能:在游戏中加入实时聊天功能,让玩家可以在游戏内互相交流。可以通过文本聊天或者语音聊天来实现。 社交平台集成࿱…...
12_YouOnlyLookOnce(YOLOv3)新一代实时目标检测技术
1.1 回顾V1和V2 V1:05_YouOnlyLookOnce(YOLOV1)目标检测领域的革命性突破-CSDN博客 V2:07_YouOnlyLookOnce(YOLOv2)Better,Faster,Stronger-CSDN博客 1.2 简介 YOLOv3(You Only Look Once version 3)是…...
安装 Nuxt.js 的步骤和注意事项
title: 安装 Nuxt.js 的步骤和注意事项 date: 2024/6/17 updated: 2024/6/17 author: cmdragon excerpt: Nuxt.js在Vue.js基础上提供的服务器端渲染框架优势,包括提高开发效率、代码维护性和应用性能。指南详细说明了从环境准备、Nuxt.js安装配置到进阶部署技巧&…...
【perl】环境搭建
1、Vscode Strawberry Perl 此过程与tcl环境搭建很类似,请参考我的这篇文章: 【vscode】 与 【tclsh】 联合搭建tcl开发环境_tclsh软件-CSDN博客 perl语言的解释器可以选择,strawberry perl。Strawberry Perl for Windows - Releases。 …...
【车载音视频AI电脑】全国产海事船载视频监控系统解决方案
海事船载视频监控系统解决方案针对我国快速发展的内河航运、沿海航运和远洋航运中存在的航行安全和航运监管难题,为船舶运营方、政府监管部门提供一套集视频采集、存储、回放调阅为一体的视频监控系统,对中大型船舶运行中的内部重要部位情况和外部环境进…...
Go语言极简Web框架Meridian:依赖注入与清晰架构实践
1. 项目概述:一个“极简”的现代Web应用框架最近在GitHub上闲逛,又看到了一个名为rynfar/meridian的项目。点进去一看,简介写着“A modern web framework for building APIs and web applications in Go”。说实话,现在Go语言的We…...
量化研究实战:从数据到策略的Python框架与机器学习应用
1. 从零到一:量化研究实战框架搭建心路如果你和我一样,对金融市场既着迷又敬畏,总想用理性和数据去解读那些看似随机的价格波动,那么“量化研究”这个词对你来说一定不陌生。它听起来高大上,仿佛是高学历精英们在华尔街…...
什么是dapr?为什么要使用它
官方文档https://docs.dapr.io/zh-hans/developing-applications/building-blocks/ 介绍 dapr是一个分布式运行时(Distributed Application Runtime)是一个开源项目,它把构建微服务的最佳实践沉淀为开发者可直接调用的标准化API,…...
告别本地卡顿!用Pycharm 2023.3远程连接Spark集群,5步搞定开发环境
告别本地卡顿!用Pycharm 2023.3远程连接Spark集群,5步搞定开发环境 当你的笔记本风扇开始像喷气发动机一样轰鸣,而PySpark脚本才处理到第3万条数据时,就该考虑换个战场了。去年我用一台16GB内存的MacBook Pro分析800万条电商日志&…...
eFuse 的核心作用
它触及了设备安全性的核心机制——eFuse。 简而言之:一台已经烧录(blown)了 eFuse 的设备,其安全机制与未烧录 eFuse 的设备有本质区别,你之前在非 eFuse 设备上成功的代码修改(强制 check_key 返回 0)很可能在烧录了 eFuse 的设备上无效。 以下是详细解释: eFuse 的…...
告别卡顿与臃肿:两种高效获取MATLAB Online账号的实战指南
1. 为什么你需要MATLAB Online? 如果你正在读这篇文章,大概率是因为你的电脑跑不动桌面版MATLAB了。我完全理解这种痛苦——当年我的老笔记本打开MATLAB要三分钟,运行个简单脚本风扇就狂转,更别提安装时那令人绝望的20GB硬盘占用…...
逆向工程师的视角:如何用Windbg双机调试分析一个未知Windows驱动(实战案例解析)
逆向工程师的视角:如何用Windbg双机调试分析未知Windows驱动 在安全研究和恶意代码分析领域,逆向工程师常常需要面对未知的Windows驱动程序。这些驱动可能是第三方闭源组件,也可能是潜在的恶意软件载体。与传统的驱动开发调试不同,…...
从入门到精通:Systrace性能分析实战指南
1. Systrace入门:认识Android性能分析利器 第一次打开Systrace报告时,我完全被那些彩色线条和条形图搞懵了。这玩意儿看起来就像地铁线路图一样复杂,但别担心,它其实是Android开发者最得力的性能分析助手。Systrace是Android SDK自…...
从零部署Claude 3.5 Sonnet私有化实例:NVIDIA A10/A100实测吞吐对比、Token缓存优化与RAG集成避坑指南(含GitHub开源脚本)
更多请点击: https://intelliparadigm.com 第一章:Claude 3.5 Sonnet新功能详解 Anthropic 正式发布的 Claude 3.5 Sonnet 在推理速度、多模态理解与工具调用能力上实现了显著跃升。相比前代,其上下文窗口稳定支持 200K tokens,…...
【信息科学与工程学】【通信工程】第十篇 光通信工程
光通信理论基础、材料基础和算法基础分级分类表 一、理论基础 1. 电磁场理论 麦克斯韦方程组 微分形式、积分形式 本构关系 边界条件 波动方程 亥姆霍兹方程 平面波解 高斯光束 偏振光学 偏振态表示(Jones矢量,Stokes参数) 偏振演化(琼斯矩阵,穆勒矩阵) 双折射…...
