野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 489|回复: 0

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

[复制链接]
发表于 2023-7-20 09:54:58 | 显示全部楼层 |阅读模式
本帖最后由 LCKFB 于 2023-7-20 09:59 编辑

送药小车代码仓库: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的输出信息了:
  1. \ | /
  2. - RT -     Thread Operating System
  3. / | \     4.1.1 build Jun 26 2023 17:28:18
  4. 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函数里面都可以:
  1. void hello(void)
  2. {
  3.     rt_kprintf("hello RT-Thread!\n");
  4. }

  5. MSH_CMD_EXPORT(hello , say hello to RT-Thread);
复制代码

按送药小车的使用来说,比如配置好了电机PWM,想在运行中改变PWM的值,通过串口传入参数就可以修改了,如下面的代码块所示:
  1. /**
  2. -  [url=home.php?mod=space&uid=41770]@brief[/url]  电机的控制室命令,可以通过控制台输入命令来临时改变PWM值驱动电机转动
  3. -  [url=home.php?mod=space&uid=87825]@note[/url]   None
  4. -  @param  argc:发给当前函数 命令行 总的参数的个数,他的值永远>=1。
  5.             argv: 是个字符串数组,用来存放指向字符串参数的指针数组,每一个元素指向一个以空格为分割的参数。
  6.                 -如argv[0]指向程序运行的函数名称。
  7.                 -如argv[1]指向解析出来的第一个参数,argv[2]指向再接下来的一个参数。
  8. -  @retval None
  9.    */
  10. static void motor_test(int argc, char**argv)
  11. {
  12.     int16_t pwm_value = 0;
  13.     /* 检查输入的变量是否有两个 */
  14.     if (argc < 3)
  15.     {
  16.         rt_kprintf("Please input'motor_test <motor1|motor2> <value(-1000 ~ +1000)>'\n");
  17.         return;
  18.     }
  19.     if (!rt_strcmp(argv[1], "motor1"))
  20.     {
  21.         pwm_value = atoi(argv[2]);
  22.         motor1_pwm_value_set(pwm_value);
  23.     }
  24.     else if (!rt_strcmp(argv[1], "motor2"))
  25.     {
  26.         pwm_value = atoi(argv[2]);
  27.         motor2_pwm_value_set(pwm_value);
  28.     }
  29.     else
  30.     {/* 输入的是其他内容 */
  31.         rt_kprintf("Please input'motor_test <motor1|motor2> <value(-1000 ~ +1000)>'\n");
  32.     }
  33. }
  34. //导出命令到控制台
  35. 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 函数导出到控制台,让我们可以在控制台中直接输入命令调用该函数。




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-30 20:35 , Processed in 0.026087 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表