Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QSerialPort's read buffer is always empty while running another func.
Forum Updated to NodeBB v4.3 + New Features

QSerialPort's read buffer is always empty while running another func.

Scheduled Pinned Locked Moved Unsolved General and Desktop
40 Posts 6 Posters 12.9k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • G Offline
    G Offline
    Gokhan
    wrote on 10 Apr 2017, 10:17 last edited by
    #11

    @J-Hilk Yes. it gives the "Crashed" error and "Destroyed while process ("cmd.exe") is still running." What can I do to solve this?
    @SGaist I know they are a local variable, I can't use a global variable. I tried to use a global variable instead of them, this time it never gave the finished event. I guess I didn't completely connect this signal. Also, this argument list is running like I want, if I write the waiting function...

    J 1 Reply Last reply 10 Apr 2017, 10:27
    0
    • S Offline
      S Offline
      SGaist
      Lifetime Qt Champion
      wrote on 10 Apr 2017, 10:24 last edited by
      #12

      There's no need for global variables. Since you'll be using these commands several times, just keep them as member variables and setup them once in your dialog constructor.

      Then you can re-use them as needed.

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      2
      • G Gokhan
        10 Apr 2017, 10:17

        @J-Hilk Yes. it gives the "Crashed" error and "Destroyed while process ("cmd.exe") is still running." What can I do to solve this?
        @SGaist I know they are a local variable, I can't use a global variable. I tried to use a global variable instead of them, this time it never gave the finished event. I guess I didn't completely connect this signal. Also, this argument list is running like I want, if I write the waiting function...

        J Offline
        J Offline
        J.Hilk
        Moderators
        wrote on 10 Apr 2017, 10:27 last edited by
        #13

        @Gokhan said in QSerialPort's read buffer is always empty while running another func.:

        @J-Hilk Yes. it gives the "Crashed" error and "Destroyed while process ("cmd.exe") is still running." What can I do to solve this?
        @SGaist I know they are a local variable, I can't use a global variable. I tried to use a global variable instead of them, this time it never gave the finished event. I guess I didn't completely connect this signal. Also, this argument list is running like I want, if I write the waiting function...

        Actually, that are to be expected error messages, for reasons, @SGaist explained!

        QProgress does not have to be global to work e.g:

        QString com=QString("/k img_cvt  -i  %1   -f   0").arg(img_down[idxProcess].image_with_ext);
          arguments <<com;
          QDir dir;
          dir.setCurrent("D:/conv");
          QProcess *proc = new QProcess();
        
           connect(proc, & QProcess::errorOccurred, proc,[=](QProcess::ProcessError error){qDebug() <<"Process had an error:" <<  error; });
           connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)),
                        this, SLOT(finishProcess(int, QProcess::ExitStatus)) );
          connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), proc, SLOT(deleteLater()));
           proc->start("cmd.exe",arguments);
        

        Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


        Q: What's that?
        A: It's blue light.
        Q: What does it do?
        A: It turns blue.

        1 Reply Last reply
        0
        • G Offline
          G Offline
          Gokhan
          wrote on 10 Apr 2017, 11:00 last edited by Gokhan 4 Oct 2017, 11:01
          #14

          @SGaist and @J-Hilk many thank your reply.
          I'm using the proc variable as a member variable that is decelerated and initialized in class. "QProcess *proc = new QProcess();" like you said. However, it never gave the finish event. Why don't I get any event?
          And when I re-click the button, it gives an error that is "QProcess::start: Process is already running",

          void image_down_dialog::on_convertButton_clicked()
          {
              idxProcess = 0;
              find_all_imgs();
          
              QStringList arguments;
              QString com=QString("/k img_cvt  -i  %1   -f   0").arg(img_down[0].image_with_ext);
              arguments <<com;
              QDir::setCurrent("D:/User Interface/GUI_660_HMI/conv");
          
              connect(proc, & QProcess::errorOccurred, proc,[=](QProcess::ProcessError error){qDebug() <<"Process had an error:" <<  error; });
              connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)),
                      this, SLOT(finishProcess(int, QProcess::ExitStatus)) );
              connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), proc, SLOT(deleteLater()));
          
              proc->start("cmd.exe",arguments);
          }
          
          J 1 Reply Last reply 10 Apr 2017, 11:14
          0
          • G Gokhan
            10 Apr 2017, 11:00

            @SGaist and @J-Hilk many thank your reply.
            I'm using the proc variable as a member variable that is decelerated and initialized in class. "QProcess *proc = new QProcess();" like you said. However, it never gave the finish event. Why don't I get any event?
            And when I re-click the button, it gives an error that is "QProcess::start: Process is already running",

            void image_down_dialog::on_convertButton_clicked()
            {
                idxProcess = 0;
                find_all_imgs();
            
                QStringList arguments;
                QString com=QString("/k img_cvt  -i  %1   -f   0").arg(img_down[0].image_with_ext);
                arguments <<com;
                QDir::setCurrent("D:/User Interface/GUI_660_HMI/conv");
            
                connect(proc, & QProcess::errorOccurred, proc,[=](QProcess::ProcessError error){qDebug() <<"Process had an error:" <<  error; });
                connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)),
                        this, SLOT(finishProcess(int, QProcess::ExitStatus)) );
                connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), proc, SLOT(deleteLater()));
            
                proc->start("cmd.exe",arguments);
            }
            
            J Offline
            J Offline
            J.Hilk
            Moderators
            wrote on 10 Apr 2017, 11:14 last edited by
            #15

            @Gokhan
            ok first, if you make QProcess a member variable, move the connects into the constructor:

            QProcess *proc = new QProcess();
            connect(proc, & QProcess::errorOccurred, proc,[=](QProcess::ProcessError error){qDebug() <<"Process had an error:" <<  error; });
            connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)),
                        this, SLOT(finishProcess(int, QProcess::ExitStatus)) );
            

            or you get problems when you press the button more than once.

            also the deleteLater has to be moved to the destructor or you can use your QProcess object only once.

            ~MyClass(){
               proc->deleteLater();
            }
            

            Why don't I get any event?
            And when I re-click the button, it gives an error that is "QProcess::start: Process is already running",

            it would seem your process is still running right?


            Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


            Q: What's that?
            A: It's blue light.
            Q: What does it do?
            A: It turns blue.

            V 1 Reply Last reply 10 Apr 2017, 11:19
            0
            • J J.Hilk
              10 Apr 2017, 11:14

              @Gokhan
              ok first, if you make QProcess a member variable, move the connects into the constructor:

              QProcess *proc = new QProcess();
              connect(proc, & QProcess::errorOccurred, proc,[=](QProcess::ProcessError error){qDebug() <<"Process had an error:" <<  error; });
              connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)),
                          this, SLOT(finishProcess(int, QProcess::ExitStatus)) );
              

              or you get problems when you press the button more than once.

              also the deleteLater has to be moved to the destructor or you can use your QProcess object only once.

              ~MyClass(){
                 proc->deleteLater();
              }
              

              Why don't I get any event?
              And when I re-click the button, it gives an error that is "QProcess::start: Process is already running",

              it would seem your process is still running right?

              V Offline
              V Offline
              VRonin
              wrote on 10 Apr 2017, 11:19 last edited by
              #16

              @J.Hilk said in QSerialPort's read buffer is always empty while running another func.:

              also the deleteLater has to be moved to the destructor

              If you pass the parent in the constructor there is no need to manually do this

              "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
              ~Napoleon Bonaparte

              On a crusade to banish setIndexWidget() from the holy land of Qt

              J 1 Reply Last reply 10 Apr 2017, 11:25
              0
              • V VRonin
                10 Apr 2017, 11:19

                @J.Hilk said in QSerialPort's read buffer is always empty while running another func.:

                also the deleteLater has to be moved to the destructor

                If you pass the parent in the constructor there is no need to manually do this

                J Offline
                J Offline
                J.Hilk
                Moderators
                wrote on 10 Apr 2017, 11:25 last edited by
                #17

                @VRonin true, but @Gokhan said

                I'm using the proc variable as a member variable that is decelerated and initialized in class. "QProcess *proc = new QProcess();"

                So in this particular case the deleteLater() is needed. More convenient would of course be to give QProcess a parent.


                Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                Q: What's that?
                A: It's blue light.
                Q: What does it do?
                A: It turns blue.

                1 Reply Last reply
                0
                • G Offline
                  G Offline
                  Gokhan
                  wrote on 10 Apr 2017, 11:27 last edited by
                  #18

                  @J-Hilk I did them you said, but the result is the same. It never gives the finished event, so it is always running.

                  J 1 Reply Last reply 10 Apr 2017, 11:52
                  0
                  • G Gokhan
                    10 Apr 2017, 11:27

                    @J-Hilk I did them you said, but the result is the same. It never gives the finished event, so it is always running.

                    J Offline
                    J Offline
                    jsulm
                    Lifetime Qt Champion
                    wrote on 10 Apr 2017, 11:52 last edited by
                    #19

                    @Gokhan Please read again what @SGaist wrote: each argument should be in its own string. You, instead, put all parameters into one string.

                    https://forum.qt.io/topic/113070/qt-code-of-conduct

                    1 Reply Last reply
                    0
                    • G Offline
                      G Offline
                      Gokhan
                      wrote on 10 Apr 2017, 12:04 last edited by Gokhan 4 Oct 2017, 12:05
                      #20

                      @jsulm "/k img_cvt -i %1 -f 0" this is a one line command, so it has to write in one line. While I was also manually using this cmd application before, using it the same. Also, it successfully completes the conversion and creates a new folder within hex code. However, it never gives the finished information, it is continuous running to finish. I can see it's still running when re-click the button.

                      J 1 Reply Last reply 10 Apr 2017, 12:15
                      0
                      • G Gokhan
                        10 Apr 2017, 12:04

                        @jsulm "/k img_cvt -i %1 -f 0" this is a one line command, so it has to write in one line. While I was also manually using this cmd application before, using it the same. Also, it successfully completes the conversion and creates a new folder within hex code. However, it never gives the finished information, it is continuous running to finish. I can see it's still running when re-click the button.

                        J Offline
                        J Offline
                        jsulm
                        Lifetime Qt Champion
                        wrote on 10 Apr 2017, 12:15 last edited by
                        #21

                        @Gokhan said in QSerialPort's read buffer is always empty while running another func.:

                        /k img_cvt -i %1 -f 0

                        Wrong it consists of several parameters: "/k" "img_cvt" "-i" "%1" "-f" "0"

                        https://forum.qt.io/topic/113070/qt-code-of-conduct

                        1 Reply Last reply
                        2
                        • G Offline
                          G Offline
                          Gokhan
                          wrote on 10 Apr 2017, 12:19 last edited by Gokhan 4 Oct 2017, 12:23
                          #22

                          That is a part of the user manual. I don't know how to use it like you said? However, it's normally running if use the waitforfinish function like I have mentioned above.

                          The usage is : 
                              img_cvt  -i  inputfilename  -f  format
                          
                                   format is as follow:
                                      0 : ARGB1555 [default]
                                      1 : L1
                                      2 : L4
                                      3 : L8
                                      4 : RGB332
                                      5 : ARGB2
                                      6 : ARGB4
                                      7 : RGB565
                                      8 : PALETTEED [FT80X only]    
                                      9 : L2 [FT81X only]
                          
                          Example : 
                              img_cvt  -i  lenaface40.png  -f   8
                          
                          
                          J 1 Reply Last reply 10 Apr 2017, 12:25
                          0
                          • G Gokhan
                            10 Apr 2017, 12:19

                            That is a part of the user manual. I don't know how to use it like you said? However, it's normally running if use the waitforfinish function like I have mentioned above.

                            The usage is : 
                                img_cvt  -i  inputfilename  -f  format
                            
                                     format is as follow:
                                        0 : ARGB1555 [default]
                                        1 : L1
                                        2 : L4
                                        3 : L8
                                        4 : RGB332
                                        5 : ARGB2
                                        6 : ARGB4
                                        7 : RGB565
                                        8 : PALETTEED [FT80X only]    
                                        9 : L2 [FT81X only]
                            
                            Example : 
                                img_cvt  -i  lenaface40.png  -f   8
                            
                            
                            J Offline
                            J Offline
                            jsulm
                            Lifetime Qt Champion
                            wrote on 10 Apr 2017, 12:25 last edited by jsulm 4 Oct 2017, 12:26
                            #23

                            @Gokhan
                            Just pass each parameter as one string in the string list (as shown here http://doc.qt.io/qt-5/qprocess.html):

                            arguments <<"/k"<<"img_cvt"<<"-i"<<QString(%1).arg(img_down[0].image_with_ext)<<"-f"<<"0";
                            

                            Also you should connect http://doc.qt.io/qt-5/qprocess.html#errorOccurred signal to a slot to check whether something went wrong.

                            https://forum.qt.io/topic/113070/qt-code-of-conduct

                            1 Reply Last reply
                            2
                            • G Offline
                              G Offline
                              Gokhan
                              wrote on 10 Apr 2017, 12:33 last edited by Gokhan 4 Oct 2017, 12:34
                              #24

                              @jsulm I just changed my code like you said and connected the signals that are like below in the constructor. The issue isn't solved. ErrorOccurred don't give an error while running.

                                  proc = new QProcess ();
                                  connect(proc, & QProcess::errorOccurred, proc,[=](QProcess::ProcessError error){qDebug() <<"Process had an error:" <<  error; });
                                  connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)),
                                              this, SLOT(finishProcess(int, QProcess::ExitStatus)) );
                              
                              J 1 Reply Last reply 10 Apr 2017, 12:38
                              0
                              • G Gokhan
                                10 Apr 2017, 12:33

                                @jsulm I just changed my code like you said and connected the signals that are like below in the constructor. The issue isn't solved. ErrorOccurred don't give an error while running.

                                    proc = new QProcess ();
                                    connect(proc, & QProcess::errorOccurred, proc,[=](QProcess::ProcessError error){qDebug() <<"Process had an error:" <<  error; });
                                    connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)),
                                                this, SLOT(finishProcess(int, QProcess::ExitStatus)) );
                                
                                J Offline
                                J Offline
                                jsulm
                                Lifetime Qt Champion
                                wrote on 10 Apr 2017, 12:38 last edited by
                                #25

                                @Gokhan Connect http://doc.qt.io/qt-5/qprocess.html#readyReadStandardError and http://doc.qt.io/qt-5/qprocess.html#readyReadStandardOutput to slots and print out what http://doc.qt.io/qt-5/qprocess.html#readAllStandardError and http://doc.qt.io/qt-5/qprocess.html#readAllStandardOutput return. Maybe you will then see what is going on.

                                https://forum.qt.io/topic/113070/qt-code-of-conduct

                                1 Reply Last reply
                                0
                                • G Offline
                                  G Offline
                                  Gokhan
                                  wrote on 10 Apr 2017, 12:55 last edited by Gokhan 4 Oct 2017, 12:58
                                  #26

                                  @jsulm There is no any readAllStandardError and you can see the output of readAllStandardOutput below. Everything shows normal.

                                  readyReadStandardOutput "image conversion utility for FT8XX V0.7\r\nconvert complete!\r\n"
                                  readyReadStandardOutput "\r\nD:I\\conv>"
                                  
                                  1 Reply Last reply
                                  0
                                  • G Offline
                                    G Offline
                                    Gokhan
                                    wrote on 10 Apr 2017, 14:28 last edited by
                                    #27

                                    @jsulm @J-Hilk and @SGaist

                                    I'm trying that it, but I get an error that is "no matching function for call to 'image_down_dialog::connect(QProcess*&, <unresolved overloaded function type>, image_down_dialog*, void (image_down_dialog::*)(int, QProcess::ExitStatus))' " Why do I get this?
                                    ^
                                    connect(proc, &QProcess::finished, this, &image_down_dialog::finishProcess);

                                    J 1 Reply Last reply 11 Apr 2017, 05:06
                                    0
                                    • S Offline
                                      S Offline
                                      SGaist
                                      Lifetime Qt Champion
                                      wrote on 10 Apr 2017, 20:26 last edited by
                                      #28

                                      How did you declare proc?

                                      Interested in AI ? www.idiap.ch
                                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                      1 Reply Last reply
                                      0
                                      • G Gokhan
                                        10 Apr 2017, 14:28

                                        @jsulm @J-Hilk and @SGaist

                                        I'm trying that it, but I get an error that is "no matching function for call to 'image_down_dialog::connect(QProcess*&, <unresolved overloaded function type>, image_down_dialog*, void (image_down_dialog::*)(int, QProcess::ExitStatus))' " Why do I get this?
                                        ^
                                        connect(proc, &QProcess::finished, this, &image_down_dialog::finishProcess);

                                        J Offline
                                        J Offline
                                        J.Hilk
                                        Moderators
                                        wrote on 11 Apr 2017, 05:06 last edited by
                                        #29

                                        @Gokhan
                                        Sadly, Signal finished is overloaded in this class. To connect to this one using the function pointer syntax, you must specify the signal type in a static cast:

                                        connect(process, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), [=](int exitCode, QProcess::ExitStatus exitStatus){ /* ... */ });
                                        

                                        Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                                        Q: What's that?
                                        A: It's blue light.
                                        Q: What does it do?
                                        A: It turns blue.

                                        1 Reply Last reply
                                        0
                                        • G Offline
                                          G Offline
                                          Gokhan
                                          wrote on 11 Apr 2017, 05:27 last edited by Gokhan 4 Nov 2017, 06:15
                                          #30

                                          @J-Hilk It should be connected below to compile successfully, so it's static cast. I did it and it can compile and connect now without an issue. However, I haven't solved this problem yet, it isn't still giving the finished event. Can it be a bug with qprocess ? Should I write a bug report?
                                          QObject::connect(proc, (void (QProcess::*)(int,QProcess::ExitStatus))&QProcess::finished, this, &image_down_dialog::finished);

                                          1 Reply Last reply
                                          0

                                          20/40

                                          10 Apr 2017, 12:04

                                          • Login

                                          • Login or register to search.
                                          20 out of 40
                                          • First post
                                            20/40
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved