OpenEdv-开源电子网

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

请问,在战舰板子的RS485实验中,void RS485_Receive_Data(u8 *buf,u8 *len)函数,第二个参数用了指针参数,出于什么考虑呢

[复制链接]

22

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2016-9-26
在线时间
59 小时
发表于 2016-10-2 21:27:54 | 显示全部楼层 |阅读模式
1金钱
在战舰板子的RS485实验中,void RS485_Receive_Data(u8 *buf,u8 *len)函数,第二个参数用了指针参数,出于什么考虑呢,而在发送的函数中,第二个参数却没有用指针?谢谢大家!

void RS485_Receive_Data(u8 *buf,u8 *len)
{
        u8 rxlen=RS485_RX_CNT;
        u8 i=0;
。。。
       
        if(rxlen==RS485_RX_CNT&&rxlen)
        {
                。。。
               
        }
}

最佳答案

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-10-2 21:27:55 | 显示全部楼层
回复

使用道具 举报

22

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2016-9-26
在线时间
59 小时
 楼主| 发表于 2016-10-2 21:49:53 | 显示全部楼层
本帖最后由 lhshengshi 于 2016-10-2 21:51 编辑

oid RS485_Send_Data(u8 *buf,u8 len)
{                。。。。  
                while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);         
                USART_SendData(USART2,buf[t]);        
}
回复

使用道具 举报

22

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2016-9-26
在线时间
59 小时
 楼主| 发表于 2016-10-3 22:29:37 | 显示全部楼层

该程序我理解的不太透,可不可以简单分析一下使用指针参数和普通数据参数的区别?谢谢原子哥!
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-7-25
在线时间
29 小时
发表于 2016-10-20 11:44:02 | 显示全部楼层
lhshengshi 发表于 2016-10-3 22:29
该程序我理解的不太透,可不可以简单分析一下使用指针参数和普通数据参数的区别?谢谢原子哥!

对啊,帮顶,我也不懂如果不用指针的参数会有什么区别?新手上路,求不喷,谢谢谢谢
回复

使用道具 举报

22

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2016-9-26
在线时间
59 小时
 楼主| 发表于 2016-10-21 00:30:01 | 显示全部楼层
探囊取物,不管这个装物的囊是箱子、盒子、还是塑料袋,知道放在哪儿,拿过来,就摸的出来里面放的东西
回复

使用道具 举报

7

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2016-10-21
在线时间
43 小时
发表于 2016-10-21 14:34:01 | 显示全部楼层
因为这个是数据接收函数,函数执行完毕后要返回数据长度,只能通过指针才能修改len的数据。
回复

使用道具 举报

6

主题

305

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2876
金钱
2876
注册时间
2016-7-17
在线时间
404 小时
发表于 2016-10-21 20:58:38 | 显示全部楼层
本帖最后由 f1174562 于 2016-10-21 20:59 编辑

如果不用指针,在被调函数内的变量结果无法传递到主调函数中。使用指针或全局变量可以正常传输,但是一般不推荐使用全局变量,所以使用指针变量传递运算结果。
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2020-2-14
在线时间
15 小时
发表于 2016-11-24 21:40:53 | 显示全部楼层
lhshengshi 发表于 2016-10-2 21:49
oid RS485_Send_Data(u8 *buf,u8 len)
{                。。。。  
                while(USART_GetFla ...

不是应该先发数据,再判断标志位吗?
回复

使用道具 举报

8

主题

13

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-8-4
在线时间
16 小时
发表于 2017-2-17 19:30:52 | 显示全部楼层
lhshengshi 发表于 2016-10-2 21:49
oid RS485_Send_Data(u8 *buf,u8 len)
{                。。。。  
                while(USART_GetFla ...

  这个地方我也有点不懂,为什么是先判断了标志位后,再发送数据,没有发送数据的时候,TC位难道是1?我觉得把这个while放在发送数据后面是不是会好一点?求解释
回复

使用道具 举报

8

主题

13

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-8-4
在线时间
16 小时
发表于 2017-2-17 19:39:25 | 显示全部楼层
  还有一个问题,也就不开帖了,先发上来,看有人回没
  //RS485查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void RS485_Receive_Data(u8 *buf,u8 *len)
{
        u8 rxlen=RS485_RX_CNT;
        u8 i=0;
        *len=0;                                //默认为0
        delay_ms(10);                //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
        if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了
        {
                for(i=0;i<rxlen;i++)
                {
                        buf[i]=RS485_RX_BUF[i];       
                }               
                *len=RS485_RX_CNT;        //记录本次数据长度
                RS485_RX_CNT=0;                //清零
        }
}

  针对这个函数  这一句  delay_ms(10);                //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
  这个放到开头是不是会好一点,否则就算在这个时候进入了中断服务函数里,那接受完成后 后面的if条件不就不成立了吗,很奇怪,为什么这里会有一个延时,对于这个if判断条件也不是很懂。
回复

使用道具 举报

4

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
201
金钱
201
注册时间
2017-4-5
在线时间
24 小时
发表于 2017-4-25 20:54:17 | 显示全部楼层
对的啊,听力厉害的
回复

使用道具 举报

8

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2017-3-12
在线时间
27 小时
发表于 2017-6-19 00:56:43 | 显示全部楼层
楼主解决了吗 同惑
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2018-2-3
在线时间
16 小时
发表于 2018-6-2 11:58:53 | 显示全部楼层
zcc_super 发表于 2017-2-17 19:30
这个地方我也有点不懂,为什么是先判断了标志位后,再发送数据,没有发送数据的时候,TC位难道是1?我 ...

后面放的也有一个,没有发送完成为真会一直发送,知道发送完成,下面又判断了一次,
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2018-2-3
在线时间
16 小时
发表于 2018-6-2 12:01:17 | 显示全部楼层
zcc_super 发表于 2017-2-17 19:39
还有一个问题,也就不开帖了,先发上来,看有人回没
  //RS485查询接收到的数据
//buf:接收缓存首地址
...

我的理解是等待10MS确保接收完成,不然可能还没有接收完成就进入下次接收了
回复

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2018-8-8
在线时间
14 小时
发表于 2018-9-29 17:22:43 | 显示全部楼层
ldskendy 发表于 2016-10-21 14:34
因为这个是数据接收函数,函数执行完毕后要返回数据长度,只能通过指针才能修改len的数据。

函数的返回值类型为void,返回值为空啊
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2018-9-29 17:31:10 | 显示全部楼层
不是一定要从函数返回值才能返回数据,形参也是可以利用的
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2020-9-27
在线时间
15 小时
发表于 2020-12-1 21:47:51 | 显示全部楼层
a5820736 发表于 2018-9-29 17:31
不是一定要从函数返回值才能返回数据,形参也是可以利用的

学到了
回复

使用道具 举报

2

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2020-9-25
在线时间
54 小时
发表于 2021-2-4 19:41:54 | 显示全部楼层
a5820736 发表于 2018-9-29 17:31
不是一定要从函数返回值才能返回数据,形参也是可以利用的

学到了
人生中的贵人是不断努力的自己
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 13:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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