ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-05-08 23:01:26  阅读:162  来源: 互联网

标签:rt index 解析 函数 cmd uint8 回调


1、回调函数

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

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

2、经典写法

在命令解析中,经典的写法使用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语句。如果要统计功能码的个数,只能手动数。

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

3、回调函数

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

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);
            }
        }
    }
}

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

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

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

 

点击查看本文所在的专辑:C语言进阶专辑

标签:rt,index,解析,函数,cmd,uint8,回调
来源: https://www.cnblogs.com/Fireflycjd/p/16247407.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有