发布时间:2026/9/3 7:01:11
CANopen学习记录(三) 现在开始学习使用如何使用canfestival去移植CANopen。直接去CANopen的官网去下载https://canfestival.org/code.html.en或者GitHub - ljessendk/CanFestival · GitHub。有时候官方下载不了挂梯子也没有用真的是恶心(一)开始移植Canfestival源码下面我使用了STM32CubeMX创建了一个新的工程将从github上面下载的canfestival源码下的所有被圈到的源文件和头文件全部放到新建的工程里面。最终大概是这个样子至此和CANopen所有相关的代码都添加进工程里面了接下来我们需要开始修改源码去适配CANopen。(1)报错..\Canfestival\Inc\config.h(34): error: #5: cannot open source input file avr/io.h: No such file or directory在config.h文件中把下面图片我28~47行全屏蔽掉(2)报错..\Canfestival\Inc\applicfg.h(29): error: #5: cannot open source input file avr/interrupt.h: No such file or directory把所有涉及到avr/interrupt.h文件全部屏蔽掉(3)报错..\Canfestival\Inc\objdictdef.h(99): error: #3092: anonymous unions are only supported in --gnu mode, or when enabled with #pragma anon_unions是因为编码器版本太旧导致的在魔术棒-Target下替换更新版本的编译器即可。(4)报错CANopen\CANopen.axf: Error: L6218E: Undefined symbol start_and_seek_node (referred from dcf.o).和CANopen\CANopen.axf: Error: L6218E: Undefined symbol start_node (referred from dcf.o).是因为编译器不支持inline,在其前面添加static即可决绝(5)报错CANopen\CANopen.axf: Error: L6218E: Undefined symbol canSend (referred from emcy.o).是因为你没有支持CAN控制器需要在STM32CubeMx中添加CAN控制器有可能会出现STM32CubeMX生成代码后编译发现canfestival里面自带的CAN.h文件与STM32CubeMx生成的冲突了。修改修改一下文件名。有些工程生成的配置全部集成到main.c文件里面了这种情况没有出现冲突就不需要改了。目前我的工程是没有出现冲突的然后在工程里面添加canfestival.c文件在文件中添加如下内容#include stm32f1xx_hal.h #include canfestival.h #include testslave.h #include can.h #include timerscfg.h extern CAN_HandleTypeDef hcan; CAN_TxHeaderTypeDef TxHeader; CAN_RxHeaderTypeDef RxHeader; uint8_t CanFestival_Can_Init(void) { CAN_FilterTypeDef sFilterConfig; /* Configure the CAN Filter */ sFilterConfig.FilterBank 0; sFilterConfig.FilterMode CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale CAN_FILTERSCALE_32BIT; sFilterConfig.FilterIdHigh 0x0000; sFilterConfig.FilterIdLow 0x0000; sFilterConfig.FilterMaskIdHigh 0x0000; sFilterConfig.FilterMaskIdLow 0x0000; sFilterConfig.FilterFIFOAssignment CAN_RX_FIFO0; sFilterConfig.FilterActivation ENABLE; sFilterConfig.SlaveStartFilterBank 14; if (HAL_CAN_ConfigFilter(hcan, sFilterConfig) ! HAL_OK) { /* Filter configuration Error */ Error_Handler(); } /* Start the CAN peripheral */ if (HAL_CAN_Start(hcan) ! HAL_OK) { /* Start Error */ Error_Handler(); } /* Activate CAN RX notification */ if (HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING) ! HAL_OK) { /* Notification Error */ Error_Handler(); } /* Configure Transmission process */ return 0; } /** * brief Rx Fifo 0 message pending callback in non blocking mode * param CanHandle: pointer to a CAN_HandleTypeDef structure that contains * the configuration information for the specified CAN. * retval None */ void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *CanHandle) { Message RxMSG ; HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, RxHeader, RxMSG.data); RxMSG.cob_id (uint16_t)(RxHeader.StdId); if( RxHeader.RTR CAN_RTR_REMOTE ) { RxMSG.rtr 1; } else { RxMSG.rtr 0; } RxMSG.len RxHeader.DLC; canDispatch(TestSlave_Data, (RxMSG)); } uint8_t canSend(CAN_PORT notused, Message *message) { CanTxMsg TxMessage; uint32_t TxMailbox 0; TxHeader.DLC message-len; memcpy(TxMessage.Data, message-data, message-len); TxHeader.IDE CAN_ID_STD; TxHeader.StdId message-cob_id; TxHeader.RTR (message-rtr CAN_RTR_DATA) ? 0 : 2; while(( HAL_CAN_AddTxMessage(hcan,TxHeader,TxMessage.Data,TxMailbox)!HAL_OK)) { return 0; } return 1; } void setTimer(TIMEVAL value) { TIM2-ARR TIM2-CNT value; } TIMEVAL getElapsedTime(void) { return TIM2-CNT; }#ifndef __CAN_CANFESTIVAL__ #define __CAN_CANFESTIVAL__ #include applicfg.h #include stdint.h typedef struct { uint32_t StdId; /*! Specifies the standard identifier. This parameter can be a value between 0 to 0x7FF. */ uint32_t ExtId; /*! Specifies the extended identifier. This parameter can be a value between 0 to 0x1FFFFFFF. */ uint8_t IDE; /*! Specifies the type of identifier for the message that will be transmitted. This parameter can be a value of ref CAN_identifier_type */ uint8_t RTR; /*! Specifies the type of frame for the message that will be transmitted. This parameter can be a value of ref CAN_remote_transmission_request */ uint8_t DLC; /*! Specifies the length of the frame that will be transmitted. This parameter can be a value between 0 to 8 */ uint8_t Data[8]; /*! Contains the data to be transmitted. It ranges from 0 to 0xFF. */ } CanTxMsg; // --------- to be called by user app --------- void initTimer(void); UNS8 canSend(CAN_PORT notused, Message *m); UNS8 canChangeBaudRate(CAN_PORT port, char* baud); uint8_t CanFestival_Can_Init(void); #endif如果最后只剩下一个报错../Canfestival/Src/canfestival.c(3): error: testslave.h file not found说明移植成功了这个testslave.h是在配置对象字典的时候生成的。(二)生成对象字典前面编译只剩下一个报错了这个报错可能是确实对象字典导致的https://www.python.org/ftp/python/2.7.15/python-2.7.15.amd64.msiwxPython2.8-win64-unicode-2.8.12.1-py27.exePython和wxpython(Python的图形界面)安装按照默认的方式安装即可。上面是这两个软件的下载链接。上面的两个软件都安装完成后就到CanFestival-master-objdictgen目录下解压Gnosis_Utils-current.tar.gz这个压缩包。Gnosis_Utils-current目录下有gnosis目录将这个文件夹拷贝到CanFestival-master-objdictgen目录下。完成后双击objdictedit.py文件打开软件。下面是安装过程踩到的坑(1)打开objdictedit.py 报错n objdictedit.py install Traceback (most recent call last): File objdictedit.py, line 24, in moduleimport wx File C:\Python27\lib\site-packages\wx-2.8-msw-unicode\wx\__init__.py, line 45, in modulefrom wx._core import *File C:\Python27\lib\site-packages\wx-2.8-msw-unicode\wx\_core.py, line 4, in moduleimport _core_ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。这种情况是因为安装的Python版本和wxpython版本不匹配导致的刚刚开始我安装的是Python2.7.10和wxPython2.8-win64-unicode-2.8.12.1-py27。打开软件会闪退有的人的电脑安装这两个版本就可以。可能是不同的Window版本对于的Python版本也有差异导致的。遇到这种情况大概率是Python版本的问题或者是Python版本是对于的你的电脑的环境变量里面没有填Python的路径添加进去导致的。(2)错误: class wx. core PyAssertionError: Ct assertion Assert failure faled at. Mlsrcmswfontcpp (647) in waNativeFontinfo:Setfamiy0:invalid font family遇到这种情况是因为wxpython版本导致的可能是版本太新了重新安装一下旧的版本尝试一下一般都可以解决。上面的问题都解决之后下面我们开始创建对象字典去简单测试把这里的变量名修改一下即可。目前已经编译通过了目前我手上还没有测试条件等待我的USB转CAN到了之后再补一篇文档吧

