amobbs.com 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
回复: 13

山寨版USMART用于51单片机

[复制链接]
(12631254)

打赏出0元收入0元

发表于 2020-2-18 21:57:58 | 显示全部楼层 |阅读模式
本帖最后由 lcw_swust 于 2020-2-19 11:58 编辑

引用原文“USMART是由ALIENTEK开发的一个灵巧的串口调试互交组件,通过 它,
你可以通过串口助手调用程序里面的任何函数,并执行”
坛内相关帖子介绍:
https://www.amobbs.com/forum.php ... mp;highlight=usmart
-------------------
USMART真不错,把函数指针玩得出神入化。
参照正点原子的USMART,我写了个用于51单片机的类似程序,附件中的usmart51.c。
没能直接移植,因为水平有限,看到函数指针头大,在传递参数时始终编译出错。
说下我的方案:
  串口接收中断调用usmart_rx(),收到\r字符认为是一帧数据,然后调用
  usmart_proc()处理串口数据,解析函数名称、转换参数、调用函数、显示返回值。
注意:此程序仅供娱乐,因为有BUG。
  所用单片机为STC15W408AS,默认参数;
  编译器:KEIL2
  1. 移植注意修改:
  2.         usmart_sendbyte、usmart_sendstr、
  3.         串口接收中断调用usmart_rx()、
  4.         主循环里加上这一段:
  5.                 if(usmartflag&BIT(0))//收到一帧数据
  6.                 {
  7.                         IOCLR(usmartflag,BIT(0));//清标志
  8.                         usmart_proc();//处理数据
  9.                 }
  10.        
  11.         usmart_proc里的匹配目标函数部分根据需要修改,比如:
  12.                 if(mStrEqu(Token_Buf,"funtest1"))
  13.                 {
  14.                         r=funtest1(m_GetPar(),m_GetPar());
  15.                 }
复制代码


  核心代码:
  1. //------------------------------------------------
  2. //处理usmart_rx收到的命令
  3. //------------------------------------------------
  4. void usmart_proc(void)
  5. {       
  6.         U32 r=0;       
  7.         //usmart_sendstr(usmartbuf_rx);//查看接收的字符串
  8.         //--------------------初始化
  9.         usmartrxn=0;//接收区计数清0,可在清0前作为长度用
  10.         Token_strp=0;//指针清0
  11.         Token_p=usmartbuf_rx;//Token_p指向接收区开始处       
  12.         //--------------------得到函数名
  13.         m_GetToken();//开头是函数名字
  14.         usmart_sendstr("函数:");
  15.         usmart_sendstr(Token_Buf);//发送函数名
  16.         usmart_sendstr("()");
  17.         //--------------------匹配目标函数,用户可自行修改,注意参数类型的强制转换
  18.         if(mStrEqu(Token_Buf,"usmart_setbase"))
  19.         {
  20.                 r=usmart_setbase(m_GetPar());
  21.         }
  22.         else if(mStrEqu(Token_Buf,"funtest1"))
  23.         {
  24.                 r=funtest1(m_GetPar(),m_GetPar());
  25.         }
  26.         else if(mStrEqu(Token_Buf,"funtest2"))
  27.         {
  28.                 r=funtest2((U8*)m_GetPar(),(U8*)m_GetPar());
  29.         }
  30.         else
  31.         {
  32.                 usmart_sendstr("没找到!\r\n");
  33.         }
  34.         //--------------------显示运行结果
  35.         usmart_sendstr("=");
  36.         usmart_sendnum(r);
  37.         usmart_sendstr("\r\n");
  38. }
复制代码


源码
STC15USMART-无队列.rar (48.49 KB)
(12630639)

打赏出0元收入0元

发表于 2020-2-18 22:08:13 | 显示全部楼层
标记下,有空看,已收藏!
(12630373)

打赏出0元收入0元

发表于 2020-2-18 22:12:39 | 显示全部楼层
支持一下,感谢分享
(12629840)

打赏出0元收入0元

发表于 2020-2-18 22:21:32 | 显示全部楼层
谢谢分享
(12591740)

打赏出0元收入0元

发表于 2020-2-19 08:56:32 | 显示全部楼层
这个和RT-Thtrad的shell操作类似,是个好东西,方便!可以直接变成api接口!
(12591186)

打赏出0元收入0元

发表于 2020-2-19 09:05:46 | 显示全部楼层
duxingkei 发表于 2020-2-19 08:56
这个和RT-Thtrad的shell操作类似,是个好东西,方便!可以直接变成api接口!

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

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




(12591063)

打赏出0元收入0元

发表于 2020-2-19 09:07:49 | 显示全部楼层
学习一下。
(12582183)

打赏出0元收入0元

发表于 2020-2-19 11:35:49 | 显示全部楼层
收藏,学习,谢谢。
(12580670)

打赏出0元收入0元

 楼主| 发表于 2020-2-19 12:01:02 | 显示全部楼层
本帖最后由 lcw_swust 于 2020-2-19 12:02 编辑
fxhfxh 发表于 2020-2-19 11:35
收藏,学习,谢谢。


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

打赏出0元收入0元

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

谢谢告知,重新下载了,谢谢。
(12530868)

打赏出0元收入0元

发表于 2020-2-20 01:51:04 | 显示全部楼层
谢谢分享,学习学习
(12506563)

打赏出0元收入0元

发表于 2020-2-20 08:36:09 | 显示全部楼层
谢谢楼主分享
(10560991)

打赏出0元收入0元

发表于 2020-3-13 21:02:21 | 显示全部楼层
谢谢楼主分享~~
(8442165)

打赏出0元收入0元

发表于 2020-4-7 09:36:07 | 显示全部楼层
收藏,学习,谢谢。
回帖提示: 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-7-14 02:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表