Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Forum Updated on Feb 6th

    [Solved] QtSerialPort

    General and Desktop
    2
    4
    4766
    Loading More Posts
    • 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.
    • R
      RodriguesCunha last edited by

      Hi,

      I need some help from someone to resolve one issue I have in my application.

      I'm using Windows 7 and Qt 5.1 beta, because it has qtserialport built in.

      I need to receive a data array, from a PIC18F, for example: 0 | 1 | 3 | 121 | 50 | 99 other is 0 | 2 | 2 | 10 | 150

      to detect the start i use 0, then message identifier (1 or 2), next the number of data bytes and finally the data bytes (data will change). I receive a complete data message every 10ms.

      Because i need to receive several data and display it in a GUI app, i decided to use QThread, that will emit a signal when i receive the complete data message.

      I modified the blockingslave example to do it. I managed to do so, using:

      • readthread.h

      @ signals:
      void newdata(const QString &s);@

      • readthread.cpp

      @emit this->newdata(msg);@

      msg is a QString.

      In my gui implementation:

      • mainwindow.h

      @private slots:
      void processData(const QString &s);@

      • mainwindow.cpp

      @thread.start();

      connect(&thread, SIGNAL(newdata(QString)),this, SLOT(processData(QString)));
      

      @

      @void MainWindow::processData(const QString &s)
      {
      QByteArray msg = s.toLocal8Bit();

      ui->txt1_1->setText(QByteArray::number(msg.at(0)));

      ui->txt1_2->setText(QByteArray::number(msg.at(1)));

      ui->txt1_3->setText(QByteArray::number(msg.at(2)));

      // ui->txt1_4->setText(QByteArray::number(msg.at(3)));

      // ui->txt1_5->setText(QByteArray::number(msg.at(4)));
      }@

      My problem is that when i update my Qtextedit, if i only show msg.at(0), i get 0, if i show msg.at(1), it changes 1/2 as it supposed to, if i show msg.at(2), it should show 2 or 3, but it shows sometimes 2, sometimes 3, sometimes 0, sometimes 30, if i try to show any of the other data, the program crashes and shows the following output:

      ASSERT: "uint(i) < uint(size())" in file ............\Qt\Qt5.1.0\5.1.0-beta1\mingw47_32\include/QtCore/qbytearray.h, line 401
      Invalid parameter passed to C runtime function.
      Invalid parameter passed to C runtime function.

      But if i Debug the program and see the variable msg, in this variabe i have the correct values. So the problem might when i update the Qtextedit.

      Can someone help me with it?

      Thanks

      1 Reply Last reply Reply Quote 0
      • TheBadger
        TheBadger last edited by

        I don't know if it might be the problem but my thought is that QString is not the correct type to use for the message. Since 0 (decimal) is the end-of-string character or string termination char I think that when you convert the string to a QByteArray the byte array will only contain the chars up to the point of the 1st 0d. Why do you not send a QByteArray directly through the signal?

        When constructing the QByteArray for sending through the signal, make sure to use the constructor that uses a size to set the number of bytes, otherwise you might have the same problem again.


        Check out my SpellChecker Plugin for Qt Creator @ https://github.com/CJCombrink/SpellChecker-Plugin

        1 Reply Last reply Reply Quote 0
        • R
          RodriguesCunha last edited by

          [quote author="Badger" date="1370501839"]I don't know if it might be the problem but my thought is that QString is not the correct type to use for the message. Since 0 (decimal) is the end-of-string character or string termination char I think that when you convert the string to a QByteArray the byte array will only contain the chars up to the point of the 1st 0d. Why do you not send a QByteArray directly through the signal?

          When constructing the QByteArray for sending through the signal, make sure to use the constructor that uses a size to set the number of bytes, otherwise you might have the same problem again. [/quote]

          Thanks for your input.
          I think the problem might not be that, because, when i put a breakpoint and debug the code, i get the array as i supposed to.

          I've attached some images, of my debug. I have a variable: transactionCount which is incremented every time i run:

          @void MainWindow::processData(const QString &s)
          {

          QByteArray msg = s.toLocal8Bit();

          ui->txt1_1->setText(QByteArray::number(msg.at(0)));

          ui->txt1_2->setText(QByteArray::number(msg.at(1)));

          ui->txt1_3->setText(QByteArray::number(msg.at(2)));

          // ui->txt1_4->setText(QByteArray::number(msg.at(3)));

          // ui->txt1_5->setText(QByteArray::number(msg.at(4)));

          ui->trafficLabel->setText(tr("Traffic, transaction #%1:").arg(++transactionCount));
          ui->statusLabel->setText(tr("Status: Running, connected to port %1.").arg("COM3"));

          }@

          "Debug_1":https://www.dropbox.com/s/lc7ovufebrywk1h/Debug_1.png

          "Debug_2":https://www.dropbox.com/s/xdg8btf4nj5dcdw/Debug_2.png

          "Debug_3":https://www.dropbox.com/s/ek733eczc4y8j0t/Debug_3.png

          "Debug_4":https://www.dropbox.com/s/do7wuray0nt1y2u/Debug_4.png

          "Debug_5":https://www.dropbox.com/s/91485n8ufo8r10j/Debug_5.png

          "Debug_6":https://www.dropbox.com/s/34y45oq16s1q992/Debug_6.png

          So debugging my code i get what i'm supposed to: 0 |1|3|121|65|99 or 0|2|2|30|110

          I want to show the int numbers.

          When i run with breakpoint in debug mode i get:

          Debugging starts
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x400 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x112 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x112 in read in psymtab, but not in symtab.)
          (Internal error: pc 0x112 in read in psymtab, but not in symtab.)
          Debugging has finished

          I ran it till transactionCount was 6, like in the pictures.

          It's weird because i get this error but, the variable msg is like i wanted.

          Any ideas?

          1 Reply Last reply Reply Quote 0
          • R
            RodriguesCunha last edited by

            I decided to try my code in Ubuntu and in Ubuntu it works.

            1 Reply Last reply Reply Quote 0
            • First post
              Last post