problem with writing on serial port
-
@nanor Please show your code. The warning actually tells you something.
Also, please post warnings/errors as text, not screen-shots.@jsulm This is the updated code:
widget.cpp:
#include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QtSerialPort/QSerialPort> #include <QSerialPortInfo> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); serial = new QSerialPort(this); serial->setPortName("COM1"); for(const auto &serialPortInfo : QSerialPortInfo::availablePorts()) { qDebug() << "find serial port: " << serialPortInfo.portName() ; } serial->open(QIODevice::ReadWrite); if(serial->isOpen()) { serial->setBaudRate(QSerialPort::Baud9600); serial->setDataBits(QSerialPort::Data8); serial->setParity(QSerialPort::NoParity); serial->setStopBits(QSerialPort::OneStop); serial->setFlowControl(QSerialPort::NoFlowControl); serial->write("ok"); connect(serial, SIGNAL(bytesWritten(qint64)), this, SLOT(Write(qint64))); /*while(1) { serial->write("ok"); }*/ } else { qDebug() << "can't open the port"; } } Widget::~Widget() { delete ui; serial->close(); } void Widget::on_pushButton_clicked() { qDebug() << "salam"; } void Widget::Write(qint64) { while(1) { serial->write("ok"); } }this is the error:
07:22:37: Starting C:\Users\nanor\OneDrive\Desktop\qt codes\build-SerialPortReading-Desktop_Qt_5_12_2_MinGW_32_bit-Debug\debug\SerialPortReading.exe...
find serial port: "COM1"
find serial port: "COM6"
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
07:23:15: C:/Users/nanor/OneDrive/Desktop/qt codes/build-SerialPortReading-Desktop_Qt_5_12_2_MinGW_32_bit-Debug/debug/SerialPortReading.exe exited with code 3 -
@jsulm This is the updated code:
widget.cpp:
#include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QtSerialPort/QSerialPort> #include <QSerialPortInfo> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); serial = new QSerialPort(this); serial->setPortName("COM1"); for(const auto &serialPortInfo : QSerialPortInfo::availablePorts()) { qDebug() << "find serial port: " << serialPortInfo.portName() ; } serial->open(QIODevice::ReadWrite); if(serial->isOpen()) { serial->setBaudRate(QSerialPort::Baud9600); serial->setDataBits(QSerialPort::Data8); serial->setParity(QSerialPort::NoParity); serial->setStopBits(QSerialPort::OneStop); serial->setFlowControl(QSerialPort::NoFlowControl); serial->write("ok"); connect(serial, SIGNAL(bytesWritten(qint64)), this, SLOT(Write(qint64))); /*while(1) { serial->write("ok"); }*/ } else { qDebug() << "can't open the port"; } } Widget::~Widget() { delete ui; serial->close(); } void Widget::on_pushButton_clicked() { qDebug() << "salam"; } void Widget::Write(qint64) { while(1) { serial->write("ok"); } }this is the error:
07:22:37: Starting C:\Users\nanor\OneDrive\Desktop\qt codes\build-SerialPortReading-Desktop_Qt_5_12_2_MinGW_32_bit-Debug\debug\SerialPortReading.exe...
find serial port: "COM1"
find serial port: "COM6"
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
07:23:15: C:/Users/nanor/OneDrive/Desktop/qt codes/build-SerialPortReading-Desktop_Qt_5_12_2_MinGW_32_bit-Debug/debug/SerialPortReading.exe exited with code 3@nanor said in problem with writing on serial port:
while(1)
{
serial->write("ok");
}I already told you to not to block the event loop! Why do you do it again? Why do you think you need this while(1) loop?
-
@nanor said in problem with writing on serial port:
while(1)
{
serial->write("ok");
}I already told you to not to block the event loop! Why do you do it again? Why do you think you need this while(1) loop?
-
@nanor said in problem with writing on serial port:
while(1)
{
serial->write("ok");
}I already told you to not to block the event loop! Why do you do it again? Why do you think you need this while(1) loop?
-
@jsulm In the last uploaded code, I have commented the while loop inside the constructor and move this while loop to the slot
@nanor said in problem with writing on serial port:
I have commented the while loop inside the constructor and move this while loop to the slot
So, you're again blocking the event loop.
Is this an exercise, or who asked you to use a loop?
If you have to do so, then you will need to move your serial port code to a thread. -
@nanor said in problem with writing on serial port:
I have commented the while loop inside the constructor and move this while loop to the slot
So, you're again blocking the event loop.
Is this an exercise, or who asked you to use a loop?
If you have to do so, then you will need to move your serial port code to a thread. -
@nanor You could keep your loop and call https://doc.qt.io/qt-5/qcoreapplication.html#processEvents inside the loop. But warning: this is dirty work-around and probably not what the teacher wants to see :-)
-
@nanor You could keep your loop and call https://doc.qt.io/qt-5/qcoreapplication.html#processEvents inside the loop. But warning: this is dirty work-around and probably not what the teacher wants to see :-)
@jsulm Thank you. You mentioned that if I want to do write my code in a while loop, I have to use thread. I have read about qthread class, but I don't know how to use this class in my project. Could you please give suggestions about the steps I have to take?
The question is:
read data continuously and byte by byte from a serial port and if data equals to something special that is defined in code (like"hi"), then write to serial port something.
I would appreciate if you guide me how to use threads in solving this question -
@jsulm Thank you. You mentioned that if I want to do write my code in a while loop, I have to use thread. I have read about qthread class, but I don't know how to use this class in my project. Could you please give suggestions about the steps I have to take?
The question is:
read data continuously and byte by byte from a serial port and if data equals to something special that is defined in code (like"hi"), then write to serial port something.
I would appreciate if you guide me how to use threads in solving this question@nanor This example does exactly what you need: https://doc.qt.io/qt-5/qtserialport-blockingmaster-example.html
It uses blocking QSerialPort API in a worker thread.
Take a look. -
@nanor This example does exactly what you need: https://doc.qt.io/qt-5/qtserialport-blockingmaster-example.html
It uses blocking QSerialPort API in a worker thread.
Take a look.@jsulm Thank you so much.
For the firt step (I want to continuesly read data byte by byte) I have written the following code. But it crashes. Could you please guide me how to fix this?mainwindow.h:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QtSerialPort/QSerialPort> #include "mythread.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); QSerialPort *serial; QThread *myThread; private slots: void on_pushButton_clicked(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_Hmythread.h:
#ifndef MYTHREAD_H #define MYTHREAD_H #include <QObject> #include <QThread> #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QDebug> class MyThread : public QThread { Q_OBJECT public: explicit MyThread(QObject *parent = nullptr); void run(); QSerialPort *serial; signals: public slots: }; #endif // MYTHREAD_Hmainwindow.cpp:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); myThread->start(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { qDebug() << "salam"; }mythread.cpp:
#include "mythread.h" MyThread::MyThread(QObject *parent) : QThread(parent) { } void MyThread::run() { serial = new QSerialPort(this); serial->setPortName("COM1"); for(const auto &serialPortInfo : QSerialPortInfo::availablePorts()) { qDebug() << "find serial port: " << serialPortInfo.portName() ; } serial->open(QIODevice::ReadWrite); if(serial->isOpen()) { serial->setBaudRate(QSerialPort::Baud9600); serial->setDataBits(QSerialPort::Data8); serial->setParity(QSerialPort::NoParity); serial->setStopBits(QSerialPort::OneStop); serial->setFlowControl(QSerialPort::NoFlowControl); while(1) { serial->read(1); } } else { qDebug() << "can't open the port"; } }the error:
10:33:50: Starting C:\Users\nanor\OneDrive\Desktop\qt codes\build-serialportreading3-Desktop_Qt_5_12_2_MinGW_32_bit-Debug\debug\serialportreading3.exe...
ASSERT: "timeout >= 0" in file thread\qmutex.cpp, line 582
10:33:52: The program has unexpectedly finished.
10:33:52: The process was ended forcefully.
10:33:52: C:/Users/nanor/OneDrive/Desktop/qt codes/build-serialportreading3-Desktop_Qt_5_12_2_MinGW_32_bit-Debug/debug/serialportreading3.exe crashed. -
@jsulm Thank you so much.
For the firt step (I want to continuesly read data byte by byte) I have written the following code. But it crashes. Could you please guide me how to fix this?mainwindow.h:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QtSerialPort/QSerialPort> #include "mythread.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); QSerialPort *serial; QThread *myThread; private slots: void on_pushButton_clicked(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_Hmythread.h:
#ifndef MYTHREAD_H #define MYTHREAD_H #include <QObject> #include <QThread> #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QDebug> class MyThread : public QThread { Q_OBJECT public: explicit MyThread(QObject *parent = nullptr); void run(); QSerialPort *serial; signals: public slots: }; #endif // MYTHREAD_Hmainwindow.cpp:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); myThread->start(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { qDebug() << "salam"; }mythread.cpp:
#include "mythread.h" MyThread::MyThread(QObject *parent) : QThread(parent) { } void MyThread::run() { serial = new QSerialPort(this); serial->setPortName("COM1"); for(const auto &serialPortInfo : QSerialPortInfo::availablePorts()) { qDebug() << "find serial port: " << serialPortInfo.portName() ; } serial->open(QIODevice::ReadWrite); if(serial->isOpen()) { serial->setBaudRate(QSerialPort::Baud9600); serial->setDataBits(QSerialPort::Data8); serial->setParity(QSerialPort::NoParity); serial->setStopBits(QSerialPort::OneStop); serial->setFlowControl(QSerialPort::NoFlowControl); while(1) { serial->read(1); } } else { qDebug() << "can't open the port"; } }the error:
10:33:50: Starting C:\Users\nanor\OneDrive\Desktop\qt codes\build-serialportreading3-Desktop_Qt_5_12_2_MinGW_32_bit-Debug\debug\serialportreading3.exe...
ASSERT: "timeout >= 0" in file thread\qmutex.cpp, line 582
10:33:52: The program has unexpectedly finished.
10:33:52: The process was ended forcefully.
10:33:52: C:/Users/nanor/OneDrive/Desktop/qt codes/build-serialportreading3-Desktop_Qt_5_12_2_MinGW_32_bit-Debug/debug/serialportreading3.exe crashed.@nanor said in problem with writing on serial port:
serial = new QSerialPort(this);
Remove "this".
If it is still crashing then please use the debugger to see where exactly and post the stack trace after crash. -
@nanor said in problem with writing on serial port:
serial = new QSerialPort(this);
Remove "this".
If it is still crashing then please use the debugger to see where exactly and post the stack trace after crash. -
@nanor Please post the stack trace (as text). It's in the middle of your screen-shot, in "Debugger" section.
-
@nanor Please post what is in level 2 and 3, else I'm out of this thread as I do not want to guess what is wrong...
It is your job to find out where your app is crashing. -
@nanor Please post what is in level 2 and 3, else I'm out of this thread as I do not want to guess what is wrong...
It is your job to find out where your app is crashing.@jsulm Sorry again. I have another question. inside the while loop, I have to constantly read data from the port and store them inside an array adn then debug them . I have written the following line. but nothing is printed
while(1) { QByteArray data = serial->read(1); for(int i=0; i<data.size(); i++) { qDebug() << data[i]; } } -
@jsulm Sorry again. I have another question. inside the while loop, I have to constantly read data from the port and store them inside an array adn then debug them . I have written the following line. but nothing is printed
while(1) { QByteArray data = serial->read(1); for(int i=0; i<data.size(); i++) { qDebug() << data[i]; } }