• Как организовать работу N com-портов одновременно?

    @sinkvs Автор вопроса
    alexalexes,
    Попробуйте следом отправить другое сообщение на другой порт. Если на портах пришли разные сообщения, то вектор портов вы правильно построили.


    Проверил, создал еще один слот на другую кнопку, отправляются разные сообщения. В проверке буфера смысла видеть перестал, переполниться с моими командами не сможет никак, поэтому и проверять тоже не стал!

    Теперь в потоки..
    Написано
  • Как организовать работу N com-портов одновременно?

    @sinkvs Автор вопроса
    alexalexes, результата в этом коде не было.

    Сейчас создал виртуальные порты, ввиду отсутствия временно реальных. Сделал 'pair' для com2-com3 и com4-com5. Отправляю, вижу, что принимает верно. Сейчас хочу создать потоки, т.к. на отправку некоторых сообщений у меня разное время вызова таймера, по которому и планирую работать далее с портами.

    Также логику для открытия порта изменил. Подключаться без разбора ко всем - это плохо)

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        connectToAllPorts();
    
        connect(ports[0], SIGNAL(readyRead()), this, SLOT(readPort()));
        connect(ports[1], SIGNAL(readyRead()), this, SLOT(readPort()));
        connect(ports[2], SIGNAL(readyRead()), this, SLOT(readPort()));
        connect(ports[3], SIGNAL(readyRead()), this, SLOT(readPort()));
        connect(ports[4], SIGNAL(readyRead()), this, SLOT(readPort()));
    }
    
    //------------------------------------------------------------------------------
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    //------------------------------------------------------------------------------
    void MainWindow::connectToAllPorts()
    {
        QList<QSerialPortInfo> availablePorts = QSerialPortInfo::availablePorts();
    
        // ищем доступные порты
        for (const QSerialPortInfo &portInfo : availablePorts)
        {
            QSerialPort *port = new QSerialPort(portInfo);
    
            // Устанавливаем параметры, скорость и т.д.
            port->setPortName(portInfo.portName());
            port->setBaudRate(QSerialPort::Baud9600);
            port->setDataBits(QSerialPort::Data8);
            port->setParity(QSerialPort::EvenParity);
            port->setStopBits(QSerialPort::OneStop);
            port->setFlowControl(QSerialPort::NoFlowControl);
            
            
            // Открываем порт
            qDebug() << "Серийный номер: " << portInfo.serialNumber();
            
            if (port->open(QIODevice::ReadWrite))
            {
                ports.append(port);
                qDebug() << "Порт" << portInfo.portName() << "успешно открыт для чтения и записи";
            }
            else
            {
                qDebug() << "Ошибка при открытии порта" << portInfo.portName();
                delete port; // Освобождаем память, если порт не удалось открыть
            }
        }
    }
    
    //------------------------------------------------------------------------------
    void MainWindow::on_sendButton_clicked() // также пробую отправить в ком-порт
    {
        // Отправка сообщения через порт
        QString textStr = "message";
        QByteArray data = QByteArray(ui->sendLineEdit->text().toStdString().c_str());//QByteArray(textStr.toStdString().c_str()); //QByteArray data = "message";
    
        ports[1]->write(data);
        ports[2]->write(data);
        ports[3]->write(data);
        ports[4]->write(data);
    }
    
    //------------------------------------------------------------------------------
    void MainWindow::readPort()
    {
        if(ports[0]->bytesAvailable() > 0)
        {
            QByteArray receivedData = ports[0]->readAll();
            qDebug() << "\nsize: " << receivedData.size();
            qDebug() << "Received data ports[0]: " << receivedData;
        }
        if(ports[1]->bytesAvailable() > 0)
        {
            QByteArray receivedData = ports[1]->readAll();
            qDebug() << "\nsize: " << receivedData.size();
            qDebug() << "Received data ports[1]: " << receivedData;
        }
        if(ports[2]->bytesAvailable() > 0)
        {
            QByteArray receivedData = ports[2]->readAll();
            qDebug() << "\nsize: " << receivedData.size();
            qDebug() << "Received data ports[2]: " << receivedData;
        }
        if(ports[3]->bytesAvailable() > 0)
        {
            QByteArray receivedData = ports[3]->readAll();
            qDebug() << "\nsize: " << receivedData.size();
            qDebug() << "Received data ports[3]: " << receivedData;
        }
        if(ports[4]->bytesAvailable() > 0)
        {
            QByteArray receivedData = ports[4]->readAll();
            qDebug() << "\nsize: " << receivedData.size();
            qDebug() << "Received data ports[4]: " << receivedData;
        }
    }


    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #define CHANNEL_1 "..."
    #define CHANNEL_2 "..."
    ...
    #define CHANNEL_16 "..."
    
    #include <QMainWindow>
    
    #include <QThread>
    #include <QSerialPortInfo>
    #include <QSerialPort>
    #include <QDebug>
    #include <QVector>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private slots:
        void on_sendButton_clicked();
        void on_pushButton_6_clicked();
        void readPort();
    
    private:
        Ui::MainWindow *ui;
    
        QVector<QSerialPort*> ports;
        QByteArray message;
        QSerialPort *m_comPort;
    
        void connectToAllPorts();
    };
    
    #endif // MAINWINDOW_H
    Написано
  • Как организовать работу N com-портов одновременно?

    @sinkvs Автор вопроса
    Сделал следующим образом, поправьте, если ошибаюсь?

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        connectToAllPorts();
    }
    
    //------------------------------------------------------------------------------
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    //------------------------------------------------------------------------------
    void MainWindow::connectToAllPorts()
    {
        QList<QSerialPortInfo> availablePorts = QSerialPortInfo::availablePorts();
        for (const QSerialPortInfo &portInfo : availablePorts)
        {
            QSerialPort *port = new QSerialPort(portInfo);
    
            // Подбираем параметры, скорость и т.д.
            port->setBaudRate(QSerialPort::Baud9600);
            port->setDataBits(QSerialPort::Data8);
            port->setParity(QSerialPort::EvenParity);
            port->setStopBits(QSerialPort::OneStop);
            port->setFlowControl(QSerialPort::NoFlowControl);
    
            // Открываем порт
            qDebug() << "Серийный номер: " << portInfo.serialNumber();
    
            if (port->open(QIODevice::ReadWrite))
            {
                ports.append(port);
                qDebug() << "Порт " << portInfo.portName() << "успешно открыт";
            }
            else
            {
                qDebug() << "Ошибка при открытии порта " << portInfo.portName();
                delete port; // Освобождаем память, если порт не удалось открыть
            }
        }
    }
    
    //------------------------------------------------------------------------------
    void MainWindow::on_sendButton_clicked() // также пробую отправить в ком-порт
    {
        // Отправка сообщения через порт
        QByteArray data = "message";
        ports[1]->write(data);
    
        // Проверка, отправлены ли данные
        if (ports[1]->waitForBytesWritten(1000))
            qDebug() << "Данные успешно отправлены";
        else
            qDebug() << "Ошибка отправки данных";
    }


    Заголовочный файл:
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    #include <QSerialPortInfo>
    #include <QSerialPort>
    #include <QDebug>
    #include <QVector>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private slots:
        void on_sendButton_clicked();
    
    private:
        Ui::MainWindow *ui;
    
        QVector<QSerialPort*> ports;
        QByteArray message;
        QSerialPort *m_comPort;
    
        void connectToAllPorts();
    };
    
    #endif // MAINWINDOW_H
    Написано