Я успешно читаю с последовательного порта с помощью 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 () с правильным номером порта в начале программы.
Спасибо!