MSH控制台添加带参命令

前言:之前的一篇文章分享了移植RT-Thread和其最具吸引力的FinSH控制台。但是没有讲详细的添加命令到控制台上,直到最近笔者在对外输出带参命令的时候发现参数进去后是乱码的,所以打算把坑记录一下

添加MSH命令的代码规则(C)

一般来说导出函数到MSH命令列表非常简单,调用MSH_CMD_EXPORT宏命令即可

  • 简单命令(不带参数)

    在该情况下,不通过控制台传入参数,所以对函数的形式没有要求,如下是一个对外提供PWM使能的命令demo:

    1
    2
    3
    void enablePWM(void);   //函数声明

    MSH_CMD_EXPORT(enablePWM,enable the PWM ouput of High-Res timer); //导出函数到MSH命令列表
  • 带参命令

    聪明的RTT开发者们为了简化程序调用开销以及强的鲁棒性,带参函数在声明时必须使用标准的多参数C形式声明

    1
    int FunctionName(int argc,char ** argv);

    下面举一个导出改变PWM占空比的demo:

    1
    2
    3
    4
    5
    6
    7
    8
    int setPWM(int argc,char** argv)    //标准C多参数形式
    {
    int duty ; //解析出的占空比存储空间
    sscanf(argv[1],"%d",&duty); //字符串转数字
    setPWM_Duty(duty); //真正的设置PWM占空比API
    }

    MSH_CMD_EXPORT(setPWM,set the duty of High-Res PWM); //导出函数

    注意!⚡在使用多参数形式声明时,传入的参数个数argv为“参数个数+1”,为什么要+1呢?因为后面的argv参数字符串列表中,第一个字符串是函数名字!然后是传入的参数的字符串形式!

    笔者被这个坑了好久,直接调用argv[0]以为就是第一个参数。而且要注意传入的参数都是字符串形式,所以要做适当的数值形式转换

命令别名导出

在有些时候(常常出现)我们声明的函数名字非常非常非常…长,而FinSH控制台命令是有长度限制的!

命令长度由 finsh.h 中的宏定义 FINSH_NAME_MAX 控制,默认是 16 字节,这意味着 FinSH 命令长度不会超过 16 字节。

所以要注意,当一个函数名长度超过 FINSH_NAME_MAX 时,使用 FINSH_FUNCTION_EXPORT 导出这个函数到命令表中后,在 FinSH 符号表中看到完整的函数名,但是完整输入执行会出现 null node 错误。这是因为虽然显示了完整的函数名,但是实际上 FinSH 中却保存了前 16 字节作为命令,过多的输入会导致无法正确找到命令,这时就可以使用 FINSH_FUNCTION_EXPORT_ALIAS 来对导出的命令进行重命名

1
2
3
void thisFunctionHasVeryLongName(); //函数声明

FINSH_FUNCTION_EXPORT_ALIAS(thisFunctionHasVeryLongName, funcName, this function’s description); //命令以别名的形式导出

终端效果

resault

在本次测试中,导出的命令有:

  • PWM使能、失能
  • PWM占空比设置
  • PID参数设置
  • PID参数显示

其中最有用的莫过于PID参数设置的功能命令了,不用重复的烧录代码就可以调参了😁

PID调参代码

由于RT-Thread系统提供的打印接口只能打印出简单的字符串,所以和接收参数一样,我们需要做相应的数据形式转换

  • 设置PID参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    int setPID_P(int argc,char** argv)
    {
    float P;
    sscanf(argv[1],"%f",&P);
    buckPIDcontroller.K_p = P;
    return 0;
    }

    MSH_CMD_EXPORT(setPID_P,set P parameter of buck PID controller);

    int setPID_I(int argc,char** argv)
    {
    float I;
    sscanf(argv[1],"%f",&I);
    buckPIDcontroller.K_i = I;
    return 0;
    }

    MSH_CMD_EXPORT(setPID_I,set I parameter of buck PID controller);

    int setPID_D(int argc,char** argv)
    {
    float D;
    sscanf(argv[1],"%f",&D);
    buckPIDcontroller.K_d = D;
    return 0;
    }

    MSH_CMD_EXPORT(setPID_D,set D parameter of buck PID controller);
  • 显示PID参数

    1
    2
    3
    4
    5
    6
    7
    8
    void showPID(void)
    {
    char printCache [30]; //开辟缓存
    sprintf(printCache,"P:%8.6f,I:%6.4f,D:%6.4f\n",buckPIDcontroller.K_p,buckPIDcontroller.K_i,buckPIDcontroller.K_p); //转换为字符串
    rt_kprintf("%s",printCache); //打印字符串
    }

    MSH_CMD_EXPORT(showPID,print the parameter of buck PID controller);

Reference

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2022-2023 RY.J
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信