打印

立创梁山派-21年电赛F题-送药小车-Finsh控制台的使用

[复制链接]
478|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
立创开发板|  楼主 | 2023-7-20 10:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 立创开发板 于 2023-7-20 10:21 编辑

#技术资源# #每日话题#

送药小车代码仓库:https://gitee.com/lcsc/medical_car
更好的观看体验请去:
https://dri8c0qdfb.feishu.cn/wiki/UjwwwO0KZii5bykPcE4cJZafnAg

送药小车立创开源平台资料:https://oshwhub.com/li-chuang-kai-fa-ban/21-dian-sai-f-ti-zhi-neng-song-yao-xiao-che



Finsh控制台的使用
简介
RT-Thread控制台是我非常喜欢的一个功能,他可以让你和嵌入式设备产生交互,可以用来调试和查看系统信息。就有点像平时Windows的cmd命令或者linux的控制台中断(Console)。
在立创梁山派中,用uart0来和PC机通讯,用串口默认参数115200-8-1-N,按下复位按键后就能看到RT-Thread的输出信息了:
 \ | /
- RT -     Thread Operating System
/ | \     4.1.1 build Jun 26 2023 17:28:18
2006 - 2022 Copyright by RT-Thread team

在计算机发展的早期,图形系统出现之前,没有鼠标,甚至没有键盘。那时候人们如何与计算机交互呢?最早期的计算机使用打孔的纸条向计算机输入命令,编写程序。后来随着计算机的不断发展,显示器、键盘成为计算机的标准配置,但此时的操作系统还不支持图形界面,计算机先驱们开发了一种软件,它接受用户输入的命令,解释之后,传递给操作系统,并将操作系统执行的结果返回给用户。这个程序像一层外壳包裹在操作系统的外面,所以它被称为 shell。
嵌入式设备通常需要将开发板与 PC 机连接起来通讯,常见连接方式包括:串口、USB、以太网、Wi-Fi 等。一个灵活的 shell 也应该支持在多种连接方式上工作。有了 shell,就像在开发者和计算机之间架起了一座沟通的桥梁,开发者能很方便的获取系统的运行情况,并通过命令控制系统的运行。特别是在调试阶段,有了 shell,开发者除了能更快的定位到问题之外,也能利用 shell 调用测试函数,改变测试函数的参数,减少代码的烧录次数,缩短项目的开发时间。
FinSH 是 RT-Thread 的命令行组件(shell),正是基于上面这些考虑而诞生的,FinSH 的发音为 [ˈfɪnʃ]。读完本章,我们会对 FinSH 的工作方式以及如何导出自己的命令到 FinSH 有更加深入的了解。
更多请查看RT-Thread官方文档中对Finsh的介绍。
Finsh控制台也是一个单独的线程。


检查送药小车的数据订阅情况


连接线连接好后,打开 03_软件工具与调试工具 介绍里面的MobaXterm,先测试电机状态信息是否正常。
  • 输入 mcn list,查看话题是否正常刷新。
  • 输入 mcn echo encoder_m1_topic,控制台将会持续显示编码器数据。
  • 转动小车前进方向右边的轮子,数值将会变化,并且因为有PID速度环的存在,电机会抵抗这个旋转。




输入ctrl+z就可以退出循环打印话题数据了。同理,输入其他话题名称就可以查看相应的话题数据是否正常了。
如何制作自己的自定义Finsh控制台命令


一个最简单的自定义的 msh 命令如下,随意放在哪个.c函数里面都可以:
void hello(void)
{
    rt_kprintf("hello RT-Thread!\n");
}

MSH_CMD_EXPORT(hello , say hello to RT-Thread);

按送药小车的使用来说,比如配置好了电机PWM,想在运行中改变PWM的值,通过串口传入参数就可以修改了,如下面的代码块所示:
/**
-  [url=home.php?mod=space&uid=247401]@brief[/url]  电机的控制室命令,可以通过控制台输入命令来临时改变PWM值驱动电机转动
-  [url=home.php?mod=space&uid=536309]@NOTE[/url]   None
-  @param  argc:发给当前函数 命令行 总的参数的个数,他的值***>=1。
            argv: 是个字符串数组,用来存放指向字符串参数的指针数组,每一个元素指向一个以空格为分割的参数。
                -如argv[0]指向程序运行的函数名称。
                -如argv[1]指向解析出来的第一个参数,argv[2]指向再接下来的一个参数。
-  @retval None
   */
static void motor_test(int argc, char**argv)
{
    int16_t pwm_value = 0;
    /* 检查输入的变量是否有两个 */
    if (argc < 3)
    {
        rt_kprintf("Please input'motor_test <motor1|motor2> <value(-1000 ~ +1000)>'\n");
        return;
    }
    if (!rt_strcmp(argv[1], "motor1"))
    {
        pwm_value = atoi(argv[2]);
        motor1_pwm_value_set(pwm_value);
    }
    else if (!rt_strcmp(argv[1], "motor2"))
    {
        pwm_value = atoi(argv[2]);
        motor2_pwm_value_set(pwm_value);
    }
    else
    {/* 输入的是其他内容 */
        rt_kprintf("Please input'motor_test <motor1|motor2> <value(-1000 ~ +1000)>'\n");
    }
}
//导出命令到控制台
MSH_CMD_EXPORT(motor_test, motor test sample : motor_test motor1|motor2 in1|in2 puls

上面这段代码是一个用于测试电机控制的函数,通过控制台输入命令来临时改变 PWM(脉宽调制)值,从而驱动电机转动。它接收两个参数:argc 和 argv。argc 表示传递给当前函数的命令行参数的个数,argv 是一个字符串数组,用于存放指向各个命令行参数的指针。
首先检查是否输入了两个参数,如果没有输入两个参数,则提示用户输入正确的命令格式。接下来,函数根据第一个参数(argv[1])判断要控制的电机是 motor1 还是 motor2,并将第二个参数(argv[2])转换为整数,作为 PWM 值。然后,根据选择的电机调用相应的设置 PWM 值的函数(motor1_pwm_value_set() 或 motor2_pwm_value_set())。如果输入的参数不符合预期,会提示用户输入正确的命令格式。
最后一行代码 MSH_CMD_EXPORT(motor_test, motor test sample : motor_test motor1|motor2 in1|in2 puls 将 motor_test 函数导出到控制台,让我们可以在控制台中直接输入命令调用该函数。




使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

26

帖子

0

粉丝