回调函数在命令解析中的应用

开发 前端
这篇文章主要讲解回调函数在命令解析中的应用,一般命令中都会有功能码,用于区分这条命令到底执行的什么动作,命令字后面的数据的意义。在这种场景中,使用回调函数是一个不错的选择。

回调函数

关于回调函数,在之前的文章《回调函数》已经详解讲解过了,这个文章不再讲解,不太懂的同学请看之前的文章《回调函数》。在之前讲解回调函数中就使用串口作为示例,使用回调函数可以方便封装通讯库,芯片/模块厂家的SDK和部分开源库经常这样做,这样可以实现模块间的解耦,模块化编程。

这篇文章主要讲解回调函数在命令解析中的应用,一般命令中都会有功能码,用于区分这条命令到底执行的什么动作,命令字后面的数据的意义。在这种场景中,使用回调函数是一个不错的选择。

经典写法

在命令解析中,经典的写法使用switch case语句。这种写法很经典,也很基础,即使是刚学C语言的小白也能看懂。

void poll_task(rt_uint8_t cmd, rt_uint8_t *msg, uint8_t len){
switch (cmd){
case cmd1:
func1();
break;
case cmd2:
func2();
break;
case cmd3:
func3();
break;
case cmd4:
func4();
break;
default:
default_func();
break;
}
}

他的缺点是,如果在增加一个功能码需要修改poll_task函数,增加case语句。如果要统计功能码的个数,只能手动数。

使用回调函数和功能码绑定的方式会更加方便一些,结构更加清晰。

回调函数

功能码和回调函数绑定方式

typedef struct
{
rt_uint8_t CMD;
rt_uint8_t (*callback_func)(rt_uint8_t cmd, rt_uint8_t *msg, uint8_t len);
} _FUNCCALLBACK;

_FUNCCALLBACK callback_list[]=
{
{ cmd1,func_callback1},
{ cmd2,func_callback2},
{ cmd3,func_callback3},
{ cmd4,func_callback41},

...
};
void poll_task(rt_uint8_t cmd, rt_uint8_t *msg, uint8_t len){
int cmd_indexmax = sizeof(callback_list) / sizeof(_FUNCCALLBACK);
int cmd_index = 0;

for (cmd_index = 0; cmd_index < cmd_indexmax; cmd_index++)
{
if (callback_list[cmd_index].CMD == cmd)
{
if(callback_list[cmd_index])
{
/* 处理逻辑 */
callback_list[cmd_index].callback_func(cmd,msg,len);
}
}
}
}

这种方式优点是:提供了一个“模板”,加入我们增加一个功能码,我们只需要在结构体中新增命令和回调函数即可,主运行逻辑不需要去修改,大大降低代码的可维护性。

比起经典的方法,将功能码和回调函数绑定的方式,代码更模块化,起到代码结构将解耦的目的,由于增加一个功能码主逻辑没有修改,这样就不会影响到其他功能码执行函数。

更进一步,将命令解析放入一个队列,再用这种方法解析命令,这样就能封装成一个通用的模块,即使更换单片机型号,也能很快的移植过去,并且保证代码稳定运行。

责任编辑:姜华 来源: 知晓编程
相关推荐

2021-01-14 07:52:24

JavaScript回调函数

2012-02-01 10:33:59

Java

2009-07-31 16:25:29

C#回调函数API应用

2011-06-15 11:05:14

C语言回调函数

2011-05-20 17:59:06

回调函数

2023-11-10 16:31:31

2015-10-26 09:25:42

2011-05-20 17:19:25

回调函数

2009-08-12 10:11:18

C# 回调函数

2011-07-25 14:32:40

Cocoa 框架 函数

2019-11-05 10:03:08

callback回调函数javascript

2022-04-12 08:30:52

回调函数代码调试

2010-02-04 16:07:39

C++回调函数

2009-08-19 17:10:09

C#回调函数

2009-11-04 11:32:20

VB.NET回调函数

2010-03-15 10:24:20

Python函数变量

2022-03-08 11:17:54

函数指针回调函数C语言

2023-04-18 08:10:10

2010-01-06 16:40:11

.Net Framew

2018-11-29 08:00:20

JavaScript异步Promise
点赞
收藏

51CTO技术栈公众号