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 13.5k 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.
  • J.HilkJ J.Hilk

    @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?

    VRoninV Offline
    VRoninV Offline
    VRonin
    wrote on 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.HilkJ 1 Reply Last reply
    0
    • VRoninV VRonin

      @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.HilkJ Offline
      J.HilkJ Offline
      J.Hilk
      Moderators
      wrote on 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 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.

        jsulmJ 1 Reply Last reply
        0
        • G Gokhan

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

          jsulmJ Offline
          jsulmJ Offline
          jsulm
          Lifetime Qt Champion
          wrote on 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 last edited by Gokhan
            #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.

            jsulmJ 1 Reply Last reply
            0
            • G Gokhan

              @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.

              jsulmJ Offline
              jsulmJ Offline
              jsulm
              Lifetime Qt Champion
              wrote on 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 last edited by Gokhan
                #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
                
                
                jsulmJ 1 Reply Last reply
                0
                • G Gokhan

                  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
                  
                  
                  jsulmJ Offline
                  jsulmJ Offline
                  jsulm
                  Lifetime Qt Champion
                  wrote on last edited by jsulm
                  #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 last edited by Gokhan
                    #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)) );
                    
                    jsulmJ 1 Reply Last reply
                    0
                    • G Gokhan

                      @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)) );
                      
                      jsulmJ Offline
                      jsulmJ Offline
                      jsulm
                      Lifetime Qt Champion
                      wrote on 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 last edited by Gokhan
                        #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 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.HilkJ 1 Reply Last reply
                          0
                          • SGaistS Offline
                            SGaistS Offline
                            SGaist
                            Lifetime Qt Champion
                            wrote on 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

                              @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.HilkJ Offline
                              J.HilkJ Offline
                              J.Hilk
                              Moderators
                              wrote on 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 last edited by Gokhan
                                #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
                                • SGaistS Offline
                                  SGaistS Offline
                                  SGaist
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #31

                                  You should rather use qOverload. In the case you can't, use a static_cast like @J-Hilk shown, not a C-Style cast.

                                  As for never finishing, maybe because cmd.exe is still running. You are passing the /k parameter to cmd.exe which AFAIK means run the command and return to the CMD prompt. Shouldn't you be using /C ?

                                  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 Offline
                                    G Offline
                                    Gokhan
                                    wrote on last edited by
                                    #32

                                    @SGaist thank you. The problem was solved when changed "/k" with "/c". However, the problem which I have mentioned in the title hasn't been solved yet. I'm still missing some data during communication with MCU through the serial port. The missing data are around 3K while sending 300K.

                                    Also, I able to read max 512 byte in the readyRead signal, Is it writing to its read buffer during making another process like filling a table? If yes, how can I read the all buffer without missing any data?

                                    1 Reply Last reply
                                    0
                                    • SGaistS Offline
                                      SGaistS Offline
                                      SGaist
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #33

                                      Do you have any protocol established for the communication ?

                                      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 Offline
                                        G Offline
                                        Gokhan
                                        wrote on last edited by
                                        #34

                                        @SGaist I have just solved this problem. it was caused by debugging mode. After it was realesed and run .exe, it normally ran, until the application window is moved. Yes, I have a new problem :). It's lagging and missing data during moving or resizing the application window. I just tried to up to real time priority for windows on task manager, but it's still missing.

                                        J.HilkJ 1 Reply Last reply
                                        0
                                        • G Gokhan

                                          @SGaist I have just solved this problem. it was caused by debugging mode. After it was realesed and run .exe, it normally ran, until the application window is moved. Yes, I have a new problem :). It's lagging and missing data during moving or resizing the application window. I just tried to up to real time priority for windows on task manager, but it's still missing.

                                          J.HilkJ Offline
                                          J.HilkJ Offline
                                          J.Hilk
                                          Moderators
                                          wrote on last edited by
                                          #35

                                          @Gokhan
                                          how about moving your QSerialPort stuff into int's own thread? Should make things a bit smoother as in its not blocked when your main thread is busy with ui-stuff.


                                          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

                                          • Login

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