文章参考https://blog.csdn.net/jerrytomcat/article/details/82050977
摘要:
笔者没有接触过Linux,也没有用过shell,今天偶然在一个模块程序上看见有这种写法感觉很新颖,也很方便,分享一下
一. 什么是Shell
Shell是一个命令行解释器,它为用户提供了一个面向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
Shell具体可描述为:外层应用程序是一些命令,是非机器语言,比如ls , useradd等;而内核则识别的是机器语言0和1,让Shell解释器当一个“中介”,由非机器语言通过Shell解释器向机器语言的转化,转化后内核将命令传递给硬件执行。更直白的说,Shell就是我们操控的Linux终端界面,输入命令得到想要的功能。
二、自建交互
创建名了结构体:
typedef const struct _COMMAND {
char * command;
void (* function)(void);
const struct _COMMAND * next;
}COMMAND_T;
结构体初始化:
COMMAND_T cmd_clear = {
.command = "clear",
.function = func_clear,
.next = NULL
};
COMMAND_T cmd_help = {
.command = "help",
.function = func_help,
.next = &cmd_clear
};
COMMAND_T cmd_vid = {
.command = "vid",
.function = func_vid,
.next = &cmd_help
};
COMMAND_T cmd_pid = {
.command = "pid",
.function = func_pid,
.next = &cmd_vid
};
主程序轮询:
static int command_interpreter(void){
COMMAND_T * cp;
char i = 0;
if (receive_flag) {
receive_flag = 0;
memset(buffer, 0, BUFFER_SIZE);
memcpy(buffer, receive_buffer, strlen(receive_buffer));
memset(receive_buffer, 0, BUFFER_SIZE);
for (i = 0; i < BUFFER_SIZE; i++) buffer[i] = tolower(buffer[i]);
cp = &cmd_null;
while (cp != NULL) {
if (memcmp(buffer, cp->command, strlen(cp->command)) == 0) {
cp->function();
goto next;
}
cp = cp->next;
}
buffer[strlen(buffer) - 1] = '\0';
uart.printf("\r\n\ 1 command! \r\n");
next: uart.printf("\r\n\ 2 command \r\n ");
}
通过butty 软件可以实现对模块端口的访问