Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
堆_heap_动态内存管理
rt_mq_消息队列_msg_queue
消息队列为什么会出现获取到的内容有旧的数据?
发布于 2020-11-27 09:54:14 浏览:1654
订阅该版
我有一个【接收线程】阻塞去【消息队列】中取数据,有数据就发送,没有就等待 我有一个【发送线程】不定时向【消息队列】中发数据,发送的内容不固定长度但不超过128byte 现象是我接收线程取读取是会出现含有旧数据 例如: 第一次发送"1234567890",10个,接收显示"1234567890",10个 第二次发送"abcde",5个,接收显示"abcde67890",10个 这就不对了,我以为是我发给【消息队列】发送buf或者接收接收buf没有清空, 加了清空后依然存在。 除此之外还有什么原因可能导致出现这样的问题? **补充:** 【发送线程】是我概念上的,因为所有发往服务器的数据都通过 【rt_mq_send(&tcp_client_mq, data, size);】发给tcp_client_send线程,统一发往服务器,而且有【串口线程】和【tcp客户端接收函数】调用【数据处理函数】后就 发消息到队列中,【定时器】触发后也会发送到队列中,发送位置1、2就在数据处理函数中的 ``` 发送位置1: case Report_Date:{//串口 要求 模块 上报属性 cJSON *root = cJSON_CreateObject(); cJSON *propert = cJSON_CreateObject(); cJSON_AddItemToObject(root, "propert", propert); cJSON_AddNumberToObject(root, "Order", 1); cJSON_AddStringToObject(root, "DeviceNo", "614ca5bc"); cJSON_AddStringToObject(root, "Name", "Wine cabinet"); cJSON_AddNumberToObject(root, "SerialNumber", 3); if(buf[index+4] == 1) cJSON_AddStringToObject(propert, "Switch", "On"); else if(buf[index+4] == 2) cJSON_AddStringToObject(propert, "Switch", "Off"); cJSON_AddNumberToObject(propert, "LightLevel", buf[index + 5]); cJSON_AddNumberToObject(propert, "Battery", buf[index + 6]); char* data_cjson = cJSON_Print(root); rt_kprintf("Send cJson data:[%s],%d",data_cjson,strlen(data_cjson)); rt_mq_send(&tcp_client_mq, data_cjson, strlen(data_cjson)); data_cjson = RT_NULL; cJSON_free(root); cJSON_free(propert); }break; 发送位置2: static void timeout_entry(void *parameter) {//15s定时器 sn++; if(sn>=0xffff) sn=0; cJSON_SetIntValue(item, sn); cJSON_SetNumberValue(item, sn); char* temp = cJSON_Print(heartbeat_root); rt_kprintf("[timeout_entry] data [%s],%d\n",temp,strlen(temp)); rt_mq_send(&tcp_client_mq,temp,strlen(temp)); rt_free(temp); } 发送位置3: case 99:{ char *d = cJSON_Print(root); rt_mq_send(&tcp_client_mq, d, strlen(d)); }break; 接收线程: void tcp_client_send_entry(void* parameter) { char msg_buf[NET_DATA_SIZE_MAX]={0}; int send_result; while(1) { //memset(msg_buf, 0, sizeof(msg_buf)); rt_mq_recv(&tcp_client_mq, &msg_buf[0], sizeof(msg_buf), RT_WAITING_FOREVER);//等待要发往服务器的数据 rt_kprintf("[tcp_client_send_entry] got mes [%s],%d,Socket:%d\n",msg_buf,strlen(msg_buf),server_socket); send_result = send(server_socket, msg_buf, strlen(msg_buf), 0); if(send_result <= 0) { if(send_result = 0) rt_kprintf("[tcp_client_send] Send warning, return 0\n"); if(send_result < 0) rt_kprintf("[tcp_client_send] socket error\n"); // closesocket(server_socket); // server_socket = -1; // rt_thread_delete(tcp_client_send_t); // tcp_client_send_t = RT_NULL; // return; } else//if(send_result > 0) { rt_kprintf("[tcp_client_send] send_result:%d\n",send_result); } for(rt_uint16_t i = 0; i < NET_DATA_SIZE_MAX; i++) msg_buf[i] = 0; } } //队列 #define NET_DATA_SIZE_MAX 128 static rt_uint8_t tcp_client_mq_pool[NET_DATA_SIZE_MAX*4];//最多存4 if (RT_EOK != rt_mq_init(&tcp_client_mq, "tcp_client_mq", &tcp_client_mq_pool[0], NET_DATA_SIZE_MAX, sizeof(tcp_client_mq_pool), RT_IPC_FLAG_FIFO)) { rt_kprintf("init tcp_client_mq failed.\n"); } ```
查看更多
小半仙
2020-11-28
这家伙很懒,什么也没写!
消息队列的接收函数,接收数据后没有清内存,要修改IPC的消息队列接收函数,这是一个bug
3
个回答
默认排序
按发布时间排序
yangjie
认证专家
2020-11-27
hello
应该是用法问题吧,发送和接收代码也贴出来看看呢
红枫
认证专家
2020-11-28
这家伙很懒,什么也没写!
rt_mq_recv前面的memset被注释掉的缘故,接收长度不是真实返回长度,是使用strlen计算所得
撰写答案
登录
注册新账号
关注者
0
被浏览
1.7k
关于作者
妮妮呓语小辣椒
这家伙很懒,什么也没写!
提问
3
回答
1
被采纳
0
关注TA
发私信
相关问题
1
rt_object_init中报assertion failed错误?
2
在 MDK中的NANO 里创建消息队列失败,内存堆已开启
3
如何用消息队列传递结构体数据
4
消息队列满了以后接收乱码
5
消息队列传输不定长数据
6
使用消息队列在线程中发送总失败
7
初始化第二个消息队列时发生硬件错误
8
rtthread消息队列一对多的情况
9
通过消息队列名称,获取消息队列句柄
10
使用官网文档的UART设备例程,队列接收满后怎么清队列?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【RT-Thread】记录一次对主仓的bsp进行修复并提交pr的总结
2
【请投票】嵌入式大赛Top10排名等你来选!
3
【24嵌入式设计大赛】HPM5300-EVK 网络测速仪
4
RT-Thread Nano 上线ST CubeMX
5
Nordic移植笔记: RT_Thread v5.1.0(基于Nordic nRF52840的ble_app_hids_mouse工程)
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
flash
packages_软件包
cubemx
PWM
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
socket
flashDB
GD32
中断
Debug
编译报错
msh
rt_mq_消息队列_msg_queue
keil_MDK
C++_cpp
ulog
at_device
SFUD
本月问答贡献
出出啊
1515
个答案
342
次被采纳
小小李sunny
1438
个答案
289
次被采纳
张世争
786
个答案
168
次被采纳
crystal266
546
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
6
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部