为了减小延时并防止串口产生冗余数据,可以采取以下几种方法:
减少调用
jdySerial.available()
:你可以在接收到第一个字符后立即读取并处理,而不是多次调用available()
。增加缓冲区管理:通过将接收到的数据存储在缓冲区中,然后进行批量处理,而不是每次都单独处理。
使用非阻塞方式:通过使用时间戳或定时器来确保不会因为等待串口而产生冗余数据。
以下是调整后的代码示例:
#include <SoftwareSerial.h>
char serial_data;
#define ledpin 13
SoftwareSerial jdySerial(2, 3); // RX, TX
unsigned long lastReadTime = 0; // 上一次读取的时间
const unsigned long debounceDelay = 50; // 去抖动延迟,单位毫秒
void setup() {
Serial.begin(38400);
jdySerial.begin(38400);
pinMode(ledpin, OUTPUT);
digitalWrite(ledpin, LOW); // 默认关闭LED
}
void loop() {
if (jdySerial.available()) {
char receivedChar = jdySerial.read();
Serial.print("Received: ");
Serial.println(receivedChar);
if (millis() - lastReadTime > debounceDelay) {
turn(receivedChar); // 调用 turn 函数处理接收到的数据
lastReadTime = millis(); // 更新最后读取时间
}
}
}
void turn(char data) {
switch (data) {
case 'o':
digitalWrite(ledpin, HIGH); // 打开LED
break;
case 'x':
digitalWrite(ledpin, LOW); // 关闭LED
break;
}
}
改动说明:
去抖动机制:添加了
debounceDelay
和lastReadTime
,用于控制函数的调用频率,从而避免短时间内重复执行同一命令造成的冗余数据。传递参数到
turn()
函数:直接把接收到的字符作为参数传递给turn()
函数,这样只需读取一次数据即可。更改默认状态:在
setup()
中设置 LED 为关闭状态(如果这是你想要的)。
通过这样的改进,你可以显著降低由于快速连续发送数据造成的冗余响应,提高程序的效率。
内容由零声教学AI助手提供,问题来源于学员提问