使用Qt QSlider控制Arduino PWM调节LED亮度时自动熄灭如何解决
问题原因
- 你计划用分隔符解决数值拼接问题,但实际Qt代码中发送PWM值时未添加非数字分隔符,滑动滑块时连续发送的数值字符串会在串口缓冲区拼接,导致Arduino解析出超出0~255范围的异常值。
- 直接导致LED点亮1秒后熄灭的核心原因是Arduino
Serial.parseInt()函数的默认超时机制:该函数默认等待1000ms用于接收完整数字,若1秒内没有收到新的数字或非数字分隔符,会超时返回0,相当于向LED写入了0占空比的PWM信号,LED因此熄灭。
修复方案
1. Qt端代码修改
在发送的PWM值末尾添加非数字分隔符(推荐用换行符\n),让Serial.parseInt()可以及时结束解析,无需等待超时,同时避免数值拼接。
修改on_pluse_slider_valueChanged函数中的串口发送逻辑:
void MainWindow::on_pluse_slider_valueChanged(int value) { ui->slider_value->setText(QString("<span style=\"font-size:14pt; font-weight:600;\">%1</span>").arg(value)); qDebug()<<value; // 末尾添加\n作为分隔符,使用toUtf8更适配Qt串口发送逻辑 arduino->write(QString("%1\n").arg(value).toUtf8()); }
2. Arduino端代码优化
可以做两处优化提升稳定性:
- 缩短串口解析超时时间,避免不必要的阻塞
- 增加PWM值范围校验,过滤解析错误的异常值
修改后代码如下:
const int LED = 11; int rsv_data; void setup() { Serial.begin(9600); // 将解析超时时间设置为10ms,可根据实际波特率调整 Serial.setTimeout(10); pinMode(LED,OUTPUT); } void loop() { if(Serial.available()) { rsv_data = Serial.parseInt(); // 仅处理0~255范围的有效PWM值 if(rsv_data >= 0 && rsv_data <=255){ analogWrite(LED,rsv_data); } } }
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

