Arduino ESP32 FreeRTOS - 如何在任务中声明空字节数组

Arduino ESP32 FreeRTOS - How to declare empty byte array in task

我有以下 FreeRTOS 功能:

void UARTSendCommand(void *pvParameters)
{
  (void) pvParameters;
  uint8_t receive[];  //***** NEED TO DO A EMPTY ARRAY 
  for (;;) 
    {
      xSemaphoreTake(xCountingSemaphore, portMAX_DELAY);
      xQueueReceive(queue, &receive, 0);
      if(receive)
      {
        Serial.println("UART Send command received");
        uart_write_bytes(UARTNUM, (const char*) receive, sizeof(receive));
      }
      xSemaphoreGive(xCountingSemaphore);
      vTaskDelay(1);
  }
}

队列声明为:

 UARTSendQueue = xQueueCreate(10, sizeof(char));

当我发送到队列时,我这样做:

byte message[] = {0x5A, 0xA5, 0x05, 0x82, 0x20, 0x00, (gaugeImage >> 8) & 0xFF, gaugeImage & 0xFF };
      xSemaphoreTake(xCountingSemaphore, portMAX_DELAY); 
      xQueueSend(queue, &message, 0);
      xSemaphoreGive(xCountingSemaphore);

我需要的是在我的任务函数中获取队列中发送的参数,但我没有得到任何东西。

有线索吗?

队列一次用于 sending/receiving 一项。如果您想要 send/receive 多个项目,您可能需要查看 Stream Buffers

我假设您要对完整的消息进行排队,而不是单个字节,并且根据您的代码,消息的长度为 8。

首先,让我们更新队列创建代码,为消息分配 space,而不是字节:

#define MAX_MESSAGES 10
#define MESSAGE_LENGTH 8
#define MESSAGE_SIZE (MESSAGE_LENGTH * sizeof(char))

UARTSendQueue = xQueueCreate(MAX_MESSAGES, MESSAGE_SIZE);

您似乎在使用信号量来保护队列访问,但这不是必需的。要发送数据,只需执行以下操作:

xQueueSend(UARTSendQueue, message, 0);

接收端需要指定数组的大小。空数组在这里没有任何意义。您还应该检查xQueueReceive()的return类型,以查看是否已收到数据:

uint8_t message[MESSAGE_LENGTH];
for (;;) {
    BaseType_t received = xQueueReceive(UARTSendQueue, message, 0);
    if (received) {
        ...

请注意,我已从 message 中删除了 &,因为 message 是一个数组,它会自动衰减为指针。


编辑

在消息长度可变且有多个发送者的情况下,最简单的方法是动态分配消息缓冲区并将指向已分配内存的指针排队。

创建队列:

#define MAX_MESSAGES 10
#define MESSAGE_SIZE sizeof(char*)

UARTSendQueue = xQueueCreate(MAX_MESSAGES, MESSAGE_SIZE);

发送消息:

uint8_t *message = (uint8_t *)pvPortMalloc(messageSize)
// Populate the message with the data here.

// Using portMAX_DELAY here to avoid memory leak.
// If message must be dropped, free the memory.
xQueueSend(UARTSendQueue, &message, portMAX_DELAY);

接收消息:

uint8_t* message;
for (;;) {
    BaseType_t received = xQueueReceive(UARTSendQueue, &message, 0);
    if (received) {
        // Process the message
        // Free the memory
        vPortFree(message);
    }
}