哈喽,大家好,今天我们要讲的是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文件。