我有以下 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);
我需要的是在我的任務函式中獲取佇列中發送的引數,但我什么也沒得到。
有什么線索嗎?
uj5u.com熱心網友回復:
佇列用于一次發送/接收一項。如果您想發送/接收多個專案,您可能需要查看Stream Buffers 。
根據您的代碼,我將假設您要對完整的訊息進行排隊,而不是單個位元組,并且訊息的長度為 8。
首先,讓我們更新佇列創建代碼來為訊息分配空間,而不是位元組:
#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()以查看是否已收到資料:
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);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/440256.html
下一篇:條件定義變數(靜態if)
