嵌入式shell串口交互组件的实现-cuteshell

Posted bliss

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式shell串口交互组件的实现-cuteshell相关的知识,希望对你有一定的参考价值。

项目名称:CUTESHELL

项目git地址

需求分析

  • 背景分析:公司的产品对产线测试需求比较多,所以需要一个串口交互系统,网上看了一下都不太符合我们的需求,所以在疫情隔离期间自己动手写一个
  • 具体需求:
    1. 满足可以输入命令后对命令进行识别
    2. 根据命令执行指令
    3. 在不同的模块下注册简单而不是以一个大数组的方式维护
    4. 可移植在任何有串口的项目中,注册串口输入输出函数就可以直接使用

实现方式介绍

  1. 采用链表的方式,新增一个命令只需要在任意模块新增链表节点即可
  2. 只需要修改两个函数即可在任意平台使用(OS、或者无OS)

TODO

  1. 权限功能开发
  2. 结合状态机实现升级功能

部分源码

/*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);

移植说明:

  1. 在shell_cfg.h文件中注册串口发送字符接口
#define shellWriteChar  uart0_send_byte     //注册串口输出字符接口
//示例实现方式
void uart0_send_byte(const char c)

    printf("%c",c);

  1. 调用shell初始化函数

shell_init();

  1. 调用命令注册函数

shell_RegCmd("help0", (Shell_function)helpHandle0);

  1. 在任务或者循环调度中调用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;
		
	

基于正点原子stm32F407串口例程的demo

配置说明

  • 参数配置在shell_cfg.h文件中
    • SHELL_HEAP_SUPPORT 是否需要自定义堆空间,当为1时会在内存中申请一块空间用于存储shell链表数据,如果已经实现malloc函数则无需使用这个静态空间
    • SHELL_CMD_MAXNUM 单个命令中最大字符串个数
    • SHELL_CMD_MAXLEN 单个命令中单个字符串最大字符长度
    • SHELL_HEAP_SIZE shell占用静态空间大小
他只是向前航行,脚下是沉静碧蓝的大海,而头顶是金色的太阳。

以上是关于嵌入式shell串口交互组件的实现-cuteshell的主要内容,如果未能解决你的问题,请参考以下文章

shell for MCU,单片机命令行交互

[小技巧] shell 下查看串口是否工作正常

Linux 串口传输文件到Window系统去

linux下shell脚本实现串口的读取以及报文的解析

Shell编程之免交互

[嵌入式开发模块]单片机串口模块:串口+定时器+环形缓冲区 实现无串口IDLE中断接收不定长串口数据