Задать вопрос
@Ballantrae

Почему сигнал ReadyRead() вызывается только один раз?

Дело происходит на 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_;
}
  • Вопрос задан
  • 28 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы