RM电控工程讲义

HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) 是一个回调函数,通常在STM32的HAL库中用于处理CAN(Controller Area Network)接收FIFO 0中的消息。当CAN接口在FIFO 0中有待处理的消息时,这个函数会被调用。

HAL库CAN回调函数:

hcan->Instance 是一个指向CAN硬件实例的指针。当你创建并配置一个CAN句柄(CAN_HandleTypeDef)时,你会为特定的CAN硬件实例(如CAN1、CAN2等)提供这个指针。

一个CAN发送函数:

电机数据的监测:

这里的7并不代表结构体中的8个电机数据,而是代表8个电机,注意一个CAN中最多有8个电机;

所以会有这种不同序列号的电机返回电机数据,返回的是整个结构体中的8个数据:

两者的区别:

枚举:

结构体(struct)和枚举(enum)有着明显的区别:

结构体(struct)用于将不同类型的数据组合成一个单一的复合数据类型。它允许你创建一个包含多个不同类型成员的数据结构,这些成员可以是不同的数据类型,如整数、浮点数、字符数组等。结构体通常用于表示复杂的数据对象,如学生记录、员工信息等。

枚举(enum)用于定义一组命名的整数值。它允许你为整数值赋予有意义的名称,使代码更易于理解和维护。枚举通常用于表示一组固定的选项或状态,如颜色、方向、状态代码等。

结构体的成员可以是任意类型,包括基本数据类型(如int、float、char等)、复合数据类型(如数组、结构体、联合等)以及其他用户定义的类型。

枚举的成员只能是整数值,虽然你可以显式地为每个成员赋值,但底层类型始终是整数。

定义一个结构体:

typedef struct {

...........

} motor_measure_t;

在C语言中,extern关键字用于声明一个变量或函数,而不是定义它。当你需要在一个源文件中访问另一个源文件中定义的变量或函数时,你会使用extern。extern告诉编译器,变量或函数的定义在别的文件中,而不是在当前文件中。

跨文件共享变量:

当你有一个变量需要在多个源文件中共享时,你通常会在一个源文件中定义这个变量(通常在一个头文件中,并通过#include包含在其他源文件中),并在其他源文件中使用extern关键字来声明它。

// file1.c  

int sharedVariable = 42;  

 // file2.c  

extern int sharedVariable;  

 int main() {  

    printf("%d\n", sharedVariable); // 输出 42  

    return 0;  

}

函数声明:

当你想在一个源文件中调用另一个源文件中定义的函数时,你需要在调用它的源文件中使用extern来声明这个函数。

c

// file1.c  

void myFunction() {  

    printf("This is my function.\n");  }  

 // file2.c  

extern void myFunction();  

 int main() {  

    myFunction(); // 输出 "This is my function."  

    return 0;  

}

头文件中的声明:

通常,当你需要在一个头文件中声明一个变量或函数,以供多个源文件使用时,你会使用extern。这样做可以确保每个包含该头文件的源文件都能知道这个变量或函数的存在,而不需要在每个源文件中都进行定义。

避免重复定义:

如果你尝试在多个源文件中定义同一个变量或函数,链接器会报错,因为每个定义都会创建一个新的实例。通过使用extern,你可以确保变量或函数只在一个地方定义,而在所有需要它的地方进行声明。

头文件中声明其他文件中无需重新extern;

static uint8_t can_send_data[8]; 声明了一个静态的8元素数组,这个数组在整个程序的执行期间都保持其值,并且只在定义它的文件内可见。这样的数组通常用于存储需要在程序的多个函数调用之间保持其值的数据,或者用于存储仅在当前文件内部使用的数据。

在C语言中,可以使用const关键字来定义常量。一旦一个变量被声明为const,它的值就不能被修改。

尝试在一个函数被定义之前使用它,编译器会报错,因为它遵循“先定义后使用”的规则。这意味着在调用一个函数之前,编译器需要知道这个函数的签名(即函数名、返回类型以及参数类型和数量)

这种状态下是通过CAN_cmd_gimbal(3000, 5000, 0, 0);直接将电流值发送到电机上的(开环)

application\struct_typedef.h对各种数据类型做了重定义;这个文件没有.c文件

Clion:取消注释与添加注释快捷键相同

单行注释:光标定位到指定代码行Ctrl + /

多行注释:光标定位到多行注释中,或选定全部被注释的内容+Ctrl + shift+ /

注意:单行注释的添加注释与取消注释操作完全相同,但多行注释时略有不同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/391191.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法刷题:长度最小的子数组

长度最小的子数组 .题目链接题目详情算法原理滑动窗口定义指针进窗口判断出窗口 我的答案 . 题目链接 长度最小的子数组 题目详情 算法原理 滑动窗口 这道题,我们采用滑动窗口的思想来解决,具体步骤如图所示 定义指针 如图所示,两个指针都需要从左往右进行遍历,因此初始值…

Python算法100例-1.6 打鱼还是晒网

1.问题描述2.问题分析3.算法设计4.确定程序框架5.求出指定日期距离1990年1月1日的天数6.完整的程序7.补充知识点 1.问题描述 中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起便开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”…

Vue练习3:组件开发3(页面切换)

预览 ——————————————————————————————————————————— 组件文档 Pager组件 属性 属性名含义类型必填默认值current当前页码(总数据量/单页容量)Number否1total总数据量Number否0limit单页容量Number否10vis…

「算法」滑动窗口

前言 算法需要多刷题积累经验,所以我行文重心在于分析解题思路,理论知识部分会相对简略一些 正文 滑动窗口属于双指针,这两个指针是同向前行,它们所夹的区间就称为“窗口” 啥时候用滑动窗口? 题目涉及到“子序列…

AI大模型专题:工业大模型技术应用与发展报告1.0

今天分享的是AI大模型系列深度研究报告:《AI大模型专题:工业大模型技术应用与发展报告1.0》。 (报告出品方:中国信通院) 报告共计:25页 人工智能的几个相关概念 大模型:即基础模型&#xff…

爱上JVM——常见问题(一):JVM组成

1 JVM组成 1.1 JVM由那些部分组成,运行流程是什么? 难易程度:☆☆☆ 出现频率:☆☆☆☆ JVM是什么 Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写&…

批量美化图片:轻松打造统一风格的图片库!

在数字时代,图片已经成为我们生活中不可或缺的一部分。从朋友圈的分享到商业广告的展示,每一张图片都承载着我们的情感和创意。但是,你是否曾经因为大量的图片需要美化而感到头疼?是否因为繁琐的手动编辑而失去了创作的热情&#…

钡铼技术的LoRa网关实现智能电网监测与控制

钡铼技术的LoRa网关在智能电网监测与控制方面发挥着关键作用,为电力系统的安全运行和高效管理提供了重要支持。下面将详细介绍钡铼技术的LoRa网关如何实现智能电网监测与控制。 首先,钡铼技术的LoRa网关通过接入各类传感器和监测设备,实现对…

C++11---(1)

目录 一、C11简介 二、列表初始化 2.1、{ } 初始化 三、变量类型推导 3.1、auto 3.2、decltype 为什么需要decltype 四、final和override 4.1、final 4.2、override 五、默认成员函数控制 5.1、default修饰函数 5.2、delete修饰函数 六、nullptr 一、C11简介 C11是…

STM32F1 - 中断优先级

Interrupt Priority 1> STM32F103ZET6异常向量表2> 中断优先级寄存器NVIC_IPRx3> 中断优先级分组4> 例程:设置EXTI4中断优先级5> 例程:设置SysTick中断优先级6> 为什么不能用NVIC_Init()设置Systick优先级?7> 函数NVIC_…

【数据分享】2001~2020年青藏高原植被净初级生产力数据集

各位同学们好,今天和大伙儿分享的是2001~2020年青藏高原植被净初级生产力数据集。如果大家有下载处理数据等方面的问题,您可以私信或评论。 朱军涛. (2022). 青藏高原植被净初级生产力数据集(2001-2020). 国家青藏高原数据中心. …

最简单的基于 FFmpeg 的封装格式转换器(无编解码)

最简单的基于 FFmpeg 的封装格式转换器(无编解码) 最简单的基于 FFmpeg 的封装格式转换器(无编解码)正文结果工程文件下载 最简单的基于 FFmpeg 的封装格式转换器(无编解码) 参考雷霄骅博士的文章&#xf…

文件上传漏洞--Upload-labs--Pass03--特殊后缀与::$DATA绕过

方法一:特殊后缀绕过: 一、什么是特殊后缀绕过 源代码中的黑名单禁止一系列后缀名 之外的后缀,称之为‘特殊后缀名’,利用其来绕过黑名单,达到上传含有恶意代码的文件的目的。 二、代码审计 接下来对代码逐条拆解进行…

【精品】关于枚举的高级用法

枚举父接口 public interface BaseEnum {Integer getCode();String getLabel();/*** 根据值获取枚举** param code* param clazz* return*/static <E extends Enum<E> & BaseEnum> E getEnumByCode(Integer code, Class<E> clazz) {Objects.requireNonN…

【点云】生成有凹凸的平面

文章目录 前言高斯函数原理代码保存 测试测试1 &#xff1a;领域曲率代码测试2&#xff1a;高斯曲率代码 加上噪点测试1测试2 总结 前言 尝试用一些数据生成有凹凸面的点云。 我们姑且把z轴当成有凹凸的缺陷&#xff0c;x轴和y轴共同组成一个平面。 高斯函数 原理 高斯函数w…

nba2k23 中国梦之队面补名单

nba2k23 中国梦之队面补名单 提示&#xff1a;本面补为名单形式&#xff0c;内含中国国家队2000、2008、2015、2019面补名单&#xff0c;安装后多队同时存在。 下载地址&#xff1a; https://www.changyouzuhao.cn/12759.html

Python算法题集_验证二叉搜索树

Python算法题集_验证二叉搜索树 题98&#xff1a;验证二叉搜索树1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【DFS递归】2) 改进版一【DFS递归终止检测】3) 改进版二【BFS迭代终止检测】 4. 最优算法 本文为Python算法题集之一的代码示例 题…

【pyopenGL编程手册- 01/20】pyopenGL安装和简要说明

目录 一、说明二、测试系统安装的健康性三、安装64位的openGL四、写给程序员的4. 1 函数库介绍4.2 库内函数的命名 五、常见库的函数介绍5.1 OpenGL 核心库 GL5.2 OpenGL 实用库 GLU5.3 OpenGL 工具库 GLUT5.4 Windows 专用库 WGL 六、错误引发点和异常追踪6.1 错误检查开关6.…

时间序列预测模型:ARIMA模型

1. ARIMA模型原理介绍 ARIMA模型&#xff0c;全称为自回归积分滑动平均模型&#xff08;Autoregressive Integrated Moving Average Model&#xff09;&#xff0c;是一种常用的时间序列预测方法。ARIMA模型通过对时间序列数据的差分化处理&#xff0c;使非平稳时间序列数据变…

CSS之margin塌陷

margin塌陷 CSS中的外边距塌陷&#xff08;Margin Collapse&#xff09;问题是指在垂直方向上&#xff0c;当两个或多个块级元素的边距相遇时&#xff0c;它们之间的距离不是它们各自边距的总和&#xff0c;而是其中的最大值。这种现象主要出现在块级元素的上下外边距之间。 &…