如下是在将安富莱的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])。