TaskHandle_t NumTaskHandle; // 将任务句柄声明为全局变量
int Num = 5;
//对于结构体,您可以在全局作用域中声明一个结构体变量,但不能直接在那里赋值。赋值应该放在 setup() 或 loop() 函数中。
TaskHandle_t StcTaskHandle; // 修正类型名和变量名
typedef struct {
char stc_ch;
int stc_num;
char *stc_str;
} stc;
stc myStruct; // 声明一个结构体实例,需要放到setup()函数外,如果放在setup()函数内数据会乱码
TaskHandle_t ArrayTaskHandle;
void TransNumTask(void *pvParameter) {
int *pInt = (int*)pvParameter;
while (1) {
Serial.println("This is myTask.Transfer a number is:");
Serial.println(*pInt);
Serial.println("------------------------");
vTaskDelay(1000 / portTICK_PERIOD_MS); // 注意这里要使用portTICK_PERIOD_MS来将毫秒转换为系统滴答数
}
}
void StructTask(void *pvParam) {
stc *stc_ = (stc*)pvParam;
while (1) { // 添加无限循环
Serial.println("This is a struct data:");
Serial.print("Struct's int number is:");Serial.println(stc_->stc_num);
Serial.print("Struct's char ch is:");Serial.println(stc_->stc_ch);
//(stc_->stc_str)得到字符串指针首地址,Serial.print()打印遇到'\0'截止
Serial.print("Struct's char *string is:");Serial.println(stc_->stc_str);
Serial.println("------------------------");
vTaskDelay(1000 / portTICK_PERIOD_MS); // 添加延时以避免过快打印
}
}
void setup() {
Serial.begin(115200);
Serial.println("Hello, ESP32!");
//您的代码片段缺少函数或全局作用域的上下文。在 C 或 C++ 中,除了变量声明和初始化之外,代码通常需要放在函数内部(例如,void setup() 和 void loop() 在 Arduino 程序中)。
//如果您只是将这些语句放在全局作用域中,它们将在程序启动时立即执行,这通常不是您想要的行为(特别是在 Arduino 程序中,您应该将这些初始化语句放在 setup() 函数中)。
myStruct.stc_ch = 'a'; // 初始化结构体成员(可选)
myStruct.stc_num = 42; // 初始化结构体成员(可选)
myStruct.stc_str = "Hello World.";
// 创建任务
xTaskCreate(TransNumTask, "TransferNumber", 1024 * 5, (void*)&Num, 1, &NumTaskHandle);
xTaskCreate(StructTask, "StructTask", 1024 * 5, (void*)&myStruct, 1, &StcTaskHandle); // 使用正确的结构体实例和句柄变量名
// setup函数不需要返回,因为Arduino框架会处理主循环
}
void loop() {
// 在这个例子中,所有的工作都在任务中完成
// loop函数可以保持为空,或者添加其他不阻塞的任务或逻辑
}