#include "debug_cmdshell.h"
const cmd_list_struct cmd_list[]={
// 命令 参数 处理函数 帮助信息
{"hello",0,(void* )printf_hello, "hello -print HelloWorld!\r\n"},
{"arg",8,(void* )handle_arg, "arg<arg1> <arg2> ... -print args\r\n"},
{"help",0,(void* )printf_help, "help -print help\r\n"},
{"?",0,(void* )printf_help, "? -print help\r\n"},
{"tcptest",0,(void* )tcptest, "tcptest -TCP Debug Test\r\n"},
{"exit",0,(void* )logout, "exit -exit\r\n"},
};
cmd_analyze_struct cmd_analyze;
void logout(int32_t argc,void *cmd_arg)
{
exit(0);
}
void tcptest(int32_t argc,void *cmd_arg)
{
printf("tcptest function\r\n");
}
void printf_hello(int32_t argc,void *cmd_arg)
{
printf("Hello world!\r\n");
}
void handle_arg(int32_t argc,void * cmd_arg)
{
uint32_t i;
int32_t *arg=(int32_t *)cmd_arg;
if(argc==0)
{
printf("no arg\n");
}
else
{
for(i=0;i<argc;i++)
{
printf("arg %d is : %d\n",i+1,arg[i]);
}
}
}
void printf_help(int32_t argc,void * cmd_arg)
{
int i;
for(i=0;i<sizeof(cmd_list)/sizeof(cmd_list[0]);i++)
{
printf("%s",cmd_list[i].help);
}
}
static uint32_t get_true_char_stream(char *dest,const char *src)
{
uint32_t dest_count=0;
uint32_t src_count=0;
while(src[src_count]!='\0')
{
if(isprint(src[src_count]))
{
dest[dest_count++]=src[src_count++];
}
else
{
switch(src[src_count])
{
case 0x08:
{
if(dest_count>0)
{
dest_count --;
}
src_count ++;
}break;
case 0x1B:
{
if(src[src_count+1]==0x5B)
{
if(src[src_count+2]==0x41 || src[src_count+2]==0x42)
{
src_count +=3;
}
else if(src[src_count+2]==0x43)
{
dest_count++;
src_count+=3;
}
else if(src[src_count+2]==0x44)
{
if(dest_count >0)
{
dest_count --;
}
src_count +=3;
}
else
{
src_count +=3;
}
}
else
{
src_count ++;
}
}break;
default:
{
src_count++;
}break;
}
}
}
//dest[dest_count++]=src[src_count++];
//dest[dest_count++]=src[src_count++];
return dest_count;
}
static int32_t string_to_dec(uint8_t *buf,uint32_t len)
{
uint32_t i=0;
uint32_t base=10;
int32_t neg=1;
int32_t result=0;
if((buf[0]=='0')&&(buf[1]=='x'))
{
base=16;
neg=1;
i=2;
}
else if(buf[0]=='-')
{
base=10;
neg=-1;
i=1;
}
for(;i<len;i++)
{
if(buf[i]==0x20 || buf[i]=='\0')
{
break;
}
result *= base;
if(isdigit(buf[i]))
{
result += buf[i]-'0';
}
else if(isxdigit(buf[i]))
{
result+=tolower(buf[i])-87;
}
else
{
result += buf[i]-'0';
}
}
result *= neg;
return result ;
}
static int32_t cmd_arg_analyze(char *rec_buf,unsigned int len)
{
uint32_t i;
uint32_t blank_space_flag=0;
uint32_t arg_num=0;
uint32_t index[ARG_NUM];
for(i=0;i<len;i++)
{
if(rec_buf[i]==0x20)
{
blank_space_flag=1;
continue;
}
else if(rec_buf[i]=='\0')
{
break;
}
else
{
if(blank_space_flag==1)
{
blank_space_flag=0;
if(arg_num < ARG_NUM)
{
index[arg_num]=i;
arg_num++;
}
else
{
return -1;
}
}
}
}
for(i=0;i<arg_num;i++)
{
//arg 1 2 0x10
cmd_analyze.cmd_arg[i]=string_to_dec((unsigned char *)(rec_buf+index[i]),len-index[i]);
printf("i:%d, arg[%d]=%d\r\n",i,i,cmd_analyze.cmd_arg[i]);
}
return arg_num;
}
//命令解析函数
/*
* 入口参数 data : 需要解析的命令行字符串 注意该字符串已经将 \r\n 去掉
datalen : 命令行字符串长度
*/
void debugcmd_process(u8* data,u8 datalen)
{
u8 i;
int rec_num;
int32_t rec_arg_num;
char cmd_buf[CMD_LEN];
if(datalen<CMD_BUF_LEN)
{
for(i=0;i<datalen;i++)
{
cmd_analyze.rec_buf[i]=data[i];
}
rec_num=get_true_char_stream(cmd_analyze.processed_buf,cmd_analyze.rec_buf);
for(i=0;i<CMD_LEN;i++)
{
if((i>0)&&((cmd_analyze.processed_buf[i]==' ')||(cmd_analyze.processed_buf[i]==0x0D)))
{
cmd_buf[i]='\0';
break;
}
else
{
cmd_buf[i]=cmd_analyze.processed_buf[i];
}
}
//printf("[debug] %s\r\n",cmd_buf);
rec_arg_num=cmd_arg_analyze(&cmd_analyze.processed_buf[i],rec_num);
for(i=0;i<sizeof(cmd_list)/sizeof(cmd_list[0]);i++)
{
if(!strcmp(cmd_buf,cmd_list[i].cmd_name))
{
if(rec_arg_num<0 || rec_arg_num>cmd_list[i].max_args)
{
printf("args is too many\r\n");
}
else
{
cmd_list[i].handle(rec_arg_num,(void *)cmd_analyze.cmd_arg);
}
break;
}
}
if(i>=sizeof(cmd_list)/sizeof(cmd_list[0]))
{
printf("cmd is not support\r\n");
}
memset(cmd_analyze.rec_buf,0,CMD_BUF_LEN);
memset(cmd_analyze.processed_buf,0,CMD_BUF_LEN);
memset(cmd_buf,0,CMD_LEN);
}
}
Linux下串口命令行交互实例
需积分: 47 127 浏览量
2018-10-31
21:41:40
上传
评论 3
收藏 3KB RAR 举报
飘雪冰峰
- 粉丝: 3977
- 资源: 20
最新资源
- 基于Apache Spark的Spark DistCP重实现设计源码
- 粤港澳大湾区(黄埔)算法算例大赛-工业表面缺陷检测源码+超详细注释
- 在 KolektorSDD 数据上使用分割决策网络进行表面缺陷检测python源码+文档说明
- 操作系统作业:时间片轮转算法的模拟实现C++源码+文档说明
- 基于改进yolov5的金属曲面缺陷检测,使用pyqt5实习了实时视频检测的功能python源码+文档说明
- 基于Qt及OpenCv设计了一个视觉检测系统,实现了米粒的计数、缺陷分析功能+源码+文档说明+效果图
- 基于STM32F1和TB6612芯片的电机驱动板,可以驱动两个电机正反转,具有比L298N更小的体积源码+文档说明
- 基于Javascript的CNN卷积交互式播放器设计源码
- 基于Layui的树表格(treeGrid)前端设计源码
- 基于Vue框架的Node+Vue茶叶商城设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