OpenEdv-开源电子网

标题: 怎样求消息队列的某条数据的长度? [打印本页]

作者: zhp    时间: 2016-9-7 09:34
标题: 怎样求消息队列的某条数据的长度?
本帖最后由 zhp 于 2016-9-7 10:38 编辑

看了原子哥的F4开发板的  “实验58 UCOSII实验3-消息队列、信号量集和软件定时器” 例程里面有求消息队列的大小 (OS_Q*)(q_msg->OSEventPtr))->OSQEntries但有时候我们
想知道收到的某条消息的具体长度,该怎么做?比如,我事先准备了10条消息队列内存,每条消息队列最大给分配的长度为100个字节,每次
实际发送的长度为0~100,那么接收端怎么得到每次实际发送数据的长度?  求助版主@zuozhongkai




作者: zuozhongkai    时间: 2016-9-7 11:49
我记得貌似函数返回值还是函数参数什么的就是消息长度,我电脑挂了,插不了资料了。你看一下接受数据的API函数
作者: zhp    时间: 2016-9-7 12:44
本帖最后由 zhp 于 2016-9-7 12:51 编辑
zuozhongkai 发表于 2016-9-7 11:49
我记得貌似函数返回值还是函数参数什么的就是消息长度,我电脑挂了,插不了资料了。你看一下接受数据的API ...

接收函数是这样的
void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err);
它返回接收消息的地址,但没有所接收消息的长度,现在需要用接收消息的长度,不知道该怎么做?
如果实在不行,我想的是,自己封装一个协议,比如, 帧头 ,数据长度, 数据,帧尾
0xA5, 0x12,0x34, xxxxxx, 0x5A
让发送方把消息长度包含在消息里,接收方解析时,自己去计算长度,不过稍显得麻烦,
不知道有没有哪里本身就带有消息的长度的?

作者: 未来,我来    时间: 2016-9-16 11:02
zhp 发表于 2016-9-7 12:44
接收函数是这样的
void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err);
它返回接收消息的 ...

你应该看一下UCOSIII,叫II而言,III 强大了一大截,我刚才实验了一下,
key=OSQPend((OS_Q*                        )&KEY_Msg,   
                                        (OS_TICK                )0,
                    (OS_OPT                        )OS_OPT_PEND_BLOCKING,
                    (OS_MSG_SIZE*        )&size,               
                    (CPU_TS*                )0,
                    (OS_ERR*                )&err);
这个函数中的size就是消息的字节数,很好用;嗯
作者: zhp    时间: 2016-9-18 15:01
未来,我来 发表于 2016-9-16 11:02
你应该看一下UCOSIII,叫II而言,III 强大了一大截,我刚才实验了一下,
key=OSQPend((OS_Q*                        )&KEY_Ms ...

谢谢你,我该了解UCOSIII了




欢迎光临 OpenEdv-开源电子网 (http://47.111.11.73/) Powered by Discuz! X3.4