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. Strange QSerialport Problem
Qt 6.11 is out! See what's new in the release blog

Strange QSerialport Problem

Scheduled Pinned Locked Moved General and Desktop
5 Posts 2 Posters 2.0k 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.
  • A Offline
    A Offline
    Artemus
    wrote on last edited by
    #1

    Hi,

    i want to write a small library to communicate with an external device using a virtual COM-Port.
    Open the port an sending data works fine and the device also sends a correct response with about 6ms delay (i can see it on Oscilloscope).

    However i can't read data using the asynchronous (non-blocking) approach.

    The Idea was that I send a command to the device and the using QTimer::singleShot to wait some time and call a Slot that reads the response. The Problem is that i get "QIODevice::read: device not open" error when trying to read data in my receiving-Slot but if i try to read in my sending-function there is no error.

    Here's the Code:

    @typedef struct{
    bool b_is_alive;
    bool b_is_setup;
    double f64_voltage;
    double f64_current;
    bool b_OutputIsOn;
    bool b_CurrentLimitActive;
    QString q_FailString;
    }ST_LPS_OUT;

    typedef struct{
    QString q_ComPortName;
    double f64_Voltage;
    double f64_CurrentLimit;
    bool b_EnableOutput;
    }ST_LPS_SETUP;

    class libZentroLPS358 : public QObject
    {
    Q_OBJECT
    public:
    explicit libZentroLPS358(QObject *parent = 0);
    public slots:
    void LPSsetup(ST_LPS_SETUP st_setup);
    void AwaitingResponse(void);
    signals:
    void LPSnewData(ST_LPS_OUT st_out);

    private:
    bool ConnectLPS(QString q_portname);
    QSerialPort* pq_comport;
    ST_LPS_SETUP st_setupold;
    ST_LPS_OUT st_out;
    };@

    @bool libZentroLPS358::ConnectLPS(QString q_portname)
    {
    bool b_ret;
    bool b_continue;
    float64 f64_wait_ms;
    QString q_response;
    uint8 au8_buffer[256];
    uint8 u8_errorcounter;

    //Create Comport instance
    //pq_comport->QSerialPort::~QSerialPort();
    pq_comport = new QSerialPort();
    QSerialPort* pq_comport = new QSerialPort(q_portname);
    b_ret = pq_comport->open( QIODevice::ReadWrite);
    if(!b_ret)
    {
        qDebug() << "failed to create com port instance";
        return true;
    }
    
    //Set up Comport
    pq_comport->setBaudRate(38400);
    pq_comport->setFlowControl(QSerialPort::HardwareControl);
    pq_comport->setDataBits(QSerialPort::Data8);
    pq_comport->setParity(QSerialPort::NoParity);
    pq_comport->setStopBits(QSerialPort::OneStop);
    
    //Ask Device to Identify itself
    pq_comport->setRequestToSend(true);
    pq_comport->write("*IDN?\r\n");
    b_ret = pq_comport->waitForBytesWritten(f64_wait_ms);
    
    QTimer::singleShot(50, this, SLOT(AwaitingResponse()));
    

    }

    void libZentroLPS358::AwaitingResponse(void)
    {
    pq_comport->waitForReadyRead(500);
    char buff[256];
    int i = pq_comport->read(buff,255);
    }@

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

      Are you sure your QSerialPort object is alive and can be accessed when you try to access it from AwaitingResponse?

      1 Reply Last reply
      0
      • A Offline
        A Offline
        Artemus
        wrote on last edited by
        #3

        It should, i dont know why it should get closed within some ms. I moved the relevant code to as small new Project and get the same Error. Maybe you can compile and try it on your machine?

        Download:
        http://s000.tinyupload.com/?file_id=61057583527003946336

        Output on my PC looks like this:
        @-> MainWindow constructor
        -> ConnectLPS Slot
        INFO: setting up com port done
        INFO: Comport is still open
        INFO: sending *IDN? command
        INFO: Comport is still open
        INFO: transfer complete
        INFO: Comport is still open
        INFO: starting Timer
        -> AwaitingResponse Slot
        ERROR: Comport is not open!!!@

        @#include "mainwindow.h"
        #include "ui_mainwindow.h"

        MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
        {
        ui->setupUi(this);
        ui->textBrowser->append("-> MainWindow constructor");
        emit(ConnectLPS());
        }

        MainWindow::~MainWindow()
        {
        delete ui;
        }

        void MainWindow::ConnectLPS(void)
        {
        ui->textBrowser->append("-> ConnectLPS Slot");
        bool b_ret;
        float64 f64_wait_ms;

        pq_comport = new QSerialPort();
        QSerialPort* pq_comport = new QSerialPort("COM1");
        b_ret = pq_comport->open( QIODevice::ReadWrite);
        if(!b_ret)
        {
            ui->textBrowser->append("ERROR: failed to create com port instance");
            return;
        }
        
        //Set up Comport
        pq_comport->setBaudRate(38400);
        pq_comport->setFlowControl(QSerialPort::HardwareControl);
        pq_comport->setDataBits(QSerialPort::Data8);
        pq_comport->setParity(QSerialPort::NoParity);
        pq_comport->setStopBits(QSerialPort::OneStop);
        ui->textBrowser->append("INFO: setting up com port done");
        if(pq_comport->isOpen()) ui->textBrowser->append("INFO: Comport is still open");
        else ui->textBrowser->append("ERROR: Comport is not open!!!");
        
        //Ask Device to Identify itself
        pq_comport->setRequestToSend(true);
        pq_comport->write("*IDN?\r\n");
        ui->textBrowser->append("INFO: sending *IDN? command");
        if(pq_comport->isOpen()) ui->textBrowser->append("INFO: Comport is still open");
        else ui->textBrowser->append("ERROR: Comport is not open!!!");
        
        b_ret = pq_comport->waitForBytesWritten(f64_wait_ms);
        ui->textBrowser->append("INFO: transfer complete");
        if(pq_comport->isOpen()) ui->textBrowser->append("INFO: Comport is still open");
        else ui->textBrowser->append("ERROR: Comport is not open!!!");
        
        ui->textBrowser->append("INFO: starting Timer");
        QTimer::singleShot(200, this, SLOT(AwaitingResponse()));
        

        }

        void MainWindow::AwaitingResponse(void)
        {
        ui->textBrowser->append("-> AwaitingResponse Slot");
        if(pq_comport->isOpen()) ui->textBrowser->append("INFO: Comport is still open");
        else ui->textBrowser->append("ERROR: Comport is not open!!!");

        pq_comport->waitForReadyRead(500);
        char buff[256];
        int i = pq_comport->read(buff,255);
        

        }
        @

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

          I'd try to move
          @ pq_comport = new QSerialPort();@

          to the constructor.

          1 Reply Last reply
          0
          • A Offline
            A Offline
            Artemus
            wrote on last edited by
            #5

            Ah, that the Mistake:
            @pq_comport = new QSerialPort();
            QSerialPort* pq_comport = new QSerialPort(q_portname);@
            i overwrite my global pq_comport with a local Object of the same name. I obviously forget to comment out or delete the "QSerialPort* pq_comport = new QSerialPort(q_portname);"

            Thank you

            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