Дело происходит на Windows 10. У меня есть плата, которая шлёт мне пакеты данных по виртуальному компорту каждые 2 секунды. Физически она подключается по usb. Если сразу после её подключения я запускаю свою программу, то ReadyRead() вызывается один раз. Если же я включу плату, затем запущу монитор ком порта, выключу его и запущу свою программу, то всё работает - я получаю данные каждые 2 секунды, как и должно быть. В чём может быть дело? Что такого делает монитор ком порта, что после его запуска, моя программа начинает нормально получать данные?
У меня есть класс обёртка над QSerialPort
ComPort.h
class ComPort : public QObject
{
Q_OBJECT
public:
ComPort(const QString &com_name, QObject *parent = nullptr);
~ComPort();
private slots:
void HandleReadyRead();
private:
QPointer<QSerialPort> serial_;
QByteArray read_buffer_;
};
ComPort.cpp
ComPort::ComPort(const QString &com_name, QObject *parent)
: QObject(parent),
read_buffer_{}
{
serial_ = new QSerialPort(com_name);
serial_->open(QIODevice::ReadWrite);
serial_->setPortName(com_name);
serial_->setBaudRate(QSerialPort::Baud115200);
serial_->setDataBits(QSerialPort::Data8);
serial_->setParity(QSerialPort::NoParity);
serial_->setStopBits(QSerialPort::OneStop);
serial_->setFlowControl(QSerialPort::NoFlowControl);
connect(serial_, SIGNAL(readyRead()), SLOT(HandleReadyRead()));
}
ComPort::~ComPort()
{
serial_->close();
delete serial_;
}
void ComPort::HandleReadyRead()
{
read_buffer_.append(serial_->readAll());
// Здесь ещё пристуствует логика обработки сообщения, я ищу символ конца
// сообщения, и если его нахожу, то эмитирую сигнал, для вызова слота парсинга сообщения.
}
MainWindow.h
class MyMainWindow : public QWidget
{
Q_OBJECT
public:
MyMainWindow(const char* path_to_exe, QString com_name, QWidget *parent = nullptr);
~MyMainWindow();
private:
QPointer<ComPort> com_port_;
};
MainWindow.cpp
MyMainWindow::MyMainWindow(const char* path_to_exe, QString com_name, QWidget *parent)
: QWidget(parent)
, ui_(new Ui::MyMainWindow)
, path_to_exe_(path_to_exe)
{
ui_->setupUi(this);
com_port_ = new ComPort(com_name);
// ComPort
connect(com_port_, SIGNAL(NeedParseData(const QByteArray&)), cmd_processor_, SLOT(ParseData(const QByteArray&)));
}
MyMainWindow::~MyMainWindow()
{
delete com_port_;
}