Serial port Communication with pc through serial Adapter
-
I have tried to send the data over serial adapter . I have a text file , on that file i have four lines -
i have attached the image , these are the lines in textfile ,
I have tried to send these data to another pc by Qt .
If i click the send button , the data is send to another pc by serial adapter , i have the output like thisi got the output as per the image ..
but what i want is IN RECEIVER is ,
line 1
it sends means i want to get back a acknowlgement and after getting acknolgemnt in my pc
line 2 is send
same thing is want to repeati have tried by own thought , but i get a output as a single line .. as per the above image
and my code is attached below , please give me some idea for this ..MAINWINDOW.CPP
#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; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); 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())); ui->progressBar->setValue(100); } void MainWindow::on_send_clicked() { line = ui->sender->toPlainText(); QString txt1 = ui->receive->toPlainText(); /*QString*/ txt3 = ui->aknowmnt->toPlainText(); QFile inputFile(QString("/home/adx-soft1/Shankar/serial/myfile1.txt")); inputFile.open(QIODevice::ReadOnly); if (!inputFile.isOpen()) return; QTextStream stream(&inputFile); line = stream.readLine(); while (!line.isNull()) { QByteArray inBytes; const char*Data; inBytes = line.toUtf8(); Data = inBytes.constData(); QString StringData; StringData = QString:: fromUtf8(Data); serial->write(Data); line = stream.readLine(); } ui->aknowmnt->setText("Sent Message -->" "\n"+ txt3 + line + "\n"); ui->sender->clear(); } void MainWindow::serialReceived() { QString glen = serial->readAll(); if (glen.length()>0){ /*QString*/ line = ui->receive->toPlainText(); ui->receive->setText(line + "\n" + glen + "\n"); line = txt3; } }
Give Me some suggestions , what i want to change
Thanks in Advance ... -
From the top of my head, I'd serialise communication via QByteArray, so the workflow would be: QString > QByteArray -----> QByteArray > QString.
Further on: I am not sure if I understand exactly what your workflow should be, so please correct me if I'm wrong.
What I understand is, that you sendline1
and wait for ack? I am not sure if your implementation is valid then, considering asynchronous nature of QSerialPort.Also, is there a reason you convert QString to plain text?
-
@sankarapandiyan said in Serial port Communication with pc through serial Adapter:
serial->write(Data);
If you use
QSerialPort::write(const char *data)
, write will stop on first 0 byte according to documentation => https://doc.qt.io/qt-5/qiodevice.html#write-1You don't need to convert to plaint text, for binary data it is easier to use QByteArray
QTextStream stream(&inputFile); line = stream.readLine(); while (!line.isNull()) { QByteArray outBytes = line.toUtf8(); serial->write(outBytes); line = stream.readLine(); }
-
@artwaw said in Serial port Communication with pc through serial Adapter:
What I understand is, that you send line1 and wait for ack?
Yes you are cent percent right ... Is there is any possibility to get a ack from the PC by the code...
-
@KroMignon said in Serial port Communication with pc through serial Adapter:
QTextStream stream(&inputFile);
line = stream.readLine();
while (!line.isNull()) {
QByteArray outBytes = line.toUtf8();
serial->write(outBytes);
line = stream.readLine();
}Yes Even i have tried liked this , Even the output is like
Still the output is in single line i want it as line by line but i cant , give me some idea to do this task ..
-
@sankarapandiyan said in Serial port Communication with pc through serial Adapter:
i want it as line by line
Then put it line by line into your text edit. What is the problem with this?
You can simply put a new line after each line:ui->textEdit->setText(ui->textEdit->text() + '\n' + line);
-
QTextStream stream(&inputFile); line = stream.readLine(); while (!line.isNull()) { QByteArray inBytes; inBytes = line.toUtf8(); serial->write(inBytes+ "\r" "\n"); // here i have added the "\r" and "\n" for split the word one by one line = stream.readLine(); }
I have a output like this ...
now its fine ...
But , if i press the send button its sends all the lines at the time. i need aknlment before sending the next word , so its want to repeatExample , if i press the send button
line1 is in the recevier (another pc) ------- sended line1 in the aknowldgement (in my pc )
after getting aknwldgmnt ,
the line 2 wants to send (another pc) ---------- sended line2 in the aknowldgmnt (in my pc )like wis it repeats for the four lines in the text file ..
Here how to get a aknowldgement in my code this is my code .. Give me some suggestions ..
void MainWindow::on_send_clicked() { line = ui->sender->toPlainText(); QString txt1 = ui->receive->toPlainText(); /*QString*/ txt3 = ui->aknowmnt->toPlainText(); QFile inputFile(QString("/home/adx-soft1/Shankar/serial/myfile1.txt")); inputFile.open(QIODevice::ReadOnly); if (!inputFile.isOpen()) return; QTextStream stream(&inputFile); line = stream.readLine(); while (!line.isNull()) { QByteArray inBytes; inBytes = line.toUtf8(); serial->write(inBytes+ "\r" "\n"); line = stream.readLine(); } ui->aknowmnt->setText("Sent Message -->" "\n"+ line + "\n"); } 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; } }
-
@sankarapandiyan Well, currently you send everything at once in one loop. Do you have a protocol? I mean, the other side has to send an ack. Then it would work like this: you connect a signal to readyRead(), send first line, in slot connected to readyRead you read the ack and send next line and so on until you sent everything.
-
@sankarapandiyan
here,
a very crude implementation on how one could do itvoid MainWindow::checkAndSendData() { if(!m_lines.isEmpty()){ QByteArray baToSend = m_lines.takeFirst().toUtf8(); serial->write(baToSend); ui->aknowmnt->setText("Sent Message -->" "\n"+ QString(baToSend) + "\n"); } else { ui->aknowmnt->setText("All send"); } } void MainWindow ::on_send_clicked() { line = ui->sender->toPlainText(); QString txt1 = ui->receive->toPlainText(); /*QString*/ txt3 = ui->aknowmnt->toPlainText(); //m_lines is a member QStringList 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()){ QString 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(); }
-
Hi i have used the code , finally i got the acknowldgement
But i want to send it automatically , Here i am pressing send button for every data , like if i click the send button first time , it sends the line 1 only , i want to send the line 1 and line 2 and line 3 and line 4 with single click but at the time the the ack also i want to get automatically .
Is it possible to get like this ..
this is my Edited Code ..
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("All 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){ /*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(); }
Give_Me_Some_Solution_for_this_Sir.
-
@sankarapandiyan
🤔It should do that automatically.
See thecheckAndSendData();
at the end of your serialReceived function. That will call the same function to write the next line.same as button pressed again.
are you sure
serialReceived
is actually called? -
@J-Hilk yes i called the function , But i didnot get it automatically
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(); }
-
@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).