OpenEdv-开源电子网

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

USMART源码请教!困扰了好几天了。。。。

[复制链接]

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-5-29
在线时间
10 小时
发表于 2013-6-27 15:35:43 | 显示全部楼层 |阅读模式
usmart_get_fname(u8*str,u8*fname,u8 *pnum,u8 *rval)这个函数的功能是提取函数的信息,里面有如下的代码:
//判断函数是否有返回值
strtemp=str;                                                                                                                     
while(*strtemp!='\0')//没有结束
{
if(*strtemp!=' '&&(pcnt&0X7F)<5)//最多记录5个字符
{
if(pcnt==0)pcnt|=0X80;//置位最高位,标记开始接收返回值类型
if(((pcnt&0x7f)==4)&&(*strtemp!='*'))break;//最后一个字符,必须是*
fpname[pcnt&0x7f]=*strtemp;//记录函数的返回值类型
pcnt++;
}else if(pcnt==0X85)break;
strtemp++; 


里面标红的两行我一直无法理解,比如我在串口助手输入:delay_ms(10),调用延时函数,那么上面的程序是如何判断这个函数有没有返回值的呢?????

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-5-29
在线时间
10 小时
 楼主| 发表于 2013-6-27 16:24:49 | 显示全部楼层
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-27 16:50:24 | 显示全部楼层
这里有点小bug.
这里我当时写的时候,只考虑了u8/u16/u32以及void*,这几种类型,也就是如果出现返回值类型为4个字符,那么必须是void *类型,不存在其他情况.
所以第5个必须为*,但是实际上有可能用户用:int,short,long,unsigned char,unsigned int....等等.
所以这里引出了一个问题,就是usmart使用的时候,函数的返回值,不要定义以上这些不支持的....定义成u8,u16,u32就OK了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-5-29
在线时间
10 小时
 楼主| 发表于 2013-6-27 17:18:19 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
如果是这样,倒不如让用户来管理函数是否需要返回值,可以在_m_usmart_nametab结构体中添加一个标志函数返回值信息的数据,这样用户费一点事情,但是却可以减少USMART的代码量
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-27 19:32:10 | 显示全部楼层
回复【4楼】chenxujiaoyang:
---------------------------------
我们的目的就是简化用户的操作.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-7-29
在线时间
0 小时
发表于 2013-8-15 18:38:40 | 显示全部楼层
回复【楼主位】chenxujiaoyang:
---------------------------------
请问,存放在USART_RX_BUF的不是字符串“delay_ms(10)”吗? strtemp指向该数组,我始终看不明白为什么是判断里面存着"void" "*"什么的
回复 支持 反对

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-7-29
在线时间
0 小时
发表于 2013-8-15 18:50:31 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
请问,存放在USART_RX_BUF的不是字符串“delay_ms(10)”吗? strtemp指向该数组,我始终看不明白为什么是判断里面存着"void" "*"什么的
我在usmart_get_fname()函数里 strlen了str数组的长度,还是12.。。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-15 19:43:46 | 显示全部楼层
回复【6楼】我帮你打水:
---------------------------------
USART_RX_BUF的字符串不是固定的,你电脑发什么就收到什么。
void*是返回值的一种,有void,也有void*,所以都需要进行判断。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-7-29
在线时间
0 小时
发表于 2013-8-15 20:28:12 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
不是,我说的意思是如果我跟楼主一样,在串口助手里输入“delay_ms(10)"的话,usmart_get_fname()里提取接收到的函数的信息,接收到的数组不是”delay_ms(10)"吗? 
 
while(*strtemp!='\0')//没有结束
{
if(*strtemp!=' '&&(pcnt&0X7F)<5)//最多记录5个字符
{
if(pcnt==0)pcnt|=0X80;//置位最高位,标记开始接收返回值类型
if(((pcnt&0x7f)==4)&&(*strtemp!='*'))break;//最后一个字符,必须是*
fpname[pcnt&0x7f]=*strtemp;//记录函数的返回值类型
pcnt++;
}else if(pcnt==0X85)break;
strtemp++; 

if(pcnt)//接收完了
{
fpname[pcnt&0x7f]='\0';//加入结束符
if(usmart_strcmp(fpname,"void")==0)*rval=0;//不需要返回值
else *rval=1;    //需要返回值
pcnt=0;


在这里就是strtemp数组里装得是"delay_ms(10)",这个数组里面为什么会是判断“*strtemp!='*'”,fpname为什么会是跟“void"比较呢?
按程序说的,strtemp里面装的必须是”void*" ,才能继续运行啊?
纠结了老半天看不出个所以然来。。。。。求指点
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-15 20:44:52 | 显示全部楼层
回复【9楼】我帮你打水:
---------------------------------
如果发送的是delay_ms,那么收到的就是这个。
判断返回值,主要是针对 usmart_nametab里面的字符串函数参数来说的。
具体要不要返回值,也是靠这个来决定,比如"void delay_ms(u16 nms)",说明是void类型,不需要返回值的。
struct _m_usmart_nametab usmart_nametab[]=
{
#if USMART_USE_WRFUNS==1  //如果使能了读写操作
(void*)read_addr,"u32 read_addr(u32 addr)",
(void*)write_addr,"void write_addr(u32 addr,u32 val)",  
#endif    
(void*)delay_ms,"void delay_ms(u16 nms)",
  (void*)delay_us,"void delay_us(u32 nus)", 

对于串口接收到的数据来说,这个判断其实是多余的,但是没关系,这里得出的结果总是无需返回值的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

21

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2013-4-12
在线时间
0 小时
发表于 2013-9-25 20:45:30 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥现在对这个bug有优化吗?
自由的代价永远是警惕!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-25 22:45:20 | 显示全部楼层
回复【11楼】西北风:
---------------------------------
没有进行优化。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-13 05:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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