首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
C语言中如何实现数据帧封装与解析
2
【熟视C语言】如何快速的了解一个库函数(C语言讲解,以string.h中的部分库函数为例)
3
C语言代码封装MQTT协议报文,了解MQTT协议通信过程
4
NV12数据格式转H265编码格式实现过程
5
基于Modbus协议实现Openplc与Kingview的仿真通讯与模拟测试
6
onvif协议最新版本_接口协议测试工具
7
linux后台开发常用调试工具
8
C/C++开发人员要了解的几大著名C/C++开源库[通俗易懂]
9
适用于嵌入式环境的加速计算库
10
Linux下WebRTC框架Janus编译过程
11
探索嵌入式应用框架(EAF)
12
[C&C++]联合体union的特征及用其进行传输
13
联合体和结构体一起解析数据
14
国标GB28181协议客户端开发(四)实时视频数据传输
15
6.1 C/C++ 封装字符串操作
17
C语言进阶——自定义类型
18
干货 | 结构体、联合体嵌套使用的一些实用操作
19
C语言的面向对象编程
20
QT应用编程: 编写低功耗BLE蓝牙调试助手(Android系统APP)
21
设计模式之接口隔离原则C++实现
22
嵌入式软件开发的框架思维
23
通过面向对象设计串口协议
24
QT应用编程: 开发串口调试助手
25
一种高效的串口自定义16进制通信协议的嵌入式应用开发解决方案
26
嵌入式中状态机的几种骚操作
27
【干货】用FreeRTOS搭建Event-Driven应用框架
28
嵌入式开发基础之任务管理(线程管理)
29
SIP菜鸟如何学SIP
30
Linux下使用libuvc读取控制USB免驱摄像头
31
Linux 使用strace命令查找进程卡死原因
32
84-OOP之组合
33
如何调试多线程程序
34
GDB多线程调试分析
35
GDB多线程多进程调试
36
一个简单实用的线程基类
37
OpenThread是世界上最舒心的跨平台多线程并发库
38
OpenMiniServer是一个超迷你、 超易用的C++高并发跨平台服务器框架
39
OpenSocket是跨全平台的高性能高并发网络库
40
一个C++多线程TCP服务Demo
41
一文搞懂网络库的分层设计!
42
实现一个接收多路RTP流,输出一路RTMP流的简单MCU
43
谈谈嵌入式应用软件人机界面开发的菜单框架编写
44
union 的概念及在嵌入式编程中的应用
45
让终端支持https,移植OpenSSL和libcurl到嵌入式linux,遇到的问题总结
46
日常工作中的设计:解耦和封装
47
一种简易的嵌入式设备系统日志记录方法
48
PLC和计算机通信的数据采集方法和传输监控的实现(1)
49
C++随笔(五)三种实现串口通信的方式
50
开源一个自己写过的MQTT 客户端调试工具

C语言的面向对象编程

面向对象编程是一种思想,并非一定要用哪种语言去实现,c语言也可以实现面向对象编程。通过结构体和指针就可以实现。

C语言实现各部分功能

面向对象主要的有封装、继承、多态。下面说下如何用C语言实现。

封装

封装的作用是减少对外的接口

代码语言:javascript
复制
typedef struct {	UART_X_Information UART_X; //	uint16_t data_num;	uint8_t *receive_data;	uint32_t EventValue;	UART_HandleTypeDef huart;	uint8_t (*frame_data);	uint32_t frame_num;	uint32_t frame_num_all;	uint8_t send_num;	struct UARTTable *vptr; // 虚表指针} UART_X_MIX;

struct UARTTable{
    uint8_t* (*UARTx_Rx)(UART_X_MIX *this); // 虚函数指针
    uint32_t (*UARTx_Tx)(UART_X_MIX *this); // 虚函数指针  发送串口数据
    uint32_t (*UARTx_Tx_Frame)(UART_X_MIX *this); // 虚函数指针  组帧数据
};

如以上代码,包含要使用到的参数,和一个指向包含函数指针的结构体,其中的函数均使用结构体中的内容作为参数。这样就减少了与外部的联系,尽量做到高内聚、低耦合。

继承

继承用于扩展,比如要在之前的功能上增加新的东西,就可以新定义一个结构体,新的结构体包含老的结构体

代码语言:javascript
复制
typedef struct {
	UART_X_MIX UART_X_MIX; //
	uint16_t test;
	struct test *vptr2; // 虚表指针
} UART_X_MIX_test;struct test {    uint8_t* (*test1)(UART_X_MIX_test*this); // 虚函数指针};

这样就可以使用上一级节点的功能(父节点)。

多态

多态是根据使用要求的不一样,动态实现不同功能。具体的实现是对上述的虚表指针(struct UARTTable *vptr)赋予不同的地址(不同函数)。这样就实现了动态变化功能。

整体编程思路

1 定义一个包含所需变量和虚表指针(可以为函数指针,或者包含函数指针的结构体)的结构体。

代码语言:javascript
复制
typedef struct {
	uint8_t send_num;
        ...
	struct UARTTable *vptr; // 虚表指针
} UART_X_MIX;

struct UARTTable{
    uint8_t* (*UARTx_Rx)(UART_X_MIX *this); // 虚函数指针
    ...
};

2 编写结构体赋值函数

代码语言:javascript
复制
uint8_t *UARTx_Rx(UART_X_MIX * this){     ...}void UART1_TX_INIT(UART_X_MIX *this,send_num){	static struct UARTTable UARTTable = {UARTx_Rx};	// 让虚表指针指向上面这个虚表
	this->send_num=  send_num;	this->vptr = &UARTTable;}

使用UART6_TX_INIT()函数对结构体赋值

3 结构体赋值,运行函数

代码语言:javascript
复制
UART1_X_INIT(&UART1_X_MIX,send_num);UART1_X_MIX.vptr->UARTx_Rx(&UART1_X_MIX);

先给结构体赋值,然后运行函数。

下一篇
举报
领券