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+ /
注意:单行注释的添加注释与取消注释操作完全相同,但多行注释时略有不同。