rtos,写入队列数据正常,读取队列数据异常

目的:
今日在学习编写rtos的队列的相关代码,想通过队列和事件组将dht11与oled连接起来,创建了queue_data和两个任务task_dht11和task_oled,以及一个eventGroup。


问题:
当dht11任务读取数据后,串口显示正常的数据,接着写数据进data队列,并使用事件组通知oled读取队列

数据类如:
40,26

40,26

40,26

当oled任务等待事件组成功后,读取队列的数据,然后串口显示读取的数据,发现是很大的负数类如: -1515870811,-1515913176

且不再读取队列的数据,

怀疑:

队列初始化问题

解决:

修改队列的大小,以及长度。

(1)在freertos.c的/* USER CODE BEGIN PD */中

#define MAX_QUEUE_SIZE 5
#define SENSOR_DATA_SIZE sizeof(SensorData)

(2)修改相关的队列参数

osMessageQueueId_t Q_DataHandle;
uint8_t Q_DataBuffer[ MAX_QUEUE_SIZE * SENSOR_DATA_SIZE ];
osStaticMessageQDef_t Q_DataBlock;
const osMessageQueueAttr_t Q_Data_attributes = {
  .name = "Q_Data",
  .cb_mem = &Q_DataBlock,
  .cb_size = sizeof(Q_DataBlock),
  .mq_mem = &Q_DataBuffer,
  .mq_size = sizeof(Q_DataBuffer)
};

(3)修改创建队列

	Q_DataHandle = osMessageQueueNew (MAX_QUEUE_SIZE, SENSOR_DATA_SIZE, &Q_Data_attributes);

结果:

数据成功发送以及接收

Keil RTX RTOS 提供了消息队列的支持。下面是使用消息队列的基本步骤: 1. 定义消息队列 消息队列可以是全局变量或局部变量。定义消息队列时需要指定消息队列的大小和消息的数据类型,例如: ``` #define MSGQUEUE_SIZE 16 osMessageQueueId_t msgQueue; uint32_t msgQueueBuffer[MSGQUEUE_SIZE]; const osMessageQueueAttr_t msgQueueAttr = { .name = "MsgQueue" }; msgQueue = osMessageQueueNew(MSGQUEUE_SIZE, sizeof(uint32_t), &msgQueueAttr); ``` 上面的代码定义了一个大小为 16 的消息队列,用于存储 uint32_t 类型的消息。消息队列的属性可以通过 osMessageQueueAttr_t 结构体来设置。 2. 发送消息到消息队列 发送消息时需要将消息数据写入到消息队列中,例如: ``` uint32_t msgData = 123; osStatus_t status = osMessageQueuePut(msgQueue, &msgData, 0, osWaitForever); if (status != osOK) { // 发送消息失败 } ``` 上面的代码将值为 123 的消息发送到消息队列中。osMessageQueuePut() 函数的第一个参数是消息队列 ID,第二个参数是指向消息数据的指针,第三个参数是消息的优先级,第四个参数是超时时间。 3. 接收消息 接收消息时需要从消息队列读取消息数据,例如: ``` uint32_t msgData; osStatus_t status = osMessageQueueGet(msgQueue, &msgData, NULL, osWaitForever); if (status != osOK) { // 接收消息失败 } ``` 上面的代码从消息队列读取一个消息,并将消息数据存储到 msgData 变量中。osMessageQueueGet() 函数的第一个参数是消息队列 ID,第二个参数是指向消息数据的指针,第三个参数是指向消息优先级的指针,第四个参数是超时时间。 以上就是使用 Keil RTX RTOS 消息队列的基本步骤。当然,在实际应用中,还需要根据具体的需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值