Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. QSerialPort bytesAvailable() and read() delayed, QextSerialPort works
Qt 6.11 is out! See what's new in the release blog

QSerialPort bytesAvailable() and read() delayed, QextSerialPort works

Scheduled Pinned Locked Moved Mobile and Embedded
21 Posts 7 Posters 15.6k 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.
  • M Offline
    M Offline
    martonmiklos
    wrote on last edited by
    #4

    I do not know why are you come up with the terminal example, because it is clearly using the event driven approach.

    There is a message here from one of the developers of the QSerialPort mentioning the root cause of the problems:
    https://www.mail-archive.com/interest@qt-project.org/msg08712.html

    But there is not any word in the documentation about that the read, write, bytesAvailabe methods working differently than what a developer should expect from a QIODevice...

    Even the example code in the documentation is incorrect: the waitforReadyRead cannot be called without argument.

    @int numRead = 0, numReadTotal = 0;
    char buffer[50];

    forever {
    numRead = serial.read(buffer, 50);

    // Do whatever with the array
    
    numReadTotal += numRead;
    if (numRead == 0 && !serial.waitForReadyRead())
        break;
    

    }@

    1 Reply Last reply
    0
    • McLionM Offline
      McLionM Offline
      McLion
      wrote on last edited by
      #5

      Already posted the same issue here: http://qt-project.org/forums/viewthread/44873/
      I also switched back to QextSerialPort.

      1 Reply Last reply
      0
      • M Offline
        M Offline
        mr_wallyit
        wrote on last edited by
        #6

        Hello,

        I use QSerialport but I prefer event driver because if you use waitForReadyRead() the gui is blocked.

        Have you checked the project terminal?

        http://qt-project.org/doc/qt-5/qtserialport-terminal-example.html

        This is very important because when bytes are on buffer you receive a signal
        connect(serial, SIGNAL(readyRead()), this, SLOT(readData()));

        void MainWindow::readData()
        {
        QByteArray data = serial->readAll();
        console->putData(data);
        }

        1 Reply Last reply
        0
        • J Offline
          J Offline
          jack249
          wrote on last edited by
          #7

          my solution:
          call QCoreApplication::processEvents(); after write() then bytesAvailable() will be updated

          1 Reply Last reply
          0
          • K Offline
            K Offline
            KeepGoing
            wrote on last edited by
            #8

            [quote author="mr_wallyit" date="1410691263"]Hello,

            Have you tried the simple project ("terminal") in Qt5?
            In Qt 5.3.1 we have ready serial port, I tried with Android, Windows XP, 7, 8 correctly.

            PS
            With Android I have done a workarround.[/quote]

            Hello mr_wallyit
            You said that you were able to use the Serial port with android in Qt5, could you please share with me, how this was done? I would appreciate your response. Thank you in advance.

            1 Reply Last reply
            0
            • K Offline
              K Offline
              KeepGoing
              wrote on last edited by
              #9

              [quote author="mr_wallyit" date="1410691263"]Hello,

              Have you tried the simple project ("terminal") in Qt5?
              In Qt 5.3.1 we have ready serial port, I tried with Android, Windows XP, 7, 8 correctly.

              PS
              With Android I have done a workarround.[/quote]

              Hello mr_wallyit
              You said that you were able to use the Serial port with android in Qt5, could you please share with me, how this was done? I would appreciate your response. Thank you in advance.

              1 Reply Last reply
              0
              • M Offline
                M Offline
                mr_wallyit
                wrote on last edited by
                #10

                Hello,
                First, serial Port on Android works if the Kernel is builded with this module.

                Second,file System of Android is not standard,there are not standard folders for the
                serial port, so I changed the driver with a few line of code.

                I changed the method serialPortLockFilePath in the fileqserialport_unix_p.cpp

                @

                QString serialPortLockFilePath(const QString &portName)
                {

                qDebug() << __LINE__ << __FILE__;
                static const QStringList lockDirectoryPaths = QStringList()
                

                //#ifdef Q_OS_ANDROID
                #ifdef ANDROID

                    << QStringLiteral("/sdcard/data/lock")
                    << QStringLiteral("/sdcard/data/locks")
                    << QStringLiteral("/sdcard/data/spool/locks")
                    << QStringLiteral("/sdcard/data/spool/uucp")
                    << QStringLiteral("/sdcard/data/tmp")
                    << QStringLiteral("/data/local/tmp");
                    qDebug() << __LINE__ << __FILE__;
                

                #else

                    << QStringLiteral("/var/lock")
                    << QStringLiteral("/etc/locks")
                    << QStringLiteral("/var/spool/locks")
                    << QStringLiteral("/var/spool/uucp")
                    << QStringLiteral("/tmp");
                    qDebug() << __LINE__ << __FILE__;
                

                #endif

                @

                Third,

                You need to create these directories:

                  << QStringLiteral("/sdcard/data/lock")
                    << QStringLiteral("/sdcard/data/locks")
                    << QStringLiteral("/sdcard/data/spool/locks")
                    << QStringLiteral("/sdcard/data/spool/uucp")
                    << QStringLiteral("/sdcard/data/tmp")
                
                1 Reply Last reply
                0
                • M Offline
                  M Offline
                  mr_wallyit
                  wrote on last edited by
                  #11

                  Hello,
                  First, serial Port on Android works if the Kernel is builded with this module.

                  Second,file System of Android is not standard,there are not standard folders for the
                  serial port, so I changed the driver with a few line of code.

                  I changed the method serialPortLockFilePath in the fileqserialport_unix_p.cpp

                  @

                  QString serialPortLockFilePath(const QString &portName)
                  {

                  qDebug() << __LINE__ << __FILE__;
                  static const QStringList lockDirectoryPaths = QStringList()
                  

                  //#ifdef Q_OS_ANDROID
                  #ifdef ANDROID

                      << QStringLiteral("/sdcard/data/lock")
                      << QStringLiteral("/sdcard/data/locks")
                      << QStringLiteral("/sdcard/data/spool/locks")
                      << QStringLiteral("/sdcard/data/spool/uucp")
                      << QStringLiteral("/sdcard/data/tmp")
                      << QStringLiteral("/data/local/tmp");
                      qDebug() << __LINE__ << __FILE__;
                  

                  #else

                      << QStringLiteral("/var/lock")
                      << QStringLiteral("/etc/locks")
                      << QStringLiteral("/var/spool/locks")
                      << QStringLiteral("/var/spool/uucp")
                      << QStringLiteral("/tmp");
                      qDebug() << __LINE__ << __FILE__;
                  

                  #endif

                  @

                  Third,

                  You need to create these directories:

                    << QStringLiteral("/sdcard/data/lock")
                      << QStringLiteral("/sdcard/data/locks")
                      << QStringLiteral("/sdcard/data/spool/locks")
                      << QStringLiteral("/sdcard/data/spool/uucp")
                      << QStringLiteral("/sdcard/data/tmp")
                  
                  1 Reply Last reply
                  0
                  • M Offline
                    M Offline
                    mr_wallyit
                    wrote on last edited by
                    #12

                    Sorry I have deleted a duplicate message

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      mr_wallyit
                      wrote on last edited by
                      #13

                      Sorry I have deleted a duplicate message

                      1 Reply Last reply
                      0
                      • K Offline
                        K Offline
                        KeepGoing
                        wrote on last edited by
                        #14

                        Hello Mr_Wallyit
                        Thank you for your reply.
                        My target is android. Is it the same with Android as well?

                        Thank you in advance.

                        1 Reply Last reply
                        0
                        • K Offline
                          K Offline
                          KeepGoing
                          wrote on last edited by
                          #15

                          Hello Mr_Wallyit
                          Thank you for your reply.
                          My target is android. Is it the same with Android as well?

                          Thank you in advance.

                          1 Reply Last reply
                          0
                          • M Offline
                            M Offline
                            mr_wallyit
                            wrote on last edited by
                            #16

                            Hello,

                            yes of course, I use Point of sale Industrial with Android, with workarround we can use serial port.

                            Best Regards

                            1 Reply Last reply
                            0
                            • M Offline
                              M Offline
                              mr_wallyit
                              wrote on last edited by
                              #17

                              Hello,

                              yes of course, I use Point of sale Industrial with Android, with workarround we can use serial port.

                              Best Regards

                              1 Reply Last reply
                              0
                              • A Offline
                                A Offline
                                Abin
                                wrote on last edited by
                                #18

                                Hi Mr_Wallyit,

                                Thanks for sharing the details.

                                I have an android device which has serial port attached to it. The manufacturer has a sample application with it which uses the serial port. The port name is "/dev/ttyS6".

                                As you mentioned I tried to create folder in my device. My device file explorer shows files structure as "/mnt/sdcard". So I created folders as below:
                                "/mnt/sdcard/data/lock"
                                "/mnt/sdcard/data/locks"
                                "/mnt/sdcard/data/spool/locks"
                                "/mnt/sdcard/data/spool/uucp"
                                "/mnt/sdcard/data/tmp"

                                But, the folder "/mnt/data/local/tmp" is unable to create as my file explorer doesn't allow to create folder.

                                I kept my code as @QString serialPortLockFilePath(const QString &portName)
                                {
                                static const QStringList lockDirectoryPaths = QStringList()

                                #ifdef Q_OS_ANDROID
                                << QStringLiteral("/mnt/sdcard/data/lock")
                                << QStringLiteral("/mnt/sdcard/data/locks")
                                << QStringLiteral("/mnt/sdcard/data/spool/locks")
                                << QStringLiteral("/mnt/sdcard/data/spool/uucp")
                                << QStringLiteral("/mnt/sdcard/data/tmp");
                                #else
                                << QStringLiteral("/var/lock")
                                << QStringLiteral("/etc/locks")
                                << QStringLiteral("/var/spool/locks")
                                << QStringLiteral("/var/spool/uucp")
                                << QStringLiteral("/tmp");
                                #endif@

                                And I have a second device whose files structure as "/sdcard". So I created folders as below:
                                "/sdcard/data/lock"
                                "/sdcard/data/locks"
                                "/sdcard/data/spool/locks"
                                "/sdcard/data/spool/uucp"
                                "/sdcard/data/tmp"

                                But, the folder "/data/local/tmp" is unable to create as my file explorer crashes on creating folder "/data/locaal" (need to retry with different file explorer application).

                                @QString serialPortLockFilePath(const QString &portName)
                                {
                                static const QStringList lockDirectoryPaths = QStringList()

                                #ifdef Q_OS_ANDROID
                                << QStringLiteral("/sdcard/data/lock")
                                << QStringLiteral("/sdcard/data/locks")
                                << QStringLiteral("/sdcard/data/spool/locks")
                                << QStringLiteral("/sdcard/data/spool/uucp")
                                << QStringLiteral("/sdcard/data/tmp");
                                #else
                                << QStringLiteral("/var/lock")
                                << QStringLiteral("/etc/locks")
                                << QStringLiteral("/var/spool/locks")
                                << QStringLiteral("/var/spool/uucp")
                                << QStringLiteral("/tmp");
                                #endif@

                                and created a sample application which tries to access the serial port. I set the port name as @setPortName("/dev/ttyS6");@
                                But when running the application I get the error "Permission denied".

                                Could you help me to figure out where I am going wrong.

                                Thanks in advance.

                                1 Reply Last reply
                                0
                                • A Offline
                                  A Offline
                                  Abin
                                  wrote on last edited by
                                  #19

                                  Hi Mr_Wallyit,

                                  Thanks for sharing the details.

                                  I have an android device which has serial port attached to it. The manufacturer has a sample application with it which uses the serial port. The port name is "/dev/ttyS6".

                                  As you mentioned I tried to create folder in my device. My device file explorer shows files structure as "/mnt/sdcard". So I created folders as below:
                                  "/mnt/sdcard/data/lock"
                                  "/mnt/sdcard/data/locks"
                                  "/mnt/sdcard/data/spool/locks"
                                  "/mnt/sdcard/data/spool/uucp"
                                  "/mnt/sdcard/data/tmp"

                                  But, the folder "/mnt/data/local/tmp" is unable to create as my file explorer doesn't allow to create folder.

                                  I kept my code as @QString serialPortLockFilePath(const QString &portName)
                                  {
                                  static const QStringList lockDirectoryPaths = QStringList()

                                  #ifdef Q_OS_ANDROID
                                  << QStringLiteral("/mnt/sdcard/data/lock")
                                  << QStringLiteral("/mnt/sdcard/data/locks")
                                  << QStringLiteral("/mnt/sdcard/data/spool/locks")
                                  << QStringLiteral("/mnt/sdcard/data/spool/uucp")
                                  << QStringLiteral("/mnt/sdcard/data/tmp");
                                  #else
                                  << QStringLiteral("/var/lock")
                                  << QStringLiteral("/etc/locks")
                                  << QStringLiteral("/var/spool/locks")
                                  << QStringLiteral("/var/spool/uucp")
                                  << QStringLiteral("/tmp");
                                  #endif@

                                  And I have a second device whose files structure as "/sdcard". So I created folders as below:
                                  "/sdcard/data/lock"
                                  "/sdcard/data/locks"
                                  "/sdcard/data/spool/locks"
                                  "/sdcard/data/spool/uucp"
                                  "/sdcard/data/tmp"

                                  But, the folder "/data/local/tmp" is unable to create as my file explorer crashes on creating folder "/data/locaal" (need to retry with different file explorer application).

                                  @QString serialPortLockFilePath(const QString &portName)
                                  {
                                  static const QStringList lockDirectoryPaths = QStringList()

                                  #ifdef Q_OS_ANDROID
                                  << QStringLiteral("/sdcard/data/lock")
                                  << QStringLiteral("/sdcard/data/locks")
                                  << QStringLiteral("/sdcard/data/spool/locks")
                                  << QStringLiteral("/sdcard/data/spool/uucp")
                                  << QStringLiteral("/sdcard/data/tmp");
                                  #else
                                  << QStringLiteral("/var/lock")
                                  << QStringLiteral("/etc/locks")
                                  << QStringLiteral("/var/spool/locks")
                                  << QStringLiteral("/var/spool/uucp")
                                  << QStringLiteral("/tmp");
                                  #endif@

                                  and created a sample application which tries to access the serial port. I set the port name as @setPortName("/dev/ttyS6");@
                                  But when running the application I get the error "Permission denied".

                                  Could you help me to figure out where I am going wrong.

                                  Thanks in advance.

                                  1 Reply Last reply
                                  0
                                  • M Offline
                                    M Offline
                                    mr_wallyit
                                    wrote on last edited by
                                    #20

                                    Hello,

                                    this is my source code, I think who is wrong “/mnt/sdcard/data/lock”.

                                    @

                                    bool s = true;
                                    QStringList pathList;
                                    

                                    #ifdef ANDROID
                                    pathList << "/sdcard/data";
                                    pathList << "/sdcard/data/lock";
                                    pathList << "/sdcard/data/locks";
                                    pathList << "/sdcard/data/spool";
                                    pathList << "/sdcard/data/spool/locks";
                                    pathList << "/sdcard/data/spool/uucp";
                                    pathList << "/sdcard/data/tmp";
                                    pathList << "/sdcard/data/local";
                                    pathList << "/sdcard/data/local/tmp";
                                    #endif

                                    QDir d;
                                    foreach (const QString s, pathList) {
                                        d.setPath(s);
                                        if (!d.exists()){
                                            if(d.mkpath(d.absolutePath()))
                                                qCCritical() << "error create directory " << d.absolutePath();
                                        }
                                    }
                                    

                                    @

                                    1 Reply Last reply
                                    0
                                    • M Offline
                                      M Offline
                                      mr_wallyit
                                      wrote on last edited by
                                      #21

                                      Hello,

                                      this is my source code, I think who is wrong “/mnt/sdcard/data/lock”.

                                      @

                                      bool s = true;
                                      QStringList pathList;
                                      

                                      #ifdef ANDROID
                                      pathList << "/sdcard/data";
                                      pathList << "/sdcard/data/lock";
                                      pathList << "/sdcard/data/locks";
                                      pathList << "/sdcard/data/spool";
                                      pathList << "/sdcard/data/spool/locks";
                                      pathList << "/sdcard/data/spool/uucp";
                                      pathList << "/sdcard/data/tmp";
                                      pathList << "/sdcard/data/local";
                                      pathList << "/sdcard/data/local/tmp";
                                      #endif

                                      QDir d;
                                      foreach (const QString s, pathList) {
                                          d.setPath(s);
                                          if (!d.exists()){
                                              if(d.mkpath(d.absolutePath()))
                                                  qCCritical() << "error create directory " << d.absolutePath();
                                          }
                                      }
                                      

                                      @

                                      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