【问题标题】:QSerialPort choosing a port from comboboxQSerialPort 从组合框中选择一个端口
【发布时间】:2021-02-27 10:00:40
【问题描述】:

我有一个包含端口名称的组合框,然后我选择一个端口来启动串行通信。我使用“COM6”端口。

我创建组合框名称。

    ui->comboBox->addItem("COM6");
    ui->comboBox->addItem("COM5");
    ui->comboBox->addItem("COM4");
    ui->comboBox->addItem("COM3");
    ui->comboBox->addItem("COM2");
    ui->comboBox->addItem("COM1");

然后我设置端口名称,

mSerialPort->setPortName(ui->comboBox->currentText());

最后,我创建了函数。

void Widget::on_connectButton_clicked()
{
    mSerialPort->open(QIODevice::ReadWrite);
    foreach (QSerialPortInfo item, QSerialPortInfo::availablePorts()) {
        if (mSerialPort->portName() == "COM6" && item.portName() == "COM6"){
                mSerialPort->setPort(item);
            if (mSerialPort-> isOpen){     //Control before start writing
                QMessageBox::information(this, tr("connected"), "serial communication started");
                ui->label_2->setText("Continuing");
            }
            else {
                QMessageBox::critical(this, tr("failed"), mSerialPort->errorString());
            }
        }
        else {
            qDebug()<< item.portName();
            qDebug()<< mSerialPort->portName();
            qDebug()<< ui->comboBox->currentText();
            QMessageBox::information(this, "Wrong port", "Cannot be connected");
            }
        }
}

输出是:

"COM5"
""
"COM6"

一切都很好,但它没有设置名称。

编辑:完整代码

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    qmlRegisterType<FileIO>("FileIO",1,0,"FileIO");  //QObject is used for qml csv reading
    ui->setupUi(this);
    setupPlots();
    setWindowTitle("GUI");

    //QSerialPort for serial communication
    mSerialPort = new QSerialPort(this);
    mSerialPort->setPortName(ui->comboBox->currentText());
    mSerialPort->setBaudRate(QSerialPort::Baud9600);
    mSerialPort->setDataBits(QSerialPort::Data8);
    mSerialPort->setParity(QSerialPort::NoParity);
    mSerialPort->setStopBits(QSerialPort::OneStop);
    mSerialPort->setFlowControl(QSerialPort::NoFlowControl);
    connect(mSerialPort, SIGNAL(readyRead()), this, SLOT(readSerialData()));

    //QQuickWidget for rotation widget
    ui->quickWidget->setSource(QUrl("qrc:/main.qml"));
    ui->quickWidget->show();

    //comboBox for choosing connection ports

    ui->comboBox->addItem("COM6");
    ui->comboBox->addItem("COM5");
    ui->comboBox->addItem("COM4");
    ui->comboBox->addItem("COM3");
    ui->comboBox->addItem("COM2");
    ui->comboBox->addItem("COM1");
}

//Serial-GUI Functions
void Widget::readSerialData(){
    QByteArray data;
    data = mSerialPort->readAll();
    QFile file("./data.csv");
    QTextStream stream(&file);
    qDebug()<< data;

    if(!data.isEmpty()) {
        if (file.open(QFile::ReadWrite|QIODevice::Append)) {
            stream << data;
            file.close();
        }
    }
}

//connect button "on clicked" function
void Widget::on_connectButton_clicked()
{
    mSerialPort->open(QIODevice::ReadWrite);
    foreach (QSerialPortInfo item, QSerialPortInfo::availablePorts()) {
        if (mSerialPort->portName() == "COM6" && item.portName() == "COM6"){
                mSerialPort->setPort(item);
            if (mSerialPort-> isOpen){     //Control before start writing
                QMessageBox::information(this, tr("connected"), "serial communication started");
                ui->label_2->setText("Continuing");
            }
            else {
                QMessageBox::critical(this, tr("failed"), mSerialPort->errorString());
            }
        }
        else {
            qDebug()<< item.portName();
            qDebug()<< mSerialPort->portName();
            qDebug()<< ui->comboBox->currentText();
            QMessageBox::information(this, "Wrong port", "Cannot be connected");
            }
        }
}


//disconnect button "on clicked" function
void Widget::on_disconnectButton_clicked(){
    mSerialPort->close();
    QMessageBox::information(this, tr("disconnected"), "serial communication finished");
    ui->label_2->setText("Stopped");
}

Widget::~Widget()
{
    delete ui;
    mSerialPort->close();
}

【问题讨论】:

  • “它没有设置名称”是什么意思?而且你已经打开了端口就不能再更改了。
  • @chehrlic 在输出qDebug()&lt;&lt; mSerialPort-&gt;portName(); 是空的我的意思是。因此,您建议在设置完所有内容后我应该开始串行通信。谢谢,我会试试的。
  • 当您不设置端口名称时,您期望什么?正如我所说 - 你的 mSerialPort-&gt;open(QIODevice::ReadWrite); 无法工作,因为你没有设置端口名称 - open() 返回 false (你应该检查)
  • 我知道在设置端口名称之前它不会打开。我尝试使此端口名称可更改,以便在mSerialPort-&gt;open(QIODevice::ReadWrite); 之前添加此代码mSerialPort-&gt;setPortName(ui-&gt;comboBox-&gt;currentText());。如您所见,我在 `open` 之前声明了端口名称,但它仍然没有变成端口名称。
  • 你的代码没有显示这个。

标签: c++ qt arduino serial-port


【解决方案1】:

好的,我已经完成了,我想分享未来。

//Port change
bool currentPortNameChanged = false;
QString currentPortName = ui->comboBox->currentText();
if (currentPortName != mSerialPort->portName()){
    currentPortName = mSerialPort->portName();
    currentPortNameChanged = true;
}
if(currentPortNameChanged){
    mSerialPort->close();
    mSerialPort->setPortName(currentPortName);
    if (!mSerialPort->open(QIODevice::ReadWrite)) {
        qDebug()<< (tr("Can't open %1, error code %2")
                   .arg(mSerialPort->portName()).arg(mSerialPort->error()));
        return;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    相关资源
    最近更新 更多