OpenEdv-开源电子网

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

rt-thread消息队列没有接收长度的吗??

[复制链接]

2

主题

11

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-7-27
在线时间
6 小时
发表于 2020-10-20 10:11:55 | 显示全部楼层 |阅读模式
1金钱
为啥发送消息要有消息长度,接收消息却没有消息长度,怎么才能知道接收到的消息长度呢?

最佳答案

查看完整内容[请看2#楼]

你是想获取队列里缓存着的消息的长度是吧? 按API风格,它应该是用来收发定长的的消息。 要想收发不定长的消息应该要自己封装一下:比如每次发主体消息前,先发这个消息的长度再发主体消息,接收也要分两次进行,先收长度再按长度收主体消息。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-10-20 10:11:56 | 显示全部楼层
我本人 发表于 2020-10-21 16:42
这个长度不是buffer的长度吗?如果是消息的长度,应该要传地址吧?传个变量怎么能获取到长度

你是想获取队列里缓存着的消息的长度是吧?
按API风格,它应该是用来收发定长的的消息。
要想收发不定长的消息应该要自己封装一下:比如每次发主体消息前,先发这个消息的长度再发主体消息,接收也要分两次进行,先收长度再按长度收主体消息。
回复

使用道具 举报

22

主题

2264

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4437
金钱
4437
注册时间
2013-4-22
在线时间
332 小时
发表于 2020-10-20 11:08:24 | 显示全部楼层
通过接收完成判断为结束,自己数到底收到多少字节
回复

使用道具 举报

5

主题

269

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2020-5-11
在线时间
252 小时
发表于 2020-10-20 17:09:30 | 显示全部楼层
接收后sizeof
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-7-27
在线时间
6 小时
 楼主| 发表于 2020-10-21 10:18:18 | 显示全部楼层
三叶草 发表于 2020-10-20 11:08
通过接收完成判断为结束,自己数到底收到多少字节

接收的数据有0的话也用不了strlen啊,接收的数组也是自己定的。
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-7-27
在线时间
6 小时
 楼主| 发表于 2020-10-21 10:20:14 | 显示全部楼层

sizeof怎么算接收的长度,不知道接收的长度,我只能用个数组去接收,sizeof出来也是你整个数组的长度,而不是接收到的长度啊
回复

使用道具 举报

22

主题

2264

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4437
金钱
4437
注册时间
2013-4-22
在线时间
332 小时
发表于 2020-10-21 11:18:42 | 显示全部楼层
我本人 发表于 2020-10-21 10:18
接收的数据有0的话也用不了strlen啊,接收的数组也是自己定的。

又不是让你判断字符串长度;是让你计数接收的长度;通信怎么处理这个也怎么处理就可以了
回复

使用道具 举报

5

主题

269

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2020-5-11
在线时间
252 小时
发表于 2020-10-21 13:27:10 | 显示全部楼层
抱歉我理解错了。也可以像一些协议一样。固定包头+数据的长度+数据。这样传输的话解析就知道长度了
回复

使用道具 举报

3

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-10-21 13:38:30 | 显示全部楼层
接收消息的函数原型rt_err_t rt_mq_recv (rt_mq_t mq, void *buffer, rt_size_t size, rt_int32_t timeout)上有消息长度呀
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-7-27
在线时间
6 小时
 楼主| 发表于 2020-10-21 16:42:42 | 显示全部楼层
ufbycd 发表于 2020-10-21 13:38
接收消息的函数原型rt_err_t rt_mq_recv (rt_mq_t mq, void *buffer, rt_size_t size, rt_int32_t timeout) ...

这个长度不是buffer的长度吗?如果是消息的长度,应该要传地址吧?传个变量怎么能获取到长度
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-7-27
在线时间
6 小时
 楼主| 发表于 2020-10-21 16:49:12 | 显示全部楼层
三叶草 发表于 2020-10-21 11:18
又不是让你判断字符串长度;是让你计数接收的长度;通信怎么处理这个也怎么处理就可以了

我问他就是怎么计数接收的长度啊。。。接收函数原型是这样rt_err_t rt_mq_recv (rt_mq_t mq, void *buffer, rt_size_t size, rt_int32_t timeout),接收完数据就都在buffer里了,没法算接收的长度,你意思是改他的接收函数?
回复

使用道具 举报

22

主题

2264

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4437
金钱
4437
注册时间
2013-4-22
在线时间
332 小时
发表于 2020-10-21 19:38:38 | 显示全部楼层
我本人 发表于 2020-10-21 16:49
我问他就是怎么计数接收的长度啊。。。接收函数原型是这样rt_err_t rt_mq_recv (rt_mq_t mq, void *buffe ...

是的,一般你发多少接收就是多少,要不就等就收完成,你做个判断
回复

使用道具 举报

3

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-10-22 09:20:30 | 显示全部楼层
三叶草 发表于 2020-10-21 19:38
是的,一般你发多少接收就是多少,要不就等就收完成,你做个判断

这种消息队列是用来处理定长的消息的;虽然不同的队列间可以不定长,但同一个队列的消息是定长的。
要想在同一个队列收发不定长的消息可以按我上一楼的描述去封装一下。
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-7-27
在线时间
6 小时
 楼主| 发表于 2020-10-22 16:12:26 | 显示全部楼层
ufbycd 发表于 2020-10-21 16:55
你是想获取队列里缓存着的消息的长度是吧?
按API风格,它应该是用来收发定长的的消息。
要想收发不定 ...

嗯嗯,这样也可以吧
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-5-29 12:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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