本帖最后由 LCKFB 于 2023-7-20 09:57 编辑
送药小车代码仓库: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的输出信息了:
- <font face="宋体">
- \ | /
- - RT - Thread Operating System
- / | \ 4.1.1 build Jun 26 2023 17:28:18
- 2006 - 2022 Copyright by RT-Thread team</font>
复制代码
在计算机发展的早期,图形系统出现之前,没有鼠标,甚至没有键盘。那时候人们如何与计算机交互呢?最早期的计算机使用打孔的纸条向计算机输入命令,编写程序。后来随着计算机的不断发展,显示器、键盘成为计算机的标准配置,但此时的操作系统还不支持图形界面,计算机先驱们开发了一种软件,它接受用户输入的命令,解释之后,传递给操作系统,并将操作系统执行的结果返回给用户。这个程序像一层外壳包裹在操作系统的外面,所以它被称为 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函数里面都可以:
- <font face="宋体">void hello(void)
- {
- rt_kprintf("hello RT-Thread!\n");
- }
- MSH_CMD_EXPORT(hello , say hello to RT-Thread);</font>
复制代码
按送药小车的使用来说,比如配置好了电机PWM,想在运行中改变PWM的值,通过串口传入参数就可以修改了,如下面的代码块所示:
- <font face="宋体">/**
- - @brief 电机的控制室命令,可以通过控制台输入命令来临时改变PWM值驱动电机转动
- - [url=home.php?mod=space&uid=60778]@note[/url] None
- - [url=home.php?mod=space&uid=271674]@param[/url] 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</font>
复制代码
上面这段代码是一个用于测试电机控制的函数,通过控制台输入命令来临时改变 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 函数导出到控制台,让我们可以在控制台中直接输入命令调用该函数。
|