【发布时间】:2021-11-22 10:00:06
【问题描述】:
我尝试使用 QSlider qt ui.i 控制 LED 的亮度。我遇到的问题是 LED 无法使用滑块值打开。我认为它的值类似于 123456... 然后我尝试了添加一些分隔符的解决方案.. parseInt() 停止在任何非数字字符上。现在我面临的问题是,led 使用从滑块传递的 pwm 值正确打开,但它在一秒钟后自动关闭。
这是我的 qt 代码。
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <string>
#include <QDebug>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QMessageBox>
#include <QRegularExpression>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
arduino = new QSerialPort(this);
bool is_arduino_avilable = false;
QString portNmae;
databuf = "";
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
if(info.hasProductIdentifier() && info.hasVendorIdentifier())
{
if(info.productIdentifier() == arduino_productId && info.vendorIdentifier() == arduino_vendorId)
{
is_arduino_avilable = true;
portNmae = info.portName();
}
}
}
if(is_arduino_avilable)
{
qDebug() << "Arduino port is found " + portNmae;
arduino->setPortName(portNmae);
arduino->open(QSerialPort::ReadWrite);
arduino->setBaudRate(QSerialPort::Baud9600);
arduino->setDataBits(QSerialPort::Data8);
arduino->setFlowControl(QSerialPort::NoFlowControl);
arduino->setParity(QSerialPort::NoParity);
arduino->setStopBits(QSerialPort::OneStop);
QObject::connect(arduino,SIGNAL(readyRead()),this,SLOT(readSerialdata()));
}
else
{
qDebug() << "Couldn't find the correct port for the arduino.\n";
QMessageBox::information(this,"Serial Port Error","Couldn't open serial port to arduino");
}
}
MainWindow::~MainWindow()
{
if(arduino->isOpen())
{
arduino->close();
}
delete ui;
}
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;
arduino->write(QString("%1").arg(value).toStdString().c_str());
}
这是我的 arduino 代码。
pwm.ino
const int LED = 11;
int rsv_data;
void setup()
{
Serial.begin(9600);
pinMode(LED,OUTPUT);
}
void loop()
{
if(Serial.available())
{
rsv_data = Serial.parseInt();
analogWrite(LED,rsv_data);
}
}
提前谢谢你。
【问题讨论】:
-
数字之间没有分隔符,因此它发送 1234567891011.... parseInt 等待下一秒
-
@Juraj 所以我应该怎么做,请帮忙。
-
您到底尝试了什么?从您的代码看来,Juraj 是对的。您只发送数字但没有分隔符,因此 Arduino 将在 1 秒后超时。 arduino->readAll() 有什么用?你不应该在阅读之前等待阅读吗?请改进你的帖子。添加更多信息。到底发生了什么?
-
请停止通过 cmets 添加信息。更新您可以正确格式化文本的问题。此外,如果您已修复 123456 问题,则此问题已过时。发布新问题或更改此问题,直到您收到满意的答案
-
让您的 Arduino 打印所有接收到的字符以进行调试。您可能会收到一个额外的非数字字符,因此 parseInt 超时并在 1 秒后返回 0 .. 您未能更新代码。它仍然只发送数字。
标签: qt arduino brightness pwm qslider