@AlexSer

Как в QT C++ организовать одновременную работу n com портов?

Пишу программу на QT для работы с Com портами.. Так как новичок многое не понятно.
Проблема такая, не удается привязать актионы (подключения к ком портам) к слоту. Если произвожу соединение с ком портом, то в дебаге отображаются данные только по последнему соединению.
Я пытаюсь сделать, так чтобы все соединения с ком портом, шли через 1 слот.
Если я делаю два разных слота на коннект к ком порту, то данные идут нормально. Дебаг отображает данные с 2 - ком портов. но тут уже идет дублирование кода. А так как у меня соединений с ком портами будет до 5 штук, то не удобно.
В mainwindow.h объявляю экземпляр класса
ConnectionCom *sPort;     //мой класс для соединение с ком портом.

код класса ConnectionCom()
bool ConnectionCom::OpenConCom(QString port, int baudrate, int bits, QString parity, int stopBits, QString flowControl, bool CTS_RTS){
               serialPort=new QSerialPort();
               serialPort->setPortName(port);
               serialPort->setBaudRate(baudrate);
               serialPort->setDataBits(QSerialPort::Data8);
               serialPort->setParity(QSerialPort::NoParity);
               serialPort->setStopBits(QSerialPort::OneStop);
               serialPort->setFlowControl(QSerialPort::NoFlowControl);

               if(CTS_RTS==true){
                   serialPort->setRequestToSend(true);
                   serialPort->setDataTerminalReady(true);
               }
               serialPort->open(QIODevice::ReadOnly);
               if(serialPort->isOpen()){

                   return  true;

               }else{
                   return false;
               }

}

код mainwindow.cpp
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);



    //соединение с сервером БД;
    ConnectionSql *sql;
    sql=new ConnectionSql();
    bool condsql=sql->OpenConnection("192.168.50.100","user_serial","x19z$@");

    ui->terminal->append("Проверка доступа к серверу Mysql:........ " + QVariant(condsql).toString());
    ui->terminal->append("Провека доступа к локальной БД SQLite:...........");
    //coeдинение с com port
    connect(ui->actionSwelab_Alfa_1, SIGNAL(triggered()), this, SLOT(ComPortConnection()));
    connect(ui->actionSwelab_Alfa_2, SIGNAL(triggered()), this, SLOT(ComPortConnection()));
    connect(ui->actionMeldonic_1, SIGNAL(triggered()), this, SLOT(ComPortConnection()));
    connect(ui->actionUrit_3020, SIGNAL(triggered()), this, SLOT(ComPortConnection()));

 //  connect(ui->actionSwelab_Alfa_1, SIGNAL(triggered()), this, SLOT(Help()));
  // connect(ui->actionSwelab_Alfa_2, SIGNAL(triggered()), this, SLOT(Help()));
 //  connect(ui->actionMeldonic_1, SIGNAL(triggered()), this, SLOT(Help()));



}

void MainWindow::ComPortConnection(){
       QString port;


    if(QObject::sender()->objectName()=="actionSwelab_Alfa_1"){
           port="COM1";
           analizator="Swelab";

     }
     if(QObject::sender()->objectName()=="actionSwelab_Alfa_2"){
           port="COM3";
           analizator="Swelab";

     }
     if(QObject::sender()->objectName()=="actionMeldonic_1"){
           port="COM6";
           analizator="Medonic";

     }
     if(QObject::sender()->objectName()=="actionUrit_3020"){
          analizator="Urit3020";
          port="COM6";

     }

     sPort=new ConnectionCom();
       if(sPort->OpenConCom(port, 9600, 8,"none", 1, "none", false)==true){
             connect(sPort->serialPort,SIGNAL(readyRead()),this,SLOT(ReadDataSerial()));
        
       }
}


void MainWindow::ReadDataSerial(){
    QString byte;
    byte=sPort->serialPort->readAll();
          qDebug()<<sPort->serialPort->portName()+":"+byte;

}


Как сделать, чтобы все коннекты ссылались на 1 слот чтения данных, и дебаг отображал данные со всех портов?
  • Вопрос задан
  • 468 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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