news 2026/7/25 9:36:53

嵌入式终端AtShell的精简版

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式终端AtShell的精简版

参考

嵌入式终端AtShell.csdn
基于rtdef.h的轻量级设备管理、终端、协程与应用管理框架设计.csdn
zynq的linux驱动版终端AtShellDrv.csdn

将嵌入式终端AtShell.csdn的功能进行精简,方便在串口助手上使用

  • 去掉命令历史
  • 去掉命令补全
  • 去掉AT模式
  • 去掉异步缓冲输出
  • 去掉日志重定向

代码

SimpleAtShell.h

#ifndef__SIMPLE_ATSHELL_H__#define__SIMPLE_ATSHELL_H__#include<stdint.h>#include<stdbool.h>#defineCON_AT_METHOD_NUM10//命令数#defineRT_FINSH_ARG_MAX8//参数容量#defineFINSH_CMD_SIZE20//最长命令尺寸typedefint(*ATWriteFun)(uint8_t*buf,uint32_tlen);typedefint(*ATServerFun)(intargc,char**argv);typedefstruct{constchar*methodName;constchar*desc;ATServerFun atFun;void*userData;}AT_CMD_ENTRY_TypeDef;#defineAT_FUN(name)#name#defineAT_printf(format,...)g_atShell.Printf(format,##__VA_ARGS__)#defineAT_println(format,...)g_atShell.Printf(format,##__VA_ARGS__);AT_printf("\r\n")#defineAT_m_bufg_atShell.GetBuf()#defineAT_SHELL_EXPORT(cmdName,desc,fun,...)AT_CMD_ENTRY_TypeDef fun##entrycmd={AT_FUN(cmdName),#desc,fun,__VA_ARGS__};at_register(fun##entrycmd)#defineAT_EXPORT(x)AT_SHELL_EXPORT(x,x,x)#ifdef__cplusplusclass AtShell{public:AtShell();boolRegist(AT_CMD_ENTRY_TypeDef cmd);boolRegist(AT_CMD_ENTRY_TypeDef*cmdList,intcmdLen);boolExec(char*cmd);intGetCmdNum()const;constAT_CMD_ENTRY_TypeDef*GetCmdList()const;voidPrintf(constchar*fmt,...);voidWrite(constvoid*buf,uint32_tlen);virtualchar*GetBuf(){returnm_buf;};private:charm_buf[FINSH_CMD_SIZE];boolParse(char*cmd);private:AT_CMD_ENTRY_TypeDef m_cmdList[CON_AT_METHOD_NUM];intm_cmdNum;intm_argc;char*m_argv[RT_FINSH_ARG_MAX];};externAtShell g_atShell;#endif#ifdef__cplusplusextern"C"{#endifvoidat_init(ATWriteFun writeFun);intat_import(uint8_t*buf,uint32_tlen,uint32_tms);boolat_register(AT_CMD_ENTRY_TypeDef cmd);boolat_register_list(AT_CMD_ENTRY_TypeDef*cmdList,intcmdLen);voidat_show_version(void);#ifdef__cplusplus}#endif#endif

SimpleAtShell.cpp

#include"SimpleAtShell.h"#include<stdarg.h>#include<stdio.h>#include<string.h>#defineAT_CMDLINE_SIZE128AtShell g_atShell;staticATWriteFun s_writeFun=NULL;staticchars_cmdLine[AT_CMDLINE_SIZE];staticuint32_ts_cmdIndex=0;staticint__help(intargc,char**argv){(void)argc;(void)argv;constAT_CMD_ENTRY_TypeDef*cmd=g_atShell.GetCmdList();intnum=g_atShell.GetCmdNum();AT_printf("AtShell commands:\r\n");for(inti=0;i<num;i++){AT_printf("%2d. %-16s %s\r\n",i,cmd[i].methodName,cmd[i].desc?cmd[i].desc:"");}return0;}staticboolIsNumber(constchar*str){if(*str=='\0')returnfalse;while(*str){if(*str<'0'||*str>'9')returnfalse;str++;}returntrue;}intAtShell::GetCmdNum()const{returnm_cmdNum;}constAT_CMD_ENTRY_TypeDef*AtShell::GetCmdList()const{returnm_cmdList;}voidAtShell::Write(constvoid*buf,uint32_tlen){if(s_writeFun){s_writeFun((uint8_t*)buf,len);}}voidAtShell::Printf(constchar*fmt,...){if(!s_writeFun)return;charbuf[256];va_list args;va_start(args,fmt);intlen=vsnprintf(buf,sizeof(buf),fmt,args);va_end(args);if(len>0){if((uint32_t)len>sizeof(buf))len=sizeof(buf);Write(buf,len);}}AtShell::AtShell(){m_cmdNum=0;m_argc=0;AT_SHELL_EXPORT(help,list cmd,__help);}bool AtShell::Regist(AT_CMD_ENTRY_TypeDef cmd){if(m_cmdNum>=CON_AT_METHOD_NUM){returnfalse;}m_cmdList[m_cmdNum++]=cmd;returntrue;}bool AtShell::Regist(AT_CMD_ENTRY_TypeDef*cmdList,intcmdLen){while(cmdLen--){if(!Regist(*cmdList++)){returnfalse;}}returntrue;}bool AtShell::Parse(char*cmd){m_argc=0;while(*cmd){while(*cmd==' '||*cmd==','||*cmd=='\t'){*cmd++=0;}if(*cmd==0){break;}if(m_argc>=RT_FINSH_ARG_MAX){break;}m_argv[m_argc++]=cmd;while(*cmd&&*cmd!=' '&&*cmd!=','&&*cmd!='\t'&&*cmd!='\r'&&*cmd!='\n'){cmd++;}}return(m_argc>0);}bool AtShell::Exec(char*cmd){if(!Parse(cmd)){returnfalse;}if(IsNumber(m_argv[0])){intindex=atoi(m_argv[0]);if(index>=0&&index<m_cmdNum){m_cmdList[index].atFun(m_argc,m_argv);returntrue;}Printf("Invalid command index: %d\r\n",index);returnfalse;}/* 按名称查找 */for(inti=1;i<m_cmdNum;i++){if(strcmp(m_cmdList[i].methodName,m_argv[0])==0){m_cmdList[i].atFun(m_argc,m_argv);returntrue;}}/* 0号命令:默认处理 */if(m_cmdNum>0&&m_cmdList[0].atFun){m_cmdList[0].atFun(m_argc,m_argv);returntrue;}returnfalse;}voidat_init(ATWriteFun writeFun){s_writeFun=writeFun;(void)s_writeFun;}boolat_register(AT_CMD_ENTRY_TypeDef cmd){returng_atShell.Regist(cmd);}boolat_register_list(AT_CMD_ENTRY_TypeDef*cmdList,intcmdLen){returng_atShell.Regist(cmdList,cmdLen);}intat_import(uint8_t*buf,uint32_tlen,uint32_tms){(void)ms;for(uint32_ti=0;i<len;i++){charch=(char)buf[i];if(ch=='\r'){continue;}if(ch=='\n'){s_cmdLine[s_cmdIndex]=0;if(s_cmdIndex){g_atShell.Exec(s_cmdLine);}s_cmdIndex=0;continue;}if(s_cmdIndex<(AT_CMDLINE_SIZE-1)){s_cmdLine[s_cmdIndex++]=ch;}}returnlen;}voidat_show_version(void){if(!s_writeFun)return;s_writeFun((uint8_t*)" \\ | /\r\n",8);s_writeFun((uint8_t*)"- AT_SHELL - "__DATE__"\r\n",sizeof("- AT_SHELL - "__DATE__"\r\n")-1);s_writeFun((uint8_t*)" / | \\\r\n",8);}

