[经验分享] 通过一个实例,分享一个使用C语言实现模拟面向对象的编程思路

[复制链接]
2504|32
小海师 发表于 2025-9-4 09:06 | 显示全部楼层 |阅读模式
最近在做一个项目,中间有个软件的要求是使用一个mcu来实现控制三个步进电机,于是我就想,若是对这三个步进电机的控制引脚分别进行配置等操作代码的整体结构会变得十分繁琐,我能不能用类似于stm32标准库那样的写法,就是通过typedef来定义一个结构体,这个结构体中包含了我所控制的对象的所有的属性,在需要实现对对象的控制时,只需要来通过给这个结构体的不同成员传递参数,然后调用提前写好的初始化的函数,就很快的完成了不同的电机控制的初始化配置,后面需要其他功能也是基于这个结构体去进行扩展。想到这里,我不禁想到了之前了解过的一个词语叫“面向对象编程(OOP)”,后来想来两者也确实有一定的相似之处,且看本篇文章的介绍。

一、分析并确定控制一个步进电机需要哪些MCU资源
最简单的情况下情况下,步进电机的驱动会带有一个使能引脚(EN)、一个步数引脚(STP)、一个方向引脚(DIR),其中使能引脚与方向引脚都是通过高低电平来控制电机的运动,而步数引脚则是需要通过输出一定脉冲数的pwm波来控制步进电机的运动。分析至此,我们可以基本确定需要的基本资源如下:

使能GPIO,普通GPIO,模式选择为推挽输出模式即可

方向GPIO,普通GPIO,模式选择为推挽输出模式即可

单片机定时器的某通道对应的GPIO口,定时器模式可选择为pwm输出模式或者输出比较模式(我选的是输出比较模式)

二、确定三个结构体
在这里我定义了三个结构体,一个是Step_Motor_Init_Struct,此结构体用于对控制电机的引脚进行一定的初始化配置,其成员包含了控制电机所用的GPIO和PIN和TIM等等;第二个结构体是Motor_Acc_Aata,此结构体主要是为了服务后边的电机控制的加减速算法而用,主要与算法相关,此处不过多介绍;第三个结构体Step_Motor_Struct,这个结构体在包含前两个结构体的前提下又新增了关于电机运动状态相关的众多成员变量,这些成员可以用作以后在控制算法中的状态机的实现。具体的配置情况如下图:










补充:此处还对步进电机运动状态和方向的情况定义了两个枚举型变量,如下图




三、具体的函数实现
此处以初始化函数为例,讲解具体的函数实现思路




如图所示,初始化函数传入的参数是初始化结构体的指针,在对不同的结构体配置的情况下能够实现不同的配置情况,这样我们可以实现一套代码来控制多个相同属性的对象,这有点类似于OOP中“封装性”的实现。(此处只展示部分的初始化函数,其余的部分都是调用stm32标准库的一些初始化函数对我们要控制的对象进行初始化)。

实际使用流程是:先定义一个Step_Motor_Init_Struct的结构体变量,将这个结构体的各个成员赋值之后,再调用初始化函数即可(如下图示例)。




四、总结
这种写法通过结构体封装状态 + 函数操作结构体,同时管理多个电机时,每个电机的状态通过各自的 Step_Motor_Struct 实例隔离,但是由于 C 语言本身不支持继承和多态,且缺乏访问控制,因此不能称为严格的面向对象编程,更准确地说,是基于结构化编程的 “对象式” 封装。

最后,各位有什么别的看法,不妨在评论区讨论一二。
————————————————
版权声明:本文为CSDN博主「laplace_gjn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2301_80796910/article/details/150118012

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
everyrobin 发表于 2025-9-6 11:23 | 显示全部楼层
主要是通过结构体 、函数指针、封装机制和继承模拟等技术手段
louliana 发表于 2025-9-6 20:17 | 显示全部楼层
C 语言本身不是面向对象的语言              
jtracy3 发表于 2025-9-8 20:10 | 显示全部楼层
结构体可以看作是“类”的雏形,而结构体变量则是“对象”。
geraldbetty 发表于 2025-9-9 12:59 | 显示全部楼层
重构现有代码,使其更模块化、面向对象化​
qiufengsd 发表于 2025-9-9 20:09 | 显示全部楼层
结构体(struct)+ 函数指针(成员方法)
cashrwood 发表于 2025-9-10 10:53 | 显示全部楼层
用 ​​函数指针​​,指向不同的函数实现
uptown 发表于 2025-9-10 14:23 | 显示全部楼层
子结构体包含父结构体作为第一个成员​
ulystronglll 发表于 2025-9-10 19:04 | 显示全部楼层
结构体 + 相关操作函数​​
将数据与函数捆绑
fengm 发表于 2025-9-10 20:47 | 显示全部楼层
​​通过一些结构体、函数指针、宏等技巧,完全可以在 C 中模拟出面向对象的核心特性
hilahope 发表于 2025-9-13 11:34 | 显示全部楼层
通过结构体嵌套实现代码复用              
geraldbetty 发表于 2025-9-13 12:50 | 显示全部楼层
先学会用结构体 + 函数封装模块,对外提供清晰接口
modesty3jonah 发表于 2025-9-13 20:47 | 显示全部楼层
在C语言中,可以通过结构体和函数来实现封装。
mattlincoln 发表于 2025-9-13 21:39 | 显示全部楼层
通过函数指针模拟              
qiufengsd 发表于 2025-9-14 08:58 | 显示全部楼层
C语言本身不支持面向对象编程              
hearstnorman323 发表于 2025-9-14 09:45 | 显示全部楼层
通过结构体嵌套模拟继承关系。              
ulystronglll 发表于 2025-9-14 10:22 | 显示全部楼层
通过结构体、函数指针和合理的代码组织,可以在C语言中模拟面向对象的编程思路
pixhw 发表于 2025-9-14 11:18 | 显示全部楼层
所有操作通过函数接口进行              
jonas222 发表于 2025-9-14 11:40 | 显示全部楼层
结构体 + 函数指针              
sdCAD 发表于 2025-9-14 14:11 | 显示全部楼层
大部分代码仍用 C,但希望代码更模块化、可复用、易维护
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

242

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部