小白学dummy稚晖君代码(三)

        哈喽,大家好,今天我们要讲的是UserApp下的interface_uart.cpp里的内容。

        首先,先来跟大家提一下,什么是UART命令。

        所谓的UART命令,就是通过UART(通用异步收发器)接口发送和接收的命令。简单点来说,UART就是一种串行通信协议,用来在计算机和外部设备之间传输数据,通过串口发送的一系列字节数据,实现设备之间的通信和控制

        ok,接下来,就让我们进入今天的主题吧。

        interface_uart.cpp里的内容其实很简单,如果看过我前两篇文章的人,再来看这段代码,会发现其实大同小异。

        首先,代码包含了两个头文件——"common_inc.h"和"configurations.h"。其中包含了一些常用的宏定义、函数声明和配置参数。接下来,使用extern关键字声明了一个Motor类型的全局变量motor,然后,定义了一个OnUartCmd函数,它接收两个参数:一个uint8_t类型的指针_data,用于指向字节数据的数组;一个uint16_t类型的_len,表示数据的长度。在函数内部,定义了一些局部变量,包括cur(电流)、pos(位置)、vel(速度)和time(时间)。

#include "common_inc.h"
#include "configurations.h"

extern Motor motor; //声明全局变量Motor

void OnUartCmd(uint8_t* _data, uint16_t _len) //定义OnUartCmd的函数,包含两个参数
{
    float cur, pos, vel, time;//定义局部变量

        接下来,使用switch语句根据_data[0]的值来判断接收到的命令类型

        如果接收到的命令类型是'c',表示设置电流。代码使用sscanf函数将_data中的数据解析为一个浮点数,保存在cur变量中。然后,通过if语句判断解析是否成功,如果成功,则进入if语句块。

        在if语句块内部,首先检查当前运行模式是否为MODE_COMMAND_CURRENT,不是的话,则调用motor.controller->SetCtrlMode函数将模式设置为MODE_COMMAND_CURRENT。然后,调用motor.controller->SetCurrentSetPoint函数,将解析出的电流值设置为电机控制器的电流设定点。

        case 'c':  //如果接收到的命令类型是'c'
            ret = sscanf((char*) _data, "c %f", &cur);//将_data中的数据解析为浮点数,保存在cur变量中
            if (ret < 1)
            {
                printf("[error] Command format error!\r\n");
            } else if (ret == 1)
            {
                if (motor.controller->modeRunning != Motor::MODE_COMMAND_CURRENT)
                    motor.controller->SetCtrlMode(Motor::MODE_COMMAND_CURRENT);
                motor.controller->SetCurrentSetPoint((int32_t) (cur * 1000));//将解析出的电流值设置为电机控制器的电流设定点
            break;

        接下来的代码也和这个差不多啦,具体功能如下        

  •    如果接收到的命令类型是'v',表示设置速度
  •    如果接收到的命令类型是'p',表示设置位置

        

        case 'v':
            ret = sscanf((char*) _data, "v %f", &vel);
            if (ret < 1)
            {
                printf("[error] Command format error!\r\n");
            } else if (ret == 1)
            {
                if (motor.controller->modeRunning != Motor::MODE_COMMAND_VELOCITY)
                {
                    motor.config.motionParams.ratedVelocity = boardConfig.velocityLimit;
                    motor.controller->SetCtrlMode(Motor::MODE_COMMAND_VELOCITY);
                }
                motor.controller->SetVelocitySetPoint(
                    (int32_t) (vel * (float) motor.MOTOR_ONE_CIRCLE_SUBDIVIDE_STEPS));
            }
            break;
        case 'p':
            ret = sscanf((char*) _data, "p %f", &pos);
            if (ret < 1)
            {
                printf("[error] Command format error!\r\n");
            } else if (ret == 1)
            {
                if (motor.controller->modeRunning != Motor::MODE_COMMAND_POSITION)
                    motor.controller->requestMode = Motor::MODE_COMMAND_POSITION;

                motor.controller->SetPositionSetPoint(
                    (int32_t) (pos * (float) motor.MOTOR_ONE_CIRCLE_SUBDIVIDE_STEPS));
            }
            break;
    }

在接下来的文章中,将会为大家讲解dummy 的cli_tool 的run_shell ref_tool里的py文件。

  • 15
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值