Как изменить имя QSerialPort во время работы приложения - PullRequest
0 голосов
/ 04 апреля 2020

Я успешно читаю с последовательного порта с помощью QSerialPort, когда настраиваю параметры экземпляра в конструкторе главного окна. Однако я хочу, чтобы мой GUI включил изменение порта, но я не могу начать чтение при смене моего com-порта после запуска моего приложения (я делаю это с помощью spinBox, который устанавливает имя COM-порта моего экземпляра QSerialPort). Вот мой код (mainwindow. cpp), моя проблема в том, что если я не использую напрямую serial-> setPortName (); в моем конструкторе, и я помещаю его в свой слот, связанный с моим сигналом spinBox, я больше не могу читать данные, полученные из моего com-порта с помощью qDebug.

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>

QSerialPort *serial;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);  // Here by default. Takes a pointer to mainwindow as argument
    serial = new QSerialPort(this);

    qDebug() << "nb ports: " << QSerialPortInfo::availablePorts().length();
    foreach(const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts())
    {
    qDebug() << "name" << serialPortInfo.portName();
    }
    qDebug() << "is " << serial->open(QSerialPort::ReadOnly);
    qDebug() << "err " << serial->error();


    // Create the signal and slot for
    connect(ui->com_spinBox, SIGNAL(valueChanged(const QString&)),
                    this, SLOT(setComPort(const QString&)));

    // Create the signal and slot for receiving data from device
    connect(serial, SIGNAL(readyRead()), this, SLOT(serialReceived()));
}

MainWindow::~MainWindow()
{
    delete ui;
    serial->close(); // instance is closed when mainwindow destroyed
}

// My 2 custom slots below!!!

void MainWindow::serialReceived()
{
    QByteArray ba;
    ba = serial->readAll();
    ui->label->setText(serial->readAll());
   qDebug()<<ba;
}

void MainWindow::setComPort(const QString& com)
{
    serial->close();
    serial = new QSerialPort(this); // this (mainwindow) is parent

    qDebug() << serial->portName();
    QString comPort = "COM" + com;
    qDebug() << comPort;
    serial->setPortName(comPort);
    serial->setBaudRate(QSerialPort::Baud9600);
    serial->setDataBits(QSerialPort::Data8);
    serial->setParity(QSerialPort::NoParity);
    serial->setStopBits(QSerialPort::OneStop);
    serial->setFlowControl(QSerialPort::NoFlowControl);
    serial->open(QSerialPort::ReadOnly);
}

Здесь я попытался переместить все настройки моего последовательного экземпляра из конструктора в мой слот, и закройте и снова откройте экземпляр, чтобы увидеть, помогает ли это, но я все еще не могу прочитать что-либо со слота serialReceived () при настройке на правильный COM-порт. Это работает, если я помещаю все в конструктор и setPortName () с правильным номером порта в начале программы.

Спасибо!

1 Ответ

0 голосов
/ 04 апреля 2020

Попробуйте удалить и заново создать QSerialPort до setPortName()

serial->deletLater();
serial = new QSerialPort(this);
serial->setPortName("COM1");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...