Serial port Communication with pc through serial Adapter
-
@sankarapandiyan Is your serialReceived() called?
-
@jsulm said in Serial port Communication with pc through serial Adapter:
Is your serialReceived() called?
serial received called in where ? i didnt understand , actually i acalled checkAndSendData(); in Serial received ..
But i dont know where to call serialReceived() Function in my code
-
@sankarapandiyan serialReceived() is a slot and needs to be connected to readRead signal - did you connect it? Else it will not be called when you get ack.
-
@jsulm @J-Hilk I Have tried like this
void MainWindow::on_send_clicked() { line = ui->sender->toPlainText(); QString txt1 = ui->receive->toPlainText(); /*QString*/ txt3 = ui->aknowmnt->toPlainText(); if(m_lines.isEmpty()){ QFile inputFile(QString("/home/adx-soft1/Shankar/serial/myfile1.txt")); inputFile.open(QIODevice::ReadOnly); if (!inputFile.isOpen()) return; QTextStream stream(&inputFile); while (!stream.atEnd()){ line = stream.readLine(); m_lines.append(line+QString("\r\n")); } } checkAndSendData(); serialReceived(); // Here I have call a function but it also make no sense i think. }
-
@sankarapandiyan This does not answer my question.
Did you connect serialReceived() to readyRead()? Can you please answer this question? -
@sankarapandiyan
you're right, it makes no sense there.serialReceived should be a slot (and it has to be markt as such inside your header file) that is called when the serial port emits the readyRead signal.
Ideale, you should never call this slot manually, from within your own source code.
change your connect to the new syntax
fromconnect(serial,SIGNAL(readyRead()),this, SLOT (serialReceived()));
to
connect(serial, &QSerialPort::readyRead,this, &MainWindow::serialReceived);
It should/could solve a couple of issues
-
@jsulm said in Serial port Communication with pc through serial Adapter:
This does not answer my question.
Did you connect serialReceived() to readyRead()? Can you please answer this question?
Yes Connected..void MainWindow::on_pushButton_clicked() { serial = new QSerialPort (this) ; serial->setPortName(ui->comboBox->currentText()); serial->setBaudRate (QSerialPort::Baud115200); serial->setDataBits(QSerialPort::Data8); serial->setParity (QSerialPort::NoParity); serial->setStopBits (QSerialPort::OneStop); serial->setFlowControl(QSerialPort::NoFlowControl); serial->open(QIODevice::ReadWrite); connect(serial,SIGNAL(readyRead()),this, SLOT (serialReceived())); //**HERE_I_CONNECTED_THE_SERIALRECEIVED_SLOT** ui->progressBar->setValue(100); // ui->receive->clear(); }
-
@sankarapandiyan OK, I didn't noticed, sorry.
Check @J-Hilk response and make sure your slot is called (put a qDebug() there). -
@J-Hilk said in Serial port Communication with pc through serial Adapter:
connect(serial, &QSerialPort::readyRead,this, &MainWindow::serialReceived);
Thanks a lot . I have changed the code
fromconnect(serial,SIGNAL(readyRead()),this, SLOT (serialReceived()));
to
connect(serial, &QSerialPort::readyRead,this, &MainWindow::serialReceived);
but same output is came -
@sankarapandiyan said in Serial port Communication with pc through serial Adapter:
connect(serial,SIGNAL(readyRead()),this, SLOT (serialReceived())); //HERE_I_CONNECTED_THE_SERIALRECEIVED_SLOT
You should prefer using new connect style, so connect validity will be checked at compilation:
connect(serial, &QSerialPort::readyRead,this, &MainWindow::serialReceived);
And then in the slot:
void MainWindow::serialReceived() { QByteArray rawData; while(!serial->atEnd()) { rawData.append(serial->readAll()); } if(!rawData.isEmpty()) { QString glen = QString(rawDaa); /*QString*/ line = ui->receive->toPlainText(); ui->receive->setText(ui->receive->toPlainText()+line+"\n"); ui->receive->setText(line + "\r\n" + glen + "\r\n"); line = txt3; } checkAndSendData(); }
Or if you are sure always receiving a '\r' or '\n' from your device, you can do it like this:
void MainWindow::serialReceived() { while(serial->canReadLine()) { QString glen = QString(serial->readLine()); /*QString*/ line = ui->receive->toPlainText(); ui->receive->setText(ui->receive->toPlainText()+line+"\n"); ui->receive->setText(line + "\r\n" + glen + "\r\n"); line = txt3; } checkAndSendData(); }
look at documentation ==> https://doc.qt.io/qt-5/qserialport.html#canReadLine
-
As I don't have a serial dive at hand that returns data I can't debug it for you.
Start the debugger (F5) set a breakpoint in serialReceived and step over/in via F10/F11 and see what happens
That said, I vaguely remember that one should not call write from the slot that is connected to readyRead ( my be wrong here )
So you could try:
void MainWindow::serialReceived() { .... QMetaObject::invokeMethod(this, &MainWindow::checkAndSendData, Qt::QueuedConnection); }
to push the write to the next event loop cycle
-
@KroMignon said in Serial port Communication with pc through serial Adapter:
You should prefer using new connect style, so connect validity will be checked at compilation:
connect(serial, &QSerialPort::readyRead,this, &MainWindow::serialReceived);I want to change this
from -
-->connect(serial,SIGNAL(readyRead()),this, SLOT (serialReceived()))
to
-->connect(serial, &QSerialPort::readyRead,this, &MainWindow::serialReceived);Like this you are saying ?
I tried by your words , and i have edited my code , this is my code i have attached below
void MainWindow::on_pushButton_clicked() { serial = new QSerialPort (this) ; serial->setPortName(ui->comboBox->currentText()); serial->setBaudRate (QSerialPort::Baud115200); serial->setDataBits(QSerialPort::Data8); serial->setParity (QSerialPort::NoParity); serial->setStopBits (QSerialPort::OneStop); serial->setFlowControl(QSerialPort::NoFlowControl); serial->open(QIODevice::ReadWrite); // connect(serial,SIGNAL(readyRead()),this, SLOT (serialReceived())); connect(serial, &QSerialPort::readyRead,this, &MainWindow::serialReceived); ui->progressBar->setValue(100); // ui->receive->clear(); } void MainWindow::checkAndSendData() { if(!m_lines.isEmpty()){ QByteArray inBytes; QByteArray baToSend = m_lines.takeFirst().toUtf8(); serial->write(baToSend); ui->aknowmnt->setText("Sent Message -->" "\n"+ QString(baToSend) + "\n"); } else { ui->aknowmnt->setText("Receiving "); } } void MainWindow::on_send_clicked() { line = ui->sender->toPlainText(); QString txt1 = ui->receive->toPlainText(); /*QString*/ txt3 = ui->aknowmnt->toPlainText(); if(m_lines.isEmpty()){ QFile inputFile(QString("/home/adx-soft1/Shankar/serial/myfile1.txt")); inputFile.open(QIODevice::ReadOnly); if (!inputFile.isOpen()) return; QTextStream stream(&inputFile); while (!stream.atEnd()){ line = stream.readLine(); m_lines.append(line+QString("\r\n")); } } checkAndSendData(); } void MainWindow::serialReceived() { QByteArray rawData; while(!serial->atEnd()) { rawData.append(serial->readAll()); } if(!rawData.isEmpty()) { QString glen = QString(rawData); /*QString*/ line = ui->receive->toPlainText(); ui->receive->setText(ui->receive->toPlainText()+line+"\n"); ui->receive->setText(line + "\r\n" + glen + "\r\n"); line = txt3; } checkAndSendData(); }
and my output is sended like this ,
I Dont know what is the Exact problem is
-
@sankarapandiyan
You need to set a timer to delay some time after each serial write. -
@small_bird ok fine , But is it possible to send the all data with in just a one click with ack ..! that is my exact problem
-
@J-Hilk You are saying like this ?
void MainWindow::serialReceived() { QMetaObject::invokeMethod(this, &MainWindow::checkAndSendData, Qt::QueuedConnection); QString glen = serial->readAll(); if (glen.length()>0){ /*QString*/ line = ui->receive->toPlainText(); ui->receive->setText(ui->receive->toPlainText()+line+"\n"); ui->receive->setText(line + "\r\n" + glen + "\r\n"); line = txt3; } checkAndSendData(); }
-
void MainWindow::serialReceived() { .... QMetaObject::invokeMethod(this, &MainWindow::checkAndSendData, Qt::QueuedConnection); }
void MainWindow::serialReceived() { QString glen = serial->readAll(); if (glen.length()>0){ /*QString*/ line = ui->receive->toPlainText(); ui->receive->setText(ui->receive->toPlainText()+line+"\n"); ui->receive->setText(line + "\r\n" + glen + "\r\n"); line = txt3; } QMetaObject::invokeMethod(this, &MainWindow::checkAndSendData, Qt::QueuedConnection); }
-
@sankarapandiyan
of course you can, define a queue and then put every line into the queue. every time ,get one from the queue and then put it into the serial port. -
@J-Hilk said in Serial port Communication with pc through serial Adapter:
void MainWindow::serialReceived()
{
QString glen = serial->readAll();
if (glen.length()>0){
/QString/ line = ui->receive->toPlainText();
ui->receive->setText(ui->receive->toPlainText()+line+"\n");
ui->receive->setText(line + "\r\n" + glen + "\r\n");
line = txt3;
}
QMetaObject::invokeMethod(this, &MainWindow::checkAndSendData, Qt::QueuedConnection);
}I Have tried this my output is same like this
this is my code is there is any problem in my code#include "mainwindow.h" #include "ui_mainwindow.h" #include <QList> #include <QComboBox> #include <QString> #include <QTextEdit> #include <QTime> #include <QDebug> #include <QtSerialPort/QSerialPortInfo> #include <QtSerialPort> #include <QFile> #include <QList> QString line ; QString txt3; QSerialPort *serial; QStringList m_lines; //QByteArray rawData; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); QString filename1="/home/adx-soft1/Shankar/serial/myfile1.txt"; QFile file(filename1); if(!file.exists()){ qDebug() << "NO FILE "<<filename1; }else{ qDebug() << filename1<<" ..."; } QString line1; ui->sender->clear(); if (file.open(QIODevice::ReadOnly | QIODevice::Text)){ ui->sender->setText(file.readAll()); } QList<QSerialPortInfo> list; list = QSerialPortInfo::availablePorts(); for (int i= 0; i < list.length(); i++) { ui->comboBox->addItem(list[i].portName()); } } MainWindow::~MainWindow() { delete ui; serial->close(); } void MainWindow::on_pushButton_clicked() { serial = new QSerialPort (this) ; serial->setPortName(ui->comboBox->currentText()); serial->setBaudRate (QSerialPort::Baud115200); serial->setDataBits(QSerialPort::Data8); serial->setParity (QSerialPort::NoParity); serial->setStopBits (QSerialPort::OneStop); serial->setFlowControl(QSerialPort::NoFlowControl); serial->open(QIODevice::ReadWrite); connect(serial,SIGNAL(readyRead()),this, SLOT (serialReceived())); // connect(serial, &QSerialPort::readyRead,this, &MainWindow::serialReceived); ui->progressBar->setValue(100); // ui->receive->clear(); } void MainWindow::checkAndSendData() { if(!m_lines.isEmpty()){ QByteArray inBytes; QByteArray baToSend = m_lines.takeFirst().toUtf8(); serial->write(baToSend); ui->aknowmnt->setText("Sent Message -->" "\n"+ QString(baToSend) + "\n"); } else { ui->aknowmnt->setText("Receiving "); } } void MainWindow::on_send_clicked() { line = ui->sender->toPlainText(); QString txt1 = ui->receive->toPlainText(); /*QString*/ txt3 = ui->aknowmnt->toPlainText(); if(m_lines.isEmpty()){ QFile inputFile(QString("/home/adx-soft1/Shankar/serial/myfile1.txt")); inputFile.open(QIODevice::ReadOnly); if (!inputFile.isOpen()) return; QTextStream stream(&inputFile); while (!stream.atEnd()){ line = stream.readLine(); m_lines.append(line+QString("\r\n")); } } checkAndSendData(); } void MainWindow::serialReceived() { QString glen = serial->readAll(); if (glen.length()>0){ /*QString*/ line = ui->receive->toPlainText(); ui->receive->setText(ui->receive->toPlainText()+line+"\n"); ui->receive->setText(line + "\r\n" + glen + "\r\n"); line = txt3; } checkAndSendData(); QMetaObject::invokeMethod(this, &MainWindow::checkAndSendData, Qt::QueuedConnection); }
But I have not get the correct output @J-Hilk
-
@sankarapandiyan check your encode function
-
@small_bird Encode function means What you mean ? i didnt get you