通过Freertos中的队列发送字符串



我想创建一个带有按钮的任务,该任务向队列发送一个字符串,然后创建另一个任务(也可以是优先级较低的单独任务(,该任务读取队列,如果其变量与队列中的字符串相同,则闪烁。否则,系统应保持在空闲模式。我对freertos很陌生,即使没有编译错误,Led也不会对下面的代码眨眼。如果可能的话,我还想将数据类型从char替换为string。(select和zyRxBuff来自不同的来源,为了简单起见,如下所示(

#include "main.h"
#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"
#include "queue.h"

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

经办人;

QueueHandle_t myQueue = NULL;
TaskHandle_t QTASK1 = NULL;
TaskHandle_t QTASK2 = NULL;

原型;

void Qsender(void* p);
void Qreceiver(void* p);

主块;

int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_SET)
{
xTaskCreate(Qsender, "SendingTask", 200, NULL, 1, &QTASK1);
vTaskStartScheduler();
}
while (1) {};
}

发件人功能;

void Qsender(void* p)
{
char select[10]= "BlinkLed";
myQueue = xQueueCreate(1, sizeof(select));
xQueueSend(myQueue, (void*) &select, (TickType_t)10);
if (myQueue != 0)
{
xTaskCreate(Qreceiver, "ReceivingTask", 200, NULL, 1, &QTASK2);
}
}

接收器功能;

void Qreceiver(void* p)
{
char myRxBuff[10];
char zyRxBuff[10]="BlinkLed";
xQueueReceive(myQueue, &myRxBuff, (TickType_t)50);
if ( myRxBuff == zyRxBuff)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
HAL_Delay(500);
}
}

空闲功能;

void vApplicationIdleHook(void){__WFI();};

没有发生任何事情,因为程序执行速度可能太快,无法正常工作。当你的程序启动时,它会在几分之一秒内初始化所有内容,如果没有按下按钮,那么什么都不会发生。那么你的主循环什么也不做。至少,您应该将监视按钮放在任务中,并且该任务应该有一个不结束的whilefor循环。

首先创建一个更简单的系统,两个任务,一个按钮读取器和一个发光器。按钮读取器任务只是检查按钮是否被按下,并将项目插入队列中。发光器检查队列中是否有东西。

还应该注意的是,所有的RTOS都不喜欢一直创建和结束任务。如果你要这样做,你应该了解任务是如何创建和销毁的。(https://www.freertos.org/a00125.html)让一个任务断章取义并不会自动清除它,你需要使用vTaskDelete-对于你当前的函数,你需要用QSender任务清除QReceiver,这违反了SOLID原则。此外,您的QReceiver将需要发回一条消息,说明它已经完成。如果你能先让它们静态工作,那么以后让它们动态工作会容易得多。

我还注意到,您正在按地址而不是按内容来比较字符串。Qsender正在发送BlinkLed

void Qsender(void* p){
char select[10]= "BlinkLed";
myQueue = xQueueCreate(1, sizeof(select));
xQueueSend(myQueue, (void*) &select, (TickType_t)10);
if (myQueue){
xTaskCreate(Qreceiver, "ReceivingTask", 200, NULL, 1, &QTASK2);
}
}

然而,在Qreceiver中,您正在比较myRxBuffzyRxBuff的地址,而此时您应该进行字符串比较

void Qreceiver(void* p){
char myRxBuff[10];
char zyRxBuff[10]="BlinkLed";
xQueueReceive(myQueue, &myRxBuff, (TickType_t)50);
if ( myRxBuff == zyRxBuff){ // Offending Line
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
HAL_Delay(500);
}
}
void Qreceiver(void* p){
char myRxBuff[10];
char zyRxBuff[10]="BlinkLed";
xQueueReceive(myQueue, &myRxBuff, (TickType_t)50);
if ( strcmp(myRxBuff, zyRxBuff) == 0){ // Should compare content now
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
HAL_Delay(500);
}
}

最新更新