esp32上测试

main.cpp

#include<Arduino.h>#include"SimpleAtShell.h"staticintuser_at_write(uint8_t*srcBuf,uint32_ttoSendLen){returnSerial.write(srcBuf,toSendLen);}staticinttest_01(intargc,char**argv){AT_println("hello test_01");AT_println("argc = %d",argc);for(inti=0;i<argc;i++){AT_println("argv[%d] = \"%s\"",i,argv[i]);}return0;}voidsetup(){Serial.begin(115200);at_init(user_at_write);at_show_version();AT_SHELL_EXPORT(test01,测试,test_01);}voidloop(){intlen=Serial.available();if(len>0){Serial.readBytes((uint8_t*)AT_m_buf,len);at_import((uint8_t*)AT_m_buf,len,millis());}}

输出

\|/-AT_SHELL-Jul252026/|\[00:11:05.273]发→◇0[00:11:05.277]收←◆AtShell commands:0.help list cmd1.test01 测试[00:11:12.177]发→◇155rr □[00:11:12.181]收←◆hello test_01 argc=3argv[0]="1"argv[1]="55"argv[2]="rr"
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/25 9:35:38

深度学习大模型训练优化:显存与梯度爆炸解决方案

1. 项目背景与核心挑战在深度学习模型规模指数级增长的今天&#xff0c;梯度爆炸和显存限制已成为制约大模型训练的两大技术瓶颈。梁文锋团队最新发布的"宏观架构"解决方案&#xff0c;通过创新的参数分配策略和计算流优化&#xff0c;在保持模型性能的前提下&#x…

作者头像 李华
网站建设 2026/7/25 9:35:09

C++项目JSON库选型与集成:从nlohmann/json实战到工程化实践

1. 项目概述&#xff1a;为什么C项目需要一个JSON库&#xff1f;如果你用C写过一些稍微有点规模的项目&#xff0c;比如一个网络服务、一个游戏的数据管理器&#xff0c;或者一个需要读取配置文件的桌面应用&#xff0c;那你大概率会遇到一个头疼的问题&#xff1a;数据交换。C…

作者头像 李华
网站建设 2026/7/25 9:32:08

2026届毕业生必备:10款免费AI论文降重工具指南

1. 2026届毕业生学术写作工具指南 刚完成毕业论文初稿的小王盯着屏幕上的查重报告发愁——系统提示AI生成内容占比高达37%。这不是个案&#xff0c;随着智能写作工具的普及&#xff0c;2026届毕业生正面临前所未有的学术诚信挑战。今天我要分享的这10款工具&#xff0c;都是我和…

作者头像 李华
网站建设 2026/7/25 9:32:01

智慧交通:基于YOLO的交通事故检测数据集与应用

1. 数据集背景与应用价值这个名为"智慧交通公路交通事故城市道路交通事故检测数据集"的资源&#xff0c;本质上是一个专门用于训练AI模型识别交通事故场景的视觉数据集。它包含了1741张经过专业标注的图片&#xff0c;所有图片均采用VOC和YOLO两种主流格式进行标注&a…

作者头像 李华
网站建设 2026/7/25 9:31:53

YOLOv26在钢板表面缺陷检测中的实践与优化

1. 项目背景与核心价值钢板作为工业生产的重要原材料&#xff0c;其表面质量直接影响最终产品的性能和安全性。传统的人工检测方式存在效率低、漏检率高、标准不统一等问题。我们团队基于最新发布的YOLOv26目标检测框架&#xff0c;开发了一套高精度钢板表面缺陷检测系统&#…

作者头像 李华