Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

How to send the Data from Qt App to Arduino by serial communication



  • I have tried to send the data from Qt app to Arduino and i want to display the Received data in the serial monitor (Arduin IDE)
    In Qt , i have develop some code to sending the data stored in the text file ,
    THIS IS THE CODE..

    void MainWindow::on_pushButton_clicked()
    {
        serial = new QSerialPort (this) ;
        serial->setPortName(ui->comboBox->currentText());
        serial->setBaudRate (QSerialPort::Baud9600);
        serial->setDataBits(QSerialPort::Data8);
        serial->setParity (QSerialPort::NoParity);
        serial->setStopBits (QSerialPort::OneStop);
        serial->setFlowControl(QSerialPort::NoFlowControl);
        serial->open(QIODevice::ReadWrite);
       connect(serial,SIGNAL(readyRead()),this, SLOT (serialReceived()));
    
       ui->progressBar->setValue(100);
    //    ui->receive->clear();
    }
    void MainWindow::checkAndSendData()
    {
        if(!m_lines.isEmpty()){
            QByteArray baToSend = m_lines.takeFirst().toUtf8();
            serial->write(baToSend);
            ui->aknowmnt->setText("Sent Message -->" +  QString(baToSend) + "\n");
        }
        else
        {
            ui->aknowmnt->setText("Receiving ");
        }
    }
    
    
    void MainWindow ::on_send_clicked()
    {
            line = ui->sender->toPlainText();
            QString txt1 = ui->receive->toPlainText();
            /*QString*/ txt3 = ui->aknowmnt->toPlainText();
             if(m_lines.isEmpty()){
                QFile inputFile(QString("/home/adx-soft1/Shankar/serial/myfile1.txt"));
                inputFile.open(QIODevice::ReadOnly);
                if (!inputFile.isOpen())
                    return;
    
                QTextStream stream(&inputFile);
                while(!stream.atEnd()){
                    QString line = stream.readLine();
                    m_lines.append(line + QString("\r\n"));
                }
            }
    
            checkAndSendData();
    }
    

    And i have develop the code in Aurdino IDE also ,

    int incomingByte = 0; // for incoming serial data
    
    void setup() {
      Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
    }
    
    void loop() {
      // reply only when you receive data:
      if (Serial.available() > 0) {
        // read the incoming byte:
        incomingByte = Serial.read();
    
        // say what you got:
        Serial.print("I received: ");
        Serial.println(incomingByte, DEC);
      }
    }
    

    If i Clicked the send button .. I am not able to see the data Received in Arduino . And i want to show the Received data in the Serial monitor , And i am new to this topic (ARDUINO-SERIAL-PORT-COMMUNICATION-QT)
    I think I need to modify the Aurdino IDE Code ,
    Please say me some suggestion to read the data from qt App in Arduino

    //Finally
    With the knowldge of @mrjj

    I have solved this issue ,
    𝐭𝐡𝐚𝐭 𝐢𝐭𝐬 𝐧𝐨𝐭 𝐡𝐨𝐰 𝐢𝐭 𝐰𝐨𝐫𝐤𝐬. 𝐈𝐓 𝐜𝐚𝐧 𝐣𝐮𝐬𝐭 𝐬𝐡𝐨𝐰 𝐰𝐡𝐚𝐭 𝐜𝐨𝐦𝐞𝐬 𝐟𝐫𝐨𝐦 𝐭𝐡𝐞 𝐀𝐑𝐃 𝐛𝐨𝐚𝐫𝐝. 𝐥𝐢𝐤𝐞 𝐚 𝐝𝐞𝐛𝐮𝐠𝐠𝐢𝐧𝐠 𝐜𝐨𝐧𝐬𝐨𝐥𝐞.

    𝐬𝐨 𝐢𝐟 𝐲𝐨𝐮 𝐨𝐩𝐞𝐧 𝐜𝐨𝐦𝐩𝐨𝐫𝐭 𝐰𝐢𝐭𝐡 𝐢𝐭 𝐟𝐢𝐫𝐬𝐭. 𝐭𝐡𝐞𝐧 𝐐𝐭 𝐩𝐫𝐨𝐠𝐫𝐚𝐦 𝐰𝐢𝐥𝐥 𝐠𝐞𝐭 𝐩𝐞𝐫𝐦𝐢𝐬𝐢𝐬𝐨𝐧 𝐞𝐫𝐫𝐨𝐫

    𝐬𝐨 𝐢𝐭 𝐰𝐨𝐧𝐭 𝐬𝐡𝐨𝐰 𝐭𝐡𝐞𝐫𝐞 𝐰𝐡𝐚𝐭 𝐐𝐭 𝐬𝐞𝐧𝐝𝐬. 𝐨𝐧𝐥𝐲 𝐰𝐡𝐚𝐭 𝐛𝐨𝐚𝐫𝐝 𝐬𝐞𝐧𝐝𝐬

    𝐡𝐭𝐭𝐩𝐬://𝐰𝐰𝐰.𝐢𝐧𝐬𝐭𝐫𝐮𝐜𝐭𝐚𝐛𝐥𝐞𝐬.𝐜𝐨𝐦/𝐢𝐝/𝐇𝐎𝐖-𝐓𝐎-𝐮𝐬𝐞-𝐭𝐡𝐞-𝐀𝐑𝐃𝐔𝐈𝐍𝐎-𝐒𝐄𝐑𝐈𝐀𝐋-𝐌𝐎𝐍𝐈𝐓𝐎𝐑/

    𝐬𝐨 𝐮 𝐜𝐚𝐧𝐭 𝐮𝐬𝐞 𝐬𝐞𝐫𝐢𝐚𝐥 𝐦𝐨𝐧𝐢𝐭𝐨𝐫 𝐚𝐭 𝐬𝐚𝐦𝐞 𝐭𝐢𝐦𝐞 𝐚𝐬 𝐭𝐡𝐞 𝐐𝐭 𝐩𝐫𝐨𝐠𝐫𝐚𝐦


  • Lifetime Qt Champion

    Hi
    You should add check to the

    serial->open(QIODevice::ReadWrite);

    to see if it fails.

    It might not open at all and hence nothing will be seen on the board.



  • @mrjj Yes i checked in Qt App , by qDebug() its print in qt app and the data is getting in the function
    Edited code

    void MainWindow ::on_send_clicked()
    {
          serial->open(QIODevice::ReadWrite);
          qDebug () << baToSend ; // Here i have checked in Qt
            line = ui->sender->toPlainText();
            QString txt1 = ui->receive->toPlainText();
            /*QString*/ txt3 = ui->aknowmnt->toPlainText();
             if(m_lines.isEmpty()){
                QFile inputFile(QString("/home/adx-soft1/Shankar/serial/myfile1.txt"));
                inputFile.open(QIODevice::ReadOnly);
                if (!inputFile.isOpen())
                    return;
    
                QTextStream stream(&inputFile);
                while(!stream.atEnd()){
                    QString line = stream.readLine();
                    m_lines.append(line + QString("\r\n"));
                }
            }
    
            checkAndSendData();
    }
    

    But In Arduino I did not get the data received .. @mrjj



  • @sankarapandiyan
    You still have not shown code which checks the result from serial->open(QIODevice::ReadWrite);. Could you please start by doing that at least. This further applies to other code of yours, e.g. serial->write(baToSend);. If you expect a solution to your issues you should start by introducing the necessary error checking code wherever possible.



  • @sankarapandiyan hi, I also used arduino and Qt by serial communication. I just followed this video series steps This one was very helpful to me



  • @Yunus Hii i am not making the RGB LED Blinking , Here i am transfering the data from the text file from Qt to Arduino



  • @sankarapandiyan He is also sending texts and numbers to Arduino :). He is controlling arduino by sending letters, and numbers. Thats why I thought maybe helpfull for you. You can also send data to arduino only by using C++. But using Qt makes it easy.



  • @mrjj @JonB

    alternate text

    Yes both of you are right .. above image shows my output ,
    if i clicked the send button first time ,
    "" is printed like this
    while clicked second time
    line 5 is printed
    while third time same is printed

    i Dont know why its came like this



  • @JonB

    @JonB said in How to send the Data from Qt App to Arduino by serial communication:

    You still have not shown code which checks the result from serial->open(QIODevice::ReadWrite);.

    YEs i have shown in above reply



  • @Yunus Sure thanks a lot i will refer



  • @sankarapandiyan
    You cannot expect people to help if you show output which simply does not correspond to anywhere in the code you have shown, can you? For example, you have a screenshot showing output where the code you have shown simply does not include any such output lines....



  • @JonB ok fine.. thanks



  • @JonB said in How to send the Data from Qt App to Arduino by serial communication:

    you have a screenshot showing output where the code you have shown simply does not include any such output lines..

    hi, the 2nd line in his on_send_clicked method doas qDebbug() << "serial opened-"

    @sankarapandiyan you should put it in a if statement to call qDebug only if open() returns true

    if(serial->open(QIODevice::ReadWrite))
    


  • @LeLev said in How to send the Data from Qt App to Arduino by serial communication:

    hi, the 2nd line ot his on_send_clicked method doas qDebbug() << "serial opened-"

    You are right. I searched the whole page for serial opened (or even seral opened), I have only just seen it is in a screenshot. However, I still do not see where the baToSend used there is declared or set, I only see it elsewhere (local variable inside on_send_clicked()). Nor do I know what it is the text file read in. So it's still pretty hard to know what is going on....



  • @JonB In text file i have 5 lines ,

    line 1
    line 2
    line 3
    line 4
    line 5

    i want to print these five line in arduino serial monitor , While i clicking send button



  • @JonB Tried to Edit my code in correct form

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QList>
    #include <QComboBox>
    #include <QString>
    #include <QTextEdit>
    #include <QTime>
    #include <QDebug>
    #include <QtSerialPort/QSerialPortInfo>
    #include <QtSerialPort>
    #include <QFile>
    #include <QList>
    #include <QSerialPort>
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
    
          ui->setupUi(this);
          QString filename1="/home/adx-soft1/Shankar/serial/myfile1.txt";
          QFile file(filename1);
          if(!file.exists()){
              qDebug() << "NO FILE "<<filename1;
          }else{
              qDebug() << filename1<<" ...";
          }
          QString line1;
          ui->sender->clear();
          if (file.open(QIODevice::ReadOnly | QIODevice::Text)){ ui->sender->setText(file.readAll()); }
    
          QList<QSerialPortInfo> list;
          list = QSerialPortInfo::availablePorts();
    
          for (int i= 0; i < list.length(); i++)
          {
            ui->comboBox->addItem(list[i].portName());
    
          }
    }
    
    MainWindow::~MainWindow()
    {
        serial->close();
        delete ui;
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        serial = new QSerialPort(this);
        serial->setPortName(ui->comboBox->currentText());
        serial->setBaudRate(QSerialPort::Baud9600);
        serial->setDataBits(QSerialPort::Data8);
        serial->setParity(QSerialPort::NoParity);
        serial->setStopBits(QSerialPort::OneStop);
        serial->setFlowControl(QSerialPort::NoFlowControl);
        serial->open(QIODevice::ReadWrite);
        connect(serial, &QSerialPort::readyRead, this, &MainWindow::serialReceived);
    
       ui->progressBar->setValue(100);
    //    ui->receive->clear();
    }
    void MainWindow::checkAndSendData()
    {
        if(!m_lines.isEmpty()){
            baToSend = m_lines.takeFirst().toUtf8();
            serial->write(baToSend);
            //qDebug() << baToSend << "serial Writed---" ;
    
            ui->aknowmnt->setText("Sent Message -->" +  QString(baToSend) + "\n");
        }
        else
        {
            ui->aknowmnt->setText("Receiving ");
        }
    }
    
    
    void MainWindow ::on_send_clicked()
    {
          //serial->open(QIODevice::ReadWrite);
          qDebug () << baToSend << "seral opened ----" ;
    
          qDebug() << "Serial: " << serial->isOpen();
          qDebug() << "Error: " << serial->error() << " | " << serial->errorString();
    
          line = ui->sender->toPlainText();
            QString txt1 = ui->receive->toPlainText();
            /*QString*/ txt3 = ui->aknowmnt->toPlainText();
    
            qDebug() << "m_lines: " << m_lines;
    
             if(m_lines.isEmpty()){
                QFile inputFile(QString("/home/adx-soft1/Shankar/serial/myfile1.txt"));
                inputFile.open(QIODevice::ReadOnly);
    
                if (!inputFile.isOpen()) {
                    return;
                }
    
                QTextStream stream(&inputFile);
    
                while(!stream.atEnd()) {
                    QString strline = stream.readLine();
                    m_lines.append(strline + QString("\r\n"));
    
                    qDebug() << "m_lines: " << m_lines;
                }
            }
            checkAndSendData();
    }
    
    
    void MainWindow::serialReceived()
    {
    
        qDebug() << "serial->readAll().trimmed(): " << serial->readAll().trimmed();
    
        QString glen = serial->readAll().trimmed();
    
        qDebug() << "glen: " << glen;
    
         if (glen.length() > 0) {
             ui->receive->append(glen);
            /*QString*/ //line = ui->receive->toPlainText();
            //ui->receive->setText(ui->receive->toPlainText() + line + "\n");
            //ui->receive->setText(line + "\r\n" + glen + "\r\n");
            //line = txt3;
        }
        checkAndSendData();
    }
    

    But i did not get the data received in arduino side



  • @LeLev ok fine i will correct it



  • @JonB @LeLev @mrjj cant open port : QSerialPort::SerialPortError(PermissionError)
    I get the error like this ..

    Thanks


  • Lifetime Qt Champion

    @sankarapandiyan said in How to send the Data from Qt App to Arduino by serial communication:

    PermissionError

    Make sure your user has needed access rights for the serial port device file.
    See for example https://askubuntu.com/questions/58119/changing-permissions-on-serial-port



  • @jsulm Is it possible to open the port in both Qt app and Arduino in a same OS ..
    Here if i open the port in Qt means , in Arduino ,i got a error the port is changed or not found

    while if i open the port in Arduino first means , I got a error message in Qt as (PERMISSION ERROR)

    I am Stucked here for a day, I am very new to this arduino topic , So give me some idea abouth this .

    Thanks in advance .


  • Lifetime Qt Champion

    @sankarapandiyan said in How to send the Data from Qt App to Arduino by serial communication:

    Is it possible to open the port in both Qt app and Arduino in a same OS

    Not sure what you mean? If both devices run same OS then yes.

    "i got a error the port is changed or not found" - then make sure you're using correct port!

    "I got a error message in Qt as (PERMISSION ERROR)" - then make sure your user has access right like I suggested above.


  • Moderators

    @sankarapandiyan said in How to send the Data from Qt App to Arduino by serial communication:

    Is it possible to open the port in both Qt app and Arduino in a same OS ..

    If you have 2 apps on the same computer that want to use the same serial port, then only one of the programs can use the serial port at a time.

    When App 1 opens a serial port, App 2 cannot use the same serial port. App 2 must wait until App 1 closes the port.



  • This post is deleted!


  • @JKSH Yes You are right .. thanks for your reply



  • @jsulm sure


Log in to reply