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])。
?
?
總結
以上是生活随笔為你收集整理的RT-Thread中自定义MSH命令传入的参数是字符串,需用户自行检查和解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小程序 --- 项目小练手Ⅰ
- 下一篇: 微信团购小程序怎么做?一般要多少钱?