Multi serial port application



  • Hi All,
    Please find my gui Application for 3 serial ports read,write and log ,I want know that how should i start in qt creator I am passing the parameters from the GUI for opening serial port,can you please help me out for how should i receive the parameters from gui.0_1512369536285_multi.png


  • Moderators

    @veera Could you please be more specific? I don't understand what you are asking.


  • Qt Champions 2017

    @veera: I hope you didn't create three panels and want to write code three times.

    Better create one panel as a reusable widget with the full logic inside and then instantiate this widget as ofte as you need.



  • @jsulm ,
    In gui part i had created UI as a Dialog window in this window i need to connect three serial ports i am using qcombobox for taking serialportInfo as a

    foreach (const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts())
            {
    
               ui->Port_comboBox->addItem(serialPortInfo.portName());
            }
    
        foreach (const QSerialPortInfo &serialPortInfo2, QSerialPortInfo::availablePorts())
            {
    
               ui->Port2_comboBox->addItem(serialPortInfo2.portName());
            }
    
        foreach (const QSerialPortInfo &serialPortInfo3, QSerialPortInfo::availablePorts())
            {
    
               ui->Port3_comboBox->addItem(serialPortInfo3.portName());
            }
    int count_ports = QSerialPortInfo::availablePorts().count();
    

    with this serial count i am using to check port and serial attributes from gui after validating all assigning each port with qthread and qtimer for reading and writing data .....response window is plaintextwindow....how to start please guide me ........thanks for the valuabl response....



  • @aha_1980
    I need to connect 3 serial ports at time so i need all the 3 ports on my gui dialog window...


  • Moderators

    @veera Are you sure you need threads and timers? Qt serial port implementation is asynchronous.



  • @jsulm
    yes i have to do it in qthreads and qtimer for managing three serial ports for application ,,,,,i don't know exactly you guide me in right manner ...


  • Qt Champions 2017

    @veera

    You didn't understand me. I said, with your task you can create one object containing the logic and the UI to talk to a serial device. There may be small differences between the devices, but I'm sure this can be configured. Once you have this object working (you can test it alone with one or all devices), you instantiate three instances of this object and let them run together.

    I don't know if you need threads, that's up to you. I guess you will need not and threads usually complicate things a lot, so I would avoid it.

    Regarding the UI <-> QSerialPort coupling: Have you already looked at and understand the Terminal example? [1]

    Regards

    [1] http://doc.qt.io/qt-5/qtserialport-terminal-example.html



  • @aha_1980
    okay thanks for the valuable reply i am sharing the code here for collecting all the parameters from gui storing into my structure for opening the serial ports .and how to set the mark and space parity ,i have to use the termios structure ?

    void Dialog::on_set_pushButton_clicked()
    {

    QString Setbutton = ui->set_pushButton->text();
    if (Setbutton == "setPort1" )
    {
        QString port1 = ui->port_comboBox->currentText();
        QString serPort1 = "ttyS4";
    
        DevSettings.port_name = port1;
        QString dev_name = "/dev/";
        QString dev_port = dev_name + port1;
        //qDebug () << "dev_port name is " << dev_port;
        DevSettings.port_name = dev_port;
        qDebug() << "DevSettings.port_name " << DevSettings.port_name;
        QString p1_speed = ui->speed_comboBox->currentText();
        QString p1_start = ui->start_comboBox->currentText();
        QString p1_stop = ui->stop_comboBox->currentText();
        QString p1_parity = ui->parity_comboBox->currentText();
        QString p1_data = ui->data_comboBox->currentText();
        QString p1_hwflow = ui->hwflow_comboBox->currentText();
        QString p1_swflow = ui->swflow_comboBox->currentText();
        bool p1_log   = ui->log_checkBox->checkState();
        QString p1_interval = ui->Interval_comboBox->currentText();
    
    
        DevSettings.baudRate = p1_speed;
        DevSettings.startbit = p1_start.toInt();
        DevSettings.parity = p1_parity;
        DevSettings.StopBits = p1_stop;
        DevSettings.hwflowControl = p1_hwflow;
        DevSettings.swflowControl = p1_swflow;
        DevSettings.dataBits = p1_data;
        DevSettings.logfileEnabled =p1_log;
        DevSettings.SerialPort_Interval = p1_interval;
        qDebug() << DevSettings.baudRate << DevSettings.startbit << DevSettings.parity << DevSettings.StopBits << DevSettings.hwflowControl <<  DevSettings.swflowControl <<  DevSettings.dataBits <<  DevSettings.logfileEnabled << DevSettings.SerialPort_Interval;
    
        }
    

    }



  • here is my structure in dialog.h

    enum portWindow
    {
    WINDOW_1
    ,WINDOW_2
    ,WINDOW_3
    };

        struct Settings {
            FILE *fd;
            QString port_name;
            QString baudRate;
            QString dataBits;
            qint64 startbit;
            QString parity;
            QString StopBits;
            QString hwflowControl;
            QString swflowControl;
            bool logfileEnabled;
            QString SerialPort_Interval;
            enum portWindow serialPortWindow;
        };
    
        Settings DevSettings;
    

    and project files are

    SOURCES +=
    main.cpp
    dialog.cpp
    serialappparams.cpp

    HEADERS +=
    dialog.h
    serialappparams.h

    FORMS +=
    dialog.ui


  • Qt Champions 2017

    @veera said in multi serial port application:

    okay thanks for the valuable reply i am sharing the code here for collecting all the parameters from gui storing into my structure for opening the serial ports .

    I'm not sure if you need to store the data separately: you have it in the UI and you set them in the QSerialPort object. IMHO there's no need to cache them again... There is some caching in the Terminal example, but mostly because the data is transported from the settings dialog to the main window.

    and how to set the mark and space parity ,i have to use the termios structure ?

    With http://doc.qt.io/qt-5/qserialport.html#parity-prop ?



  • @aha_1980
    How would you know the which port is sending the port information ,how i need to handle this problem????


  • Qt Champions 2017

    @veera said in multi serial port application:

    @aha_1980
    How would you know the which port is sending the port information ,how i need to handle this problem????

    Sorry, but I don't understand your question.

    As said, I would start creating ONE object (maybe a QPanel) configuring ONE serial port, sending data to ONE serial port and receiving data from ONE serial port. If you have this working, it's easy to have three of them so you can communicate with all serial ports.



  • Hi @aha_1980 ,
    I am working for single port now ,its not able to open the port here is my code by using send pushbutton and connect()

    void Dialog :: open_serialport()
    {
    QSerialPort serial;
    QString portName = ui->port_comboBox->currentText();
    qDebug() << "The portName is " << portName;
    bool currentPortNameChanged = false;
    QString currentPortName;
    if(currentPortName != portName)
    {
    currentPortName = portName;
    currentPortNameChanged = true;
    }

    if(currentPortName.isEmpty())
    {
        qDebug() << "No port name specified";
    }
    
    if(currentPortNameChanged)
    {
        serial.close();
        serial.setPortName(portName);
        qDebug() << "portName" << portName;
    
        if(!serial.open(QIODevice::ReadWrite))
        {
            qDebug() << "can not able to open the serial port";
        }
    }
    

    }
    its giving error i am passing from gui ,please help me out....


  • Qt Champions 2017

    @veera said in multi serial port application:

    void Dialog :: open_serialport()
    {
    QSerialPort serial; <<<< WRONG ! its local variable

    make it a class member of Dialog



  • @mrjj ,
    just now declared a QSerialPort as data members of the dialog class in dialog.h still also i am getting same error...

    here is the declaration of the QSerialPort

    #ifndef DIALOG_H
    #define DIALOG_H

    #include <QDialog>
    #include <stdio.h>
    #include <QtSerialPort/QSerialPort>
    
    
    namespace Ui {
    class Dialog;
    }
    
    class Dialog : public QDialog
    {
        Q_OBJECT
    
    public:
        QSerialPort serial;

  • Qt Champions 2017

    Super
    but what error ?



  • can not able to open the serial port..what was the type its receiving whether its ttyS4 or /dev/ttyS4?



  • @mrjj ,
    I am directly assigning the portname from gui qcombox is it correct way for accessing the port name ?


  • Qt Champions 2017

    Hi
    normally its ttyS4
    for
    serial->setPortName(p.name);

    Did you see the sample
    http://doc.qt.io/qt-5/qtserialport-terminal-example.html

    Its available directly in Creator and you can use to test.



  • yes i have refer that example only.....



  • i have tried both the things not able to open the port .....


  • Qt Champions 2017

    @veera

    so are you sure PC has that port ?

    if using a serial usb adapter, it has other name.

    If you cannot open port using the Terminal sample then
    something is wrong outside Qt.



  • yes having two ports only ttyS4 and ttyS5 i am not using any usb to serial converter i am directly connecting with serial port only .....i have tried terminal example its giving the permission error means sudo permission .....



  • permission is denied error while opening the port in Terminal Sample...


  • Moderators

    @veera What does

    ls -lh /dev/ttyS4
    

    say?



  • Are you in dialout group?



  • i tried using this command on the qt project path also not able to open the serial ports.....



  • yes i am in dialout group....



  • crw-rw---- 1 root dialout 4, 68 Dec 11 13:22 /dev/ttyS4



  • @jsulm said in multi serial port application:

    ls -lh /dev/ttyS4

    crw-rw---- 1 root dialout 4, 68 Dec 11 13:22 /dev/ttyS4



  • Are you sure you really have 4 serial ports? Which kind of machine have you got?
    In some case, with a beaglebone board for example, you have to enable the third and fourth serial port with a special kernel parameter.


  • Qt Champions 2017

    Hi
    Often you have to add your user to the dialout group to be allowed to use it

    usermod -a -G dialout MY_USER_NAME

    as @mrdebug asks/says



  • @mrdebug
    I have only two serial ports i am connecting slot machine to my desktop computer.....need to connect from desktop to slot machine i am struggling to open the serial port please help me i have added like this



  • sudo usermod -a -G dialout veera



  • in my desktop using two serial ports using right now may be in built its four i guess.....


  • Moderators

    @veera Make sure your user is member of dialout group


  • Qt Champions 2017

    Also if you are having ONLY 2 serial ports why are you then
    trying the /dev/ttyS4 port ???
    i would giess on
    /dev/ttyS0
    or
    /dev/ttyS1



  • i have verified with minicom slot machine cable is connected with ttyS4 so i am trying with this port



  • i have tried ttyS0 and ttyS1 also it is not able to open the serial port....


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.