嵌入式shell串口交互组件的实现-cuteshell
Posted bliss
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式shell串口交互组件的实现-cuteshell相关的知识,希望对你有一定的参考价值。
项目名称:CUTESHELL
需求分析
- 背景分析:公司的产品对产线测试需求比较多,所以需要一个串口交互系统,网上看了一下都不太符合我们的需求,所以在疫情隔离期间自己动手写一个
- 具体需求:
- 满足可以输入命令后对命令进行识别
- 根据命令执行指令
- 在不同的模块下注册简单而不是以一个大数组的方式维护
- 可移植在任何有串口的项目中,注册串口输入输出函数就可以直接使用
实现方式介绍
- 采用链表的方式,新增一个命令只需要在任意模块新增链表节点即可
- 只需要修改两个函数即可在任意平台使用(OS、或者无OS)
TODO
- 权限功能开发
- 结合状态机实现升级功能
部分源码
/*shell命令解析函数*/
static void shell_Parse(uint8_t argc,char *argv[])
Node *shell_node = NULL;
uint8_t res = 0;
for(shell_node = shellList.head.next;shell_node != &shellList.tail;shell_node = shell_node->next)
if(strlen(argv[0]) == strlen(shell_node->shellNode.name))
if (0 == strncmp((const char *)argv[0], shell_node->shellNode.name, strlen(argv[0])))
res = 1;
shell_node->shellNode.handleFunc(argc, argv);
break;
else
continue;
if(!res)
SHELL_PrintfBuf("command is not found!");
/*shell命令注册函数*/
void shell_RegCmd(const char *name, Shell_function func)
Node *shell_node = NULL;
for (shell_node = shellList.head.next; shell_node != &shellList.tail; shell_node = shell_node->next)
if (0 == strncmp((const char *)name, shell_node->shellNode.name, strlen(shell_node->shellNode.name)))
SHELL_PrintfBuf("command has been registered!");
return;
shell_node = NULL;
#if SHELL_HEAP_SUPPORT
shell_node = (Node *)shell_malloc(sizeof(Node));
#else
shell_node = malloc(sizeof(Node));
#endif
if (NULL == shell_node) //空间申请失败,空间不足
SHELL_PrintfBuf("heap memory not enough! reg fail!");
return;
shell_node->shellNode.handleFunc = func;
shell_node->shellNode.name = name;
List_InsertTail(&shellList, shell_node);
移植说明:
- 在shell_cfg.h文件中注册串口发送字符接口
#define shellWriteChar uart0_send_byte //注册串口输出字符接口
//示例实现方式
void uart0_send_byte(const char c)
printf("%c",c);
- 调用shell初始化函数
shell_init();
- 调用命令注册函数
shell_RegCmd("help0", (Shell_function)helpHandle0);
- 在任务或者循环调度中调用shell回调函数,将串口接收到的字符传进去
while(1)
if(USART_RX_STA&0x8000)
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
for(t=0;t<len;t++)
shell_handleFunc(USART_RX_BUF[t]);
shell_handleFunc(\'\\n\');
USART_RX_STA=0;
配置说明
- 参数配置在shell_cfg.h文件中
- SHELL_HEAP_SUPPORT 是否需要自定义堆空间,当为1时会在内存中申请一块空间用于存储shell链表数据,如果已经实现malloc函数则无需使用这个静态空间
- SHELL_CMD_MAXNUM 单个命令中最大字符串个数
- SHELL_CMD_MAXLEN 单个命令中单个字符串最大字符长度
- SHELL_HEAP_SIZE shell占用静态空间大小
他只是向前航行,脚下是沉静碧蓝的大海,而头顶是金色的太阳。
以上是关于嵌入式shell串口交互组件的实现-cuteshell的主要内容,如果未能解决你的问题,请参考以下文章