Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
rt_mq_消息队列_msg_queue
10
多线程编程时不定长消息队列的用法咨询
发布于 2021-08-21 16:03:52 浏览:1515
订阅该版
是这样的,我想通过RTT实现一个下位机,它可以接收来自RS232、RS485和其它串口模块的数据,并给出响应。我的想法在串口中断中接收数据,然后通过消息队列发送到数据接收线程,然后将接收到的数据通过消息队列,发送到统一的数据处理线程对数据进行处理。大概的示意图如下: ![1.png](https://oss-club.rt-thread.org/uploads/20210821/baecd751f3232b25b513eb4aa83da8ce.png) 用RS232的数据来举个例子,RS232数据来了以后触发串口中断,然后通过消息队列发送到RS232的数据接收线程,该线程按照我的交互协议格式对接收的数据进行接收,当一帧数据接收完成以后,就发送一个不定长度的消息给数据处理线程(使用动态内存分配),通知数据处理线程对RS232的数据进行处理,数据处理线程接收到不定长度的消息以后,将消息取出,然后释放消息的内存,最后对取出的消息进行处理给出响应结果。 不知道我这种思路是否合理呢?刚从裸机切换到RTOS,老感觉不放心,请大佬们指教。我将部分关键代码贴出来,如下: ``` typedef struct { rt_uint8_t from; /* 消息来源:FROM_RS232、485... */ rt_uint8_t *data_ptr; /* 数据块首地址 */ rt_uint32_t data_size; /* 数据块大小 */ }S_MSG, *P_MSG; /* RS232串口接收中断 */ void USART2_IRQHandler(void) { uint8_t data; rt_err_t res; rt_interrupt_enter(); if(USART_GetITStatus(USART2, USART_INT_RDNE) != RESET) { data = USART_ReceiveData(USART2); res = rt_mq_send (rs232_recv_mq, &data, 1);/* 发送一个字节的消息给RS232数据接收线程,同时该消息队列也可以作为数据接收缓冲区防止丢包 */ if( res != RT_EOK ) { while(1); } } rt_interrupt_leave(); } /* RS232数据接收线程 */ void rs232_thread_entry(void *p) { rt_err_t res; uint8_t data; S_MSG msg_ptr; while(1) { res = rt_mq_recv(rs232_recv_mq, &data, 1, RT_WAITING_FOREVER); if( res == RT_EOK ) { ....这里有一些协议的判断被省略了,这不重要,总之就是判断一帧数据接收完成... if( rs232_port.recv_len == length + 3 )/* 到这里表示一帧数据接收完成了 */ { msg_ptr.data_size = rs232_port.recv_len;/* 记录数据长度 */ msg_ptr.from = FROM_RS232; /* 记录数据源 */ msg_ptr.data_ptr = rt_malloc(msg_ptr.data_size);/* 为不定长度的消息数据区分配内存 */ if( msg_ptr.data_ptr == RT_NULL ) { while(1); } rt_memcpy(msg_ptr.data_ptr, rs232_port.recv_buff, msg_ptr.data_size);/* 数据拷贝 */ res = rt_mq_send(host_msg_mq, &msg_ptr, sizeof(msg_ptr));/* 发送消息给数据处理线程 */ if( res != RT_EOK ) { rt_free(msg_ptr.data_ptr); while(1); } } } } } /* 数据处理线程 */ void host_if_thread_entry(void *p) { rt_err_t res; P_HOST p_host = &host_handle; S_MSG msg_ptr; while(1) { res = rt_mq_recv(host_msg_mq, &msg_ptr, sizeof(msg_ptr), RT_WAITING_FOREVER);/* 接收不定长消息 */ if( res == RT_EOK ) { rt_memcpy(p_host->recv_buff, msg_ptr.data_ptr, msg_ptr.data_size);/* 将消息取出,释放消息内存 */ p_host->recv_len = msg_ptr.data_size; p_host->msg.from = msg_ptr.from; rt_free(msg_ptr.data_ptr); host_if_handle(p_host);/* 数据处理 */ if( p_host->msg.from == FROM_RS232 )/* 返回应答 */ { rs232_send_data(p_host->send_buff, p_host->send_len); } } } } ```
查看更多
出出啊
2021-08-21
恃人不如自恃,人之为己者不如己之自为也
``` typedef struct { rt_uint8_t from; /* 消息来源:FROM_RS232、485... */ rt_uint8_t *data_ptr; /* 数据块首地址 */ rt_uint32_t data_size; /* 数据块大小 */ }S_MSG, *P_MSG; ``` 因为消息体内传送的是内存地址,所以,发送者和接收者不能同时访问这块内存。 由以上可以得出,发送消息时不能使用重复的内存。所以它必须申请新内存。 但是,如果发送比接收快,某些消息被丢弃,这个申请的内存也得释放掉。
3
个回答
默认排序
按发布时间排序
cheung
2022-07-28
实事求是
好东西,值得产品级借鉴
jizhongbiao
2022-07-29
这家伙很懒,什么也没写!
自己实现一个环形缓冲区,中断中入队。然后开一个线程定时解析缓冲区里面的数据后再用系统自带的消息队列转发到其它线程是否更好一点。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.5k
关于作者
BruceTan
这家伙很懒,什么也没写!
提问
17
回答
31
被采纳
1
关注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
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部