#include <Arduino_FreeRTOS.h>
// 定义LED引脚
#define LED_PIN 13
// 定义结构体存储参数
struct Parameters {
String module;
String iProbesCount;
String command;
};
// 全局变量用于存储LED闪烁参数
int globalBlinkInterval = 500;
// 全局结构体变量
Parameters globalParameters;
// 任务句柄
TaskHandle_t BlinkTask;
// 任务函数
void blinkTask(void *pvParameters) {
// 不再从参数中获取,而是直接使用全局变量
pinMode(LED_PIN, OUTPUT);
while (1) {
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
vTaskDelay(pdMS_TO_TICKS(globalBlinkInterval));
}
}
// 解析逗号分隔的数据
void parseSerialData(String data) {
int commaCount = 0;
for (int i = 0; i < data.length(); i++) {
if (data[i] == ',') {
commaCount++;
// 分别将数据存储到对应的变量中
switch (commaCount) {
case 1:
globalParameters.module = data.substring(0, i);
//Serial.println(globalParameters.module);
break;
case 2:
globalParameters.iProbesCount = data.substring(globalParameters.module.length() + 1, i);
//Serial.println(globalParameters.iProbesCount);
break;
case 3:
globalParameters.command = data.substring(globalParameters.module.length() + globalParameters.iProbesCount.length() + 2, i);
//Serial.println(globalParameters.command);
break;
}
}
}
}
// 串口读取函数
void serialReadTask(void *pvParameters) {
String serialData = "";
while (1) {
// 读取串口数据
while (Serial.available() > 0) {
char incomingChar = Serial.read();
// 判断是否为#,开始读取数据
if (incomingChar == '#') {
serialData = "";
}
// 判断是否为*,结束读取数据并更新LED闪烁参数
else if (incomingChar == '*') {
// 解析逗号分隔的数据
Serial.println(serialData);
parseSerialData(serialData);
// 检查三个变量是否都不为空
if (globalParameters.module.length() > 0 && globalParameters.iProbesCount.length() > 0 && globalParameters.command.length() > 0) {
// 将iProbesCount作为LED闪烁参数
int newBlinkInterval = globalParameters.iProbesCount.toInt();
globalBlinkInterval = newBlinkInterval;
Serial.println(globalParameters.module);
Serial.println(globalParameters.iProbesCount);
Serial.println(globalParameters.command);
}
}
// 将中间数据添加到serialData
else {
serialData += incomingChar;
}
}
}
}
void setup() {
// 初始化串口
Serial.begin(9600);
// 输出启动信息
Serial.println("Start");
// 创建LED闪烁任务
xTaskCreate(blinkTask, "BlinkTask", 100, NULL, 1, &BlinkTask);
// 创建串口读取任务,并将其优先级设置为1
xTaskCreate(serialReadTask, "SerialReadTask", 100, NULL, 1, NULL);
// 启动FreeRTOS调度器
vTaskStartScheduler();
}
void loop() {
// 空循环,所有的工作在FreeRTOS任务中完成
}