OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4324|回复: 3

分享51单片机的usmart程序(usmart51)

[复制链接]

10

主题

3098

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7803
金钱
7803
注册时间
2020-5-11
在线时间
3274 小时
发表于 2020-6-1 13:05:01 | 显示全部楼层 |阅读模式
参照正点原子的USMART,我写了个用于51单片机的类似程序,附件中的usmart51.c。
没能直接移植,因为水平有限,看到函数指针头大,在传递参数时始终编译出错。
说下我的方案:
  串口接收中断调用usmart_rx(),收到\r字符认为是一帧数据,然后调用
  usmart_proc()处理串口数据,解析函数名称、转换参数、调用函数、显示返回值。
注意:此程序仅供娱乐,因为有BUG。
  所用单片机为STC15W408AS,默认参数;
  编译器:KEIL2


如串口收到字符串
        funtest1(-1,'1')
程序将调用funtest1函数并传递参数、显示返回值,
参数支持10进制、2进制和16进制。
usmart_setbase用于设置usmart_sendnum所用的进制。
注意事项:
        *文件需包含MSTRING.C,用于字符串的处理
        *指令以回车换行结尾;
        *如果串口未使用队列,串口助手向单片机
         发送数据只能一次一行发送(回车换行结尾),否则后面的指令
         会覆盖先前的,引起错误。       
        *若占用内存较多,在Target/options for Target/Target/Memory Model里要选择Large
        串口助手发字符串示例:
       
funtest1(-1,'1')
funtest1(0b11,0x01)
        funtest2("hello\r\nabc","def")
       
        usmart_setbase(2)
        usmart_setbase(16)
        funtest1(65535,0)
        usmart_setbase(10)

串口助手收到:
函数:funtest1()=48
函数:funtest1()=4
函数:funtest2()hello
abcdef=1234
函数:usmart_setbase()=0b10
函数:usmart_setbase()=0x10
函数:funtest1()=0xFFFF
函数:usmart_setbase()=10

移植注意修改:
        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());//每个参数一个m_GetPar()
                }


USMART51.rar (161.19 KB, 下载次数: 25)
专治疑难杂症
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

3098

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7803
金钱
7803
注册时间
2020-5-11
在线时间
3274 小时
 楼主| 发表于 2023-8-4 10:06:55 | 显示全部楼层
20230803:解决mStrEqu()的BUG:str1更短也返回1。
stm32-usmart51.rar (966.19 KB, 下载次数: 1)
专治疑难杂症
回复 支持 1 反对 0

使用道具 举报

31

主题

2176

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14151
金钱
14151
注册时间
2018-8-3
在线时间
1143 小时
发表于 2020-6-1 18:02:57 | 显示全部楼层
谢谢分享!!
回复 支持 反对

使用道具 举报

10

主题

3098

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7803
金钱
7803
注册时间
2020-5-11
在线时间
3274 小时
 楼主| 发表于 2023-7-8 14:45:06 | 显示全部楼层
本帖最后由 LcwSwust 于 2023-7-8 14:47 编辑

20230708 做了一些改进。移植注意:
        工程添加C文件:<usmart51_cfg.c>,<usmart51_str.c>,<usmart51.c>;
         main.c中 #include "usmart51.h";
        usmart_sendbyte 在<usmart51.h>中定义;
        串口接收中断调用usmart_rx();
        主循环里加上这一句:usmart_proc();        
        用户修改<usmart51_cfg.c>中usmart_exe()内的代码,匹配自己的函数。

20230131:
        增加文件"usmart51_cfg.c",便于用户自行修改调用函数。
        
20230629:
        添加函数清单功能;
        简化用户配置;
        解决负数显示处理;
        提前解析参数,防止ARM单片机参数顺序颠倒。

20230703:
        改进usmart_sendnum,减少内存占用。
20230708:
        改进工程结构,便于模块化。

        增加STM32工程例子。
Program Size: data=85.0 xdata=120 code=4238

STC15DB-usmart1.2.rar (74.59 KB, 下载次数: 2)
专治疑难杂症
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-9 04:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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