STM32
直播中

陈光琦

7年用户 936经验值
私信 关注
[问答]

用FreeRTOS使用队列怎么发送一个结构体呢?

在函数osMessageGet 只能返回一个4个字节啊。在xQueueReceive它只传了一个uint32_t  v啊,只有四个字节。
那就限制了最大的数据就是四个字节了,感觉应该不会是这样啊,那么我怎么使用队列,发送一个12个字节的结构体呢?


osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec)
{
  portBASE_TYPE taskWoken;
  tickType_t ticks;
  osEvent event;
...................
...............
  else {
    if (xQueueReceive(queue_id,  event.value.v, ticks) == pdTRUE) {
      /* We have mail */
  }
    return event;
}

typedef struct  {
  osStatus                 status;     ///< status code: event or error information
  union  {
    uint32_t                    v;     ///< message as 32-bit value
    void                       *p;     ///< message or mail as void pointer
    int32_t               signals;     ///< signal flags
  } value;   
union  {
    osMailQId             mail_id;     ///< mail id obtained by ref osMailCreate
    osMessageQId       message_id;     ///< message id obtained by ref osMessageCreate
  } def;                               ///< event definition



回帖(1)

张鑫

2024-4-17 16:52:43
在FreeRTOS中,队列的传输单元是一个字节,因此无法直接发送一个结构体。但是,你可以按照以下步骤发送结构体:

1. 在发送结构体之前,将结构体的内容拷贝到一个字节数组中,确保数组的大小足够容纳整个结构体。

2. 将字节数组作为消息发送到队列中。

3. 在接收队列的任务中,接收到消息后,可以将字节数组中的内容拷贝回结构体中。

这里是一个示例代码,说明了如何发送和接收一个结构体:

```c
// 定义一个结构体
typedef struct {
    int a;
    float b;
    char c;
} MyStruct;

// 定义结构体的大小
#define STRUCT_SIZE sizeof(MyStruct)

// 发送结构体到队列的任务
void sendTask(void const *argument) {
    MyStruct dataToSend = {10, 3.14f, 'A'};
    uint8_t buffer[STRUCT_SIZE];

    memcpy(buffer, &dataToSend, STRUCT_SIZE);

    if (xQueueSend(queue_id, buffer, 0) != pdPASS) {
        // 处理发送失败
    }

    osDelay(100);
}

// 接收队列中的结构体任务
void receiveTask(void const *argument) {
    uint8_t buffer[STRUCT_SIZE];

    for (;;) {
        if (xQueueReceive(queue_id, buffer, portMAX_DELAY) == pdPASS) {
            MyStruct receivedData;
            
            memcpy(&receivedData, buffer, STRUCT_SIZE);

            // 使用接收到的结构体数据
            printf("Received: a=%d, b=%.2f, c=%c", receivedData.a, receivedData.b, receivedData.c);
        }
    }
}
```

在上面的示例代码中,首先定义了一个名为`MyStruct`的结构体,并使用`STRUCT_SIZE`宏定义来表示结构体的大小。然后,在发送任务中,将结构体数据拷贝到`buffer`字节数组中,并使用`xQueueSend`函数将字节数组发送到队列中。在接收任务中,使用`xQueueReceive`函数接收队列中的字节数组,并将其拷贝回结构体中。接收到的结构体数据可以根据需要进行处理。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分