山寨版USMART用于51单片机
本帖最后由 lcw_swust 于 2020-2-19 11:58 编辑引用原文“USMART是由ALIENTEK开发的一个灵巧的串口调试互交组件,通过 它,
你可以通过串口助手调用程序里面的任何函数,并执行”
坛内相关帖子介绍:
https://www.amobbs.com/forum.php?mod=viewthread&tid=4664072&highlight=usmart
-------------------
USMART真不错,把函数指针玩得出神入化。
参照正点原子的USMART,我写了个用于51单片机的类似程序,附件中的usmart51.c。
没能直接移植,因为水平有限,看到函数指针头大,在传递参数时始终编译出错。
说下我的方案:
串口接收中断调用usmart_rx(),收到\r字符认为是一帧数据,然后调用
usmart_proc()处理串口数据,解析函数名称、转换参数、调用函数、显示返回值。
注意:此程序仅供娱乐,因为有BUG。
所用单片机为STC15W408AS,默认参数;
编译器:KEIL2
移植注意修改:
usmart_sendbyte、usmart_sendstr、
串口接收中断调用usmart_rx()、
主循环里加上这一段:
if(usmartflag&BIT(0))//收到一帧数据
{
IOCLR(usmartflag,BIT(0));//清标志
usmart_proc();//处理数据
}
usmart_proc里的匹配目标函数部分根据需要修改,比如:
if(mStrEqu(Token_Buf,"funtest1"))
{
r=funtest1(m_GetPar(),m_GetPar());
}
核心代码:
//------------------------------------------------
//处理usmart_rx收到的命令
//------------------------------------------------
void usmart_proc(void)
{
U32 r=0;
//usmart_sendstr(usmartbuf_rx);//查看接收的字符串
//--------------------初始化
usmartrxn=0;//接收区计数清0,可在清0前作为长度用
Token_strp=0;//指针清0
Token_p=usmartbuf_rx;//Token_p指向接收区开始处
//--------------------得到函数名
m_GetToken();//开头是函数名字
usmart_sendstr("函数:");
usmart_sendstr(Token_Buf);//发送函数名
usmart_sendstr("()");
//--------------------匹配目标函数,用户可自行修改,注意参数类型的强制转换
if(mStrEqu(Token_Buf,"usmart_setbase"))
{
r=usmart_setbase(m_GetPar());
}
else if(mStrEqu(Token_Buf,"funtest1"))
{
r=funtest1(m_GetPar(),m_GetPar());
}
else if(mStrEqu(Token_Buf,"funtest2"))
{
r=funtest2((U8*)m_GetPar(),(U8*)m_GetPar());
}
else
{
usmart_sendstr("没找到!\r\n");
}
//--------------------显示运行结果
usmart_sendstr("=");
usmart_sendnum(r);
usmart_sendstr("\r\n");
}
源码
工程
运行效果
--------------------------------------------------------------------------
20200219:解决16进制参数的BUG,重新上传一下代码:
串口助手发字符串示例:
funtest1(-1,'1')
funtest1(0b11,0x01)
funtest2("hello\r\nabc","def")
usmart_setbase(2)
usmart_setbase(16)
usmart_setbase(10)
串口助手收到:
函数:funtest1()=48
函数:funtest1()=4
函数:funtest2()hello
abcdef=1234
函数:usmart_setbase()=0b10
函数:usmart_setbase()=0x10
函数:usmart_setbase()=10
标记下,有空看,已收藏! 支持一下,感谢分享 谢谢分享 这个和RT-Thtrad的shell操作类似,是个好东西,方便!可以直接变成api接口! duxingkei 发表于 2020-2-19 08:56
这个和RT-Thtrad的shell操作类似,是个好东西,方便!可以直接变成api接口!
这2者只要1个就行了,有了RTT的SHELL,就不需要再搞这个了。。
目前好象没有人把SHELL单独拆出来。。
学习一下。 收藏,学习,谢谢。 本帖最后由 lcw_swust 于 2020-2-19 12:02 编辑
fxhfxh 发表于 2020-2-19 11:35
收藏,学习,谢谢。
不好意思啊各位,刚解决了一个BUG,在1楼帖子的最后加上了改后的程序。 lcw_swust 发表于 2020-2-19 12:01
不好意思啊各位,刚解决了一个BUG,在1楼帖子的最后加上了改后的程序。 ...
谢谢告知,重新下载了,谢谢。 谢谢分享,学习学习 谢谢楼主分享 谢谢楼主分享~~ 收藏,学习,谢谢。
页:
[1]