RT-Thread中自定义MSH命令传入的参数是字符串,需用户自行检查和解析

如下是在将安富莱的dac8563模块对接到潘多拉开发板RT-Thread SPI设备框架中时导出到RT-Thread的自定义MSH命令,需要注意的是MSH传入的是字符串,需要自行对字符串进行解析处理。

#include "stdlib.h"	/* 使用其中的函数:atoi(); */
#include "string.h"	/* 使用其中的函数:strncmp(); */


static void dac8563_spi_sample(int argc, char *argv[])
{
	int16_t i16_volt = 0;
	
	rt_kprintf("input para is: %s %s %s \n", argv[0], argv[1], argv[2]);
	if (3 != argc)
	{
		rt_kprintf("error cmd! please input as: (A 5000) \n");
		return;
	}
	if (!strncmp("A", argv[1], 1))	//两个字符串在比较的长度内都相等则返回0
	{
		i16_volt = atoi(argv[2]);
		DAC8563_set_output_volt(WRITE_AND_UPDATE_DAC_A, i16_volt);
	}
	else if (!strncmp("B", argv[1], 1))
	{
		i16_volt = atoi(argv[2]);
		DAC8563_set_output_volt(WRITE_AND_UPDATE_DAC_B, i16_volt);
	}
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(dac8563_spi_sample, spi dac8563 sample);

在MSH中输入的指令如下所示:

  • 命令的名称为"dac8563_spi_sample",存储于argv[0]
  • 第一个参数为"A",存储于argv[1]
  • 第2个参数为"8000",存储于argv[2]
  • 共有3个字符串,因此argc为3,各字符串的内容被存储与argv[]的各个元素中

在MSH中传入到程序的各个参数均为字符串形式,因此需要用户自行处理其中的参数,也就是说需要做严格的参数检查或者进行类型的转换。

因为dac8563有两个电压输出通道,因此设置输出电压时就需要指定是哪个通道(A或B)?具体设置的电压值(-10000~+10000mV)?

命令格式如上图所示,argv[1]中存储的内容会被解析为电压输出通道,因此就需要用strncmp("A", argv[1], 1)函数进行比对。若argv[1]中存储的字符串前1个字符和“A”相等,则strncmp的返回值为0,否则为1。为0表示当前操作通道为A,则进行通道A输出电压的设置。具体设置的值存储在argv[2]中,是以字符串格式进行存储的,因此需要将字符串转换为整型数。这里使用到了stdlib.h中的函数atoi()。该函数可将输入的字符串转换为带符号整型,如“-5678”转换为整型的-5678,“9860”转换为整型的9860。

 

【atoi函数】

头文件 stdlib.h

C语言中有atoi、atol、atof等库函数,可分别把ASCII编码的字符串转化为int、daolong、float类型的数字。
函数原型:int atoi(const char* nptr);

示例:
char *str="996";
int num=atoi(str);
执行后,num的值被初始化为996

【strncmp函数】

头文件 string.h  

函数名: strncmp  

函数功能: 字符串比较  

函数用法: int strncmp(char *str1, char *str2, int maxlen);  

说明:此函数功能即比较字符串str1和str2的前maxlen个字符。如果前maxlen字节完全相等,返回值就=0;在前maxlen字节比较过程中,如果出现str1[n]与str2[n]不等,则返回(str1[n]-str2[n])。

猜你喜欢

转载自blog.csdn.net/weixin_43885532/article/details/109647267