Serial port Communication with pc through serial Adapter
-
@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
-
@sankarapandiyan
ok, lets simplify your code, I assumereceive
andaknowmnt
are QTextEdits or QTextBrowser, since they have atoPlainText
functionvoid MainWindow::checkAndSendData() { if(!m_lines.isEmpty()){ QByteArray baToSend = m_lines.takeFirst().toUtf8(); serial->write(baToSend); ui->aknowmnt->append("Sent Message --> "+ QString(baToSend)); } else { ui->aknowmnt->append("All are send "); } }
void MainWindow::serialReceived() { QString glen = serial->readAll(); if (glen.length()>0){ ui->receive->append( "Received -->" + QString(glen)); } QMetaObject::invokeMethod(this, &MainWindow::checkAndSendData, Qt::QueuedConnection); }
-
Yes i have tried this method , the correct data is not shown in the receiver side ..
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 baToSend = m_lines.takeFirst().toUtf8(); serial->write(baToSend); ui->aknowmnt->append("Sent Message --> "+ QString(baToSend)); } else { ui->aknowmnt->append("All are send "); } } 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){ ui->receive->append( "Received -->" + QString(glen)); } QMetaObject::invokeMethod(this, &MainWindow::checkAndSendData, Qt::QueuedConnection); }
-
@J-Hilk said in Serial port Communication with pc through serial Adapter:
ok, lets simplify your code, I assume receive and aknowmntare QTextEdits or QTextBrowser, since they have a toPlainTextfunction
Yes Its a QTextEdits