lcw_swust 发表于 2020-2-18 21:57:58

山寨版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

PCBBOY1991 发表于 2020-2-18 22:08:13

标记下,有空看,已收藏!

luzj05 发表于 2020-2-18 22:12:39

支持一下,感谢分享

cumthe 发表于 2020-2-18 22:21:32

谢谢分享

duxingkei 发表于 2020-2-19 08:56:32

这个和RT-Thtrad的shell操作类似,是个好东西,方便!可以直接变成api接口!

kinsno 发表于 2020-2-19 09:05:46

duxingkei 发表于 2020-2-19 08:56
这个和RT-Thtrad的shell操作类似,是个好东西,方便!可以直接变成api接口!

这2者只要1个就行了,有了RTT的SHELL,就不需要再搞这个了。。

目前好象没有人把SHELL单独拆出来。。




dongwang_fl 发表于 2020-2-19 09:07:49

学习一下。

fxhfxh 发表于 2020-2-19 11:35:49

收藏,学习,谢谢。

lcw_swust 发表于 2020-2-19 12:01:02

本帖最后由 lcw_swust 于 2020-2-19 12:02 编辑

fxhfxh 发表于 2020-2-19 11:35
收藏,学习,谢谢。

不好意思啊各位,刚解决了一个BUG,在1楼帖子的最后加上了改后的程序。

fxhfxh 发表于 2020-2-19 12:08:34

lcw_swust 发表于 2020-2-19 12:01
不好意思啊各位,刚解决了一个BUG,在1楼帖子的最后加上了改后的程序。 ...

谢谢告知,重新下载了,谢谢。

kkey 发表于 2020-2-20 01:51:04

谢谢分享,学习学习

honger518 发表于 2020-2-20 08:36:09

谢谢楼主分享

qjp1988113 发表于 2020-3-13 21:02:21

谢谢楼主分享~~

qinyuming452 发表于 2020-4-7 09:36:07

收藏,学习,谢谢。
页: [1]
查看完整版本: 山寨版USMART用于51单片机