ESP32 配合上位机串口打印数据
串口发送ON到esp32,立即回复1,立即开始打印串口数据,回复OFF,立即回复1,停止返回数据
// ESP32-S3 串口控制数字打印程序(带即时停止功能)volatile bool isPrinting = false; // 使用volatile确保多任务中可见性void setup() {Serial.begin(115200); // 初始化串口通信while (!Serial); // 等待串口连接Serial.println("Ready. Send 'ON' to start or 'OFF' to stop.");
}void loop() {// 检查串口是否有数据if (Serial.available() > 0) {handleSerialCommand();}
}void handleSerialCommand() {String command = Serial.readStringUntil('\n');command.trim();if (command.equalsIgnoreCase("ON")) {Serial.println("1"); // 回复确认if (!isPrinting) {isPrinting = true;//Serial.println("Starting printing...");// 使用独立任务处理打印,避免阻塞主循环xTaskCreatePinnedToCore(printNumbersTask, // 任务函数"PrintNumbers", // 任务名称10000, // 堆栈大小NULL, // 参数1, // 优先级NULL, // 任务句柄0 // 运行在核心0);}} else if (command.equalsIgnoreCase("OFF")) {Serial.println("1"); // 回复确认isPrinting = false;//Serial.println("Stopped. Send 'ON' to resume.");}
}void printNumbersTask(void *pvParameters) {// 从0.1递增到1000for (float i = 0.1; i <= 1000.0 && isPrinting; i += 0.1) {Serial.println(i, 1);//delay(10);checkForStop(); // 更频繁地检查停止命令}// 从1000递减到0.1for (float i = 1000.0; i >= 0.1 && isPrinting; i -= 0.1) {Serial.println(i, 1);//delay(10);checkForStop(); // 更频繁地检查停止命令}if (isPrinting) {//Serial.println("Cycle completed. Starting again...");printNumbersTask(NULL); // 继续下一个循环}vTaskDelete(NULL); // 删除任务
}void checkForStop() {// 快速检查串口是否有停止命令while (Serial.available() > 0) {String command = Serial.readStringUntil('\n');command.trim();if (command.equalsIgnoreCase("OFF")) {Serial.println("1"); // 回复确认isPrinting = false;//Serial.println("Immediate stop requested.");}}
}