Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
rt_mq_消息队列_msg_queue
消息队列在线程间传输消息后使用串口打印乱码
发布于 2023-10-28 14:19:04 浏览:526
订阅该版
BUG反馈 学习消息队列时,手写一个简单的消息队列案例,发现串口打印出乱码,字符编码设置都是utf-8。 ```c /* * Copyright (c) 2006-2023, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2023-10-26 RT-Thread first version */ #include
#include
#define DBG_TAG "main" #define DBG_LVL DBG_LOG #include
rt_thread_t th1 = RT_NULL; rt_thread_t th2 = RT_NULL; rt_mq_t mq = RT_NULL; const char *str1 = "ABCDE"; const char *str2 = "abcde"; void th1_entry(void *arg) { rt_err_t ret = -1; char buf[32]; while (1) { //成功返回0, 不返回接收消息的长度 ret = rt_mq_recv(mq, buf, sizeof(buf), RT_WAITING_FOREVER); rt_kprintf("th1->%s,len->%d\n", buf, ret); } } void th2_entry(void *arg) { rt_kprintf("5秒钟之后发送邮箱\n"); rt_thread_mdelay(5000); rt_kprintf("发送邮箱\n"); //发送的是一个指针 rt_mq_send(mq, str1, strlen(str1)); rt_mq_send(mq, str2, strlen(str2)); } int main(void) { mq = rt_mq_create("mq", 32, 10, RT_IPC_FLAG_PRIO); if (RT_NULL == mq) { LOG_E("rt_mq_create failed...\n"); return -RT_ERROR; } th1 = rt_thread_create("th1", th1_entry, RT_NULL, 512, 20, 10); if (th1 != RT_NULL) { rt_thread_startup(th1); } th2 = rt_thread_create("th1", th2_entry, RT_NULL, 512, 20, 10); if (th2 != RT_NULL) { rt_thread_startup(th2); } return RT_EOK; } ``` ![消息队列串口打印结果.png](https://oss-club.rt-thread.org/uploads/20231028/a66d16dcbf9a11835053190621aebe37.png) 排查后个人觉得是系统bug。在rt_mq_create创建一个消息队列时,为消息池每个消息节点初始化后没有使用memset清0,导致调用rt_mq_send_wait时 执行到rt_memcpy(msg + 1, buffer, size);只拷贝size个数据,其他未清零的数据在rt_mq_recv函数中被rt_memcpy(buffer, msg + 1, size > mq->msg_size ? mq->msg_size : size);原样拷贝给buffer,所以打印出了乱码。 并且rt_mq_recv成功接收消息时返回0,与文档描述(返回接收字符个数)不符。 解决:我在rt_mq_send_wait函数的rt_memcpy(msg + 1, buffer, size);语句之前添加memset(msg + 1, 0, mq->msg_size);语句,头文件添加#include
后问题得到解决。 ![修改.png](https://oss-club.rt-thread.org/uploads/20231028/9e20f823d7d1339984a37d2f674d3afe.png.webp) ![修改后结果.png](https://oss-club.rt-thread.org/uploads/20231028/cc630a7f23e4e2a0c22beb992b25e052.png)
查看更多
3
个回答
默认排序
按发布时间排序
JonasWen
2023-10-28
这家伙不懒,但是什么也不想写!
`并且rt_mq_recv成功接收消息时返回0,与文档描述(返回接收字符个数)不符。` 这个是5.0之后某个版的更新,你用的4.0.3,返回值应该只有错误码 `C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。` 打印乱码是因为没有字符串结束符,消息队列只拷贝了你传入的参数长度,然后缓冲区的内存也没有初始化过,所以会有乱码。 不改动ipc代码的情况下修改发送消息队列的函数为`rt_mq_send(mq, str1, strlen(str1) + 1);`就不会打印乱码了
张世争
2023-10-28
学以致用
- 发送的什么消息,就接收什么消息,消息队列并不存在问题 - 建议在发送字符串时,手动处理一下,如发送的长度为字符串长度加一试试。 - 还有一种改法:消息队列创建后,手动一次性清零处理,免得 malloc 的消息队列池子中有脏数据
哈喽你好啊
2023-10-29
这家伙很懒,什么也没写!
消息对接接收的只是一个指针,至于指针要怎么处理,这个是你自己要定义好的。比如你需要手动清除这段内存。同意楼上说的消息队列并没有问题
撰写答案
登录
注册新账号
关注者
0
被浏览
526
关于作者
DMeng
这家伙很懒,什么也没写!
提问
1
回答
0
被采纳
0
关注TA
发私信
相关问题
1
rt_object_init中报assertion failed错误?
2
在 MDK中的NANO 里创建消息队列失败,内存堆已开启
3
如何用消息队列传递结构体数据
4
消息队列满了以后接收乱码
5
消息队列传输不定长数据
6
使用消息队列在线程中发送总失败
7
初始化第二个消息队列时发生硬件错误
8
rtthread消息队列一对多的情况
9
消息队列为什么会出现获取到的内容有旧的数据?
10
通过消息队列名称,获取消息队列句柄
推荐文章
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
简单两步配置RTT源码阅读环境 vsc+clangd
2
恩智浦[FRDM-MCXN947]初探 之 ADC与DAC
3
LVGL使用字库IC芯片显示中文
4
基于STM32H750和Rt-Thread的CANFD通信实现的记录(一)
5
freemodbus主机在freertos的适配,参考rtthread例程
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部