相关新闻

2026/9/3 6:57:31

YOLOv8垃圾分类目标检测实战:从数据标注到模型部署全流程

简介:本资源是一套基于YOLOv8的轻量化垃圾分类目标检测实战项目,面向深度学习初学者、计算机视觉方向本科生及毕业设计选题者,解决真实场景下垃圾图像多类别识别与定位难题。压缩包共4个文件(2个Python脚本、1个YOLO格式数据集ZIP…

2026/9/3 6:57:31

基于物联网的菇房环境管理系统源码+文档+讲解视频

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/9/3 6:57:31

基于灰狼优化算法的CNN超参数自动调优:原理、实现与应用

简介:本资源是基于卷积神经网络(CNN)与灰狼优化算法(GWO)融合建模的Matlab实现方案,面向计算机、电子信息工程及数学等专业的本科生,适用于课程设计、期末大作业及毕业设计中智能算法与深度学习…

2026/9/3 6:57:31

从报名到实战:系统化备战电竞赛事的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 6:57:31

腾势Z9GT无人漂移技术解析:扭矩矢量控制与线控底盘原理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 6:52:31

基于BERT的细粒度文本情绪风格分类实战:从原理到部署

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/1 16:02:17

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/2 9:00:32

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/2 8:41:06

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/3 0:02:06

零基础装 OpenClaw 小龙虾 AI:Windows 一键部署教程与避坑要点

Windows 部署 OpenClaw 完整教程|本地 AI 智能体 5 分钟落地,环境配置一次搞定 版本说明:Windows 3.1.0 / Mac 2.7.9 写在前面 近两年开源 AI 领域有一款被称作「数字员工」的工具持续走热,它就是 OpenClaw,圈内人更习…

2026/9/3 0:02:06

Hermes Agent 本地部署新方案:Windows 整合包减少依赖报错

Windows 本地部署 Hermes 太麻烦?这版一键包 5 分钟快速跑通 很多人想体验 Hermes Agent,但真正开始部署时,往往会卡在环境配置这一步。 需要安装各类依赖、调试运行环境、处理路径问题,还容易遇到命令行报错、系统拦截、文件缺…

2026/9/3 0:02:06

实测 OpenClaw 一键包,5 分钟完成本地自动化环境搭建

OpenClaw 本地 AI 自动化工具部署指南|使用一键包规避环境配置难题 痛点:部署 AI 自动化工具常常要处理 Python、Node.js 各类依赖,版本冲突、环境配置耗费大量时间,OpenClaw 提供一键安装包,降低部署门槛。 适配系统&…

2026/9/2 1:15:22

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/2 1:15:22

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/2 1:15:20

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…