串口调用单片机函数(c/c++)[自定义shell]

调试单片机常用,参考正点原子USMART写了个简单的自用

核心内容如下

1、C语言(stm32)

定义

typedef struct ShellFun_CLASS{
	void* func;					//函数指针
	const u8* resType;	//函数返回类型
	const u8* name;			//函数名
}ShellFun;

用户列表

ShellFun UserFunList[]=
{
	(void*)Shell_Test1,"void","Shell_Test1()",
	(void*)Shell_Test2,"u16","Shell_Test2(u16,u8,us)",
};

调用

u32 res;

switch(mShell.fparamCnt)
{
	case 0://无参数(void类型)											  
		res=(*(u32(*)())UserFunList[i].func)();
		break;
	case 1://有1个参数
		res=(*(u32(*)())UserFunList[i].func)(SParam(0));
		break;
	case 2://有2个参数
		res=(*(u32(*)())UserFunList[i].func)(SParam(0),SParam(1));
		break;
	case 3://有3个参数
		res=(*(u32(*)())UserFunList[i].func)(SParam(0),SParam(1),SParam(2));
		break;
}

2、C++语言(esp32)

定义

typedef struct ShellFun_CLASS{
  void* func;         //函数指针
  const char* resType; //函数返回类型
  const char* name;      //函数名
}ShellFun;

用户列表

ShellFun UserFunList[]={
    (void*)Test1,"void","Shell_Test1()",
    (void*)Test2,"void","Shell_Test2(u8)",
    (void*)Test3,"void","Shell_Test3()",
};

调用

uint32_t res;
void* (*funP0)();
void* (*funP1)(void* a);
void* (*funP2)(void* a,void* b);
void* (*funP3)(void* a,void* b,void* c);

switch(mShell.fparamCnt)
{
	case 0://无参数(void类型)
		funP0=(void* (*)())UserFunList[i].func;
		res=(uint32_t)funP0();
		break;
	case 1://有1个参数
		funP1=(void* (*)(void*))UserFunList[i].func;
		res=(uint32_t)funP1((void*)SParam(0));
		break;
	case 2://有2个参数
		funP2=(void* (*)(void*,void*))UserFunList[i].func;
		res=(uint32_t)funP2((void*)SParam(0),(void*)SParam(1));
		break;
	case 3://有3个参数
		funP3=(void* (*)(void*,void*,void*))UserFunList[i].func;
		res=(uint32_t)funP3((void*)SParam(0),(void*)SParam(1),(void*)SParam(2));
		break;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值