簡體   English   中英

QSerialPort 從 combobox 中選擇一個端口

[英]QSerialPort choosing a port from combobox

我有一個包含端口名稱的 combobox,然后我選擇一個端口來啟動串行通信。 我使用“COM6”端口。

我創建 combobox 名稱。

    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());

最后,我創建了 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");
            }
        }
}

output 是:

"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();
}

好的,我已經完成了,我想分享未來。

//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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM