You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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端代码优化

可以做两处优化提升稳定性:

  1. 缩短串口解析超时时间,避免不必要的阻塞
  2. 增加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:15:05