How we can read particular string/data from any device to print on particular LCD in qt?
-
@Mohit-Tripathi Why do you call waitForReadyRead?
I guess serialReceived is connected to readyRead() signal?"Can I know what is wrong in this code?" - come on, you should tell what does not work...
-
@Mohit-Tripathi Sorry, I don't understand what you're writing.
First: are you able to read the data from serial device?
Second: what LCD do you mean? How is it connected and how do you access it?
If you don't know what data you will get then what do you want to print on LCD? -
@jsulm Yes, i am able to read the data serially. I am using the LCD Number widget into application means (.ui) file. LCDNumber widget displays a number with LCD-like digits.
I am getting the data1 for LCD number1 and data2 for LCD number2 but I want to read the data2 for LCD number1 and data1 for LCD number2. The data is in string format. -
@Mohit-Tripathi Sounds like endianess issue.
You can use QDataStream to read your data and set big/little endian using http://doc.qt.io/qt-5/qdatastream.html#setByteOrder -
@Mohit-Tripathi
might be, that I missunderstand you,
but you asign LCD 1 and 2 thesavesame valueDialog::updatelcd1(buffer_split[1]); Dialog::updatelcd2(buffer_split[1]);
those could never be different.
-
Hi,
If buffer split contains the two values you want to show, use the correct index e.g.:
updatelcd1(buffer_split[0]); updatelcd2(buffer_split[1]);
-
@SGaist I have changed the code but still I am getting the same problem.
void Dialog::serialReceived() { int data1 =0; char *dataBuffer; int size = arduino->bytesAvailable(); dataBuffer = new char[size+1]; data1 = arduino->read(dataBuffer,size); dataBuffer[data1]='\0'; if(data1 < 3){ serialData = arduino->readAll(); serialBuffer = serialBuffer + QString::fromStdString(serialData.toStdString()); serialData.clear(); }else{ serialBuffer = ""; qDebug() << dataBuffer << "\n"; Dialog::updateTemperature(dataBuffer); Dialog::updateTemperature(dataBuffer); } } void Dialog::updateTemperature(QString sensor_reading) { ui->temp_lcdNumber_2->display(sensor_reading); ui->temp_lcdNumber_3->display(sensor_reading); }
I tried with two function.
if(data1 < 3){ serialData = arduino->readAll(); serialBuffer = serialBuffer + QString::fromStdString(serialData.toStdString()); serialData.clear(); }else{ serialBuffer = ""; qDebug() << dataBuffer << "\n"; Dialog::updateTemperature(dataBuffer); Dialog::updateTemperature1(dataBuffer); } void Dialog::updateTemperature(QString sensor_reading) { ui->temp_lcdNumber_2->display(sensor_reading); } void Dialog::updateTemperature1(QString sensor_reading) { ui->temp_lcdNumber_3->display(sensor_reading); }
I am getting the same value on both LCD widget. I am writing the two values and I am able to read the only last. It means that I see only last value on the LCD widget, not the first value. The both values are same on LCD widget.
-
You still are passing the exact same input to all your widgets. It's not because one function is named
updateTemperature
and the otherupdateTemperature1
that they will parse your data to extract the correct value to show. That's your job.Note that you are using pretty convoluted code to handle your serial port data. Use QByteArray to cumulate the data. There's no need for all these conversions you are doing.
-
@Mohit-Tripathi You send exact same data to both functions:
Dialog::updateTemperature(dataBuffer); Dialog::updateTemperature1(dataBuffer);
How is it supposed to show different values if you use same value for both?
-
@Mohit-Tripathi it looks like you are somehow double posting your issue, since this is the same problem as you mention here. Again, it seems you need to define a protocol so you the contents of dataBuffer can tell you both the value and the component to update.
-
void Dialog::serialReceived() { QStringList buffer_split; if(buffer_split.length()< 3){ serialData = arduino->readAll(); serialBuffer = serialBuffer + QString::fromStdString(serialData.toStdString()); serialData.clear(); }else{ serialBuffer = ""; qDebug() << buffer_split << "\n"; Dialog::updateTemperature(dataBuffer[0]); Dialog::updateTemperature1(dataBuffer[1]); } } void Dialog::updateTemperature(QString sensor_reading) { ui->temp_lcdNumber_2->display(sensor_reading); } void Dialog::updateTemperature1(QString sensor_reading1) { ui->temp_lcdNumber_3->display(sensor_reading1); } void Dialog::on_pushButton_clicked() { QMessageBox::information(this,"Motor Controller","Write data"); QString output1 = ui->lineEdit->text(); //qDebug()<<output1; QString output2 = ui->lineEdit_2->text(); if(arduino->isWritable()) { //arduino->write(); arduino->write(output1.toStdString().c_str()); arduino->write(output2.toStdString().c_str()); arduino->flush(); arduino->waitForBytesWritten(100); qDebug()<<output1; qDebug()<<output2; } }
I am still getting the same problem.
I can write the data in arduino in form of string using push widget through Line Edit widget. I can read the data from arduino also. But, I can not print the data on LCD number widget. I am unable to print the particular string on particular LCD widget. I am getting the data1 for LCD number2 and data2 for LCD number1 but I want to read the data1 for LCD number1 and data1 for LCD number1 and sometime getting the data2 for both LCD widget.Can I know why I am getting the wrong output for particular LCD widget?
-
Hi,
Because as already written in another thread you are not handling the data from your serial port correctly. You should cumulate the data you get until you know you have enough then parse it and update your lcd widget accordingly.
-
@SGaist @jsulm @J-Hilk
The ardunio code isString a[10]; void setup() { Serial.begin(9600); // opens serial port, sets data rate to 9600 bps } void loop() { if(Serial.available()>0) { for(int i=0;i<2;i++) { a[i] = Serial.readString(); } for(int i=0;i<2;i++) { Serial.println(a[i]); } Serial.flush(); } }
I am getting the two strings while entering two string in arduino like "12" and "1" on ardunio IDE but why i am not getting the correct result on LCD widget in qt5 like "12" on LCD widget 1 and "1" on LCD widget 2. Please note that I entered the "12" in lineEdit and "1" lineEdit_2.
-
@Mohit-Tripathi with the assumption, that all data arrives simultaneously at your QSerialPort you could try the following.
According to the ardunino docs,
println
appends with \r\n so you can usereadLine
on Qt's side:void Dialog::serialReceived() { arduino->waitForReadyRead(100); if(arduino->canReadLine()){ QStringList myData; while(arduino->canReadLine()){ char buf[1024]; qint64 lineLength = file.readLine(buf, sizeof(buf)); if (lineLength != -1) { // the line is available in buf myData.append(QString(buf)); }else qDebug() << "Reading Line failed"; } if(myData.size() >0) updatelcd1(myData.at(0); if(myData.size() >1) updatelcd2(myData.at(1)); }else qDebug() << "Could not read lines"; }
-
@J.Hilk If I am using this code (according to your solution)
if(myData.size() >0) { updateLCD(myData.at(0)); } else if(myData.size() >1) { updateLCD1(myData.at(1)); }
I am still getting the same problem in LCD Widget. I am getting the both input on only one LCD widget.
If I am using the same function call for both. I am getting the same output on both LCD widget.
if(myData.size() >0) { updateLCD(myData.at(0)); } else if(myData.size() >1) { updateLCD(myData.at(1)); } void Dialog::updateLCD(QString sensor_reading) { ui->temp_lcdNumber_2->display(sensor_reading); ui->temp_lcdNumber_3->display(sensor_reading); }
I am getting the same problem always.
-
@Mohit-Tripathi said in How we can read particular string/data from any device to print on particular LCD in qt?:
@J.Hilk If I am using this code (according to your solution)
if(myData.size() >0) { updateLCD(myData.at(0)); } else if(myData.size() >1) { updateLCD1(myData.at(1)); }
are you kidding me?
how is that code supposed to be executed? Im sure even the compiler will rationalize it away.if myData is bigger than 0 updateLCD will be called and the else will never execute
if myData is noit bigger than 0 it can never bigger than 1
Theres a reason I omitted the else
-
@J.Hilk I am not kidding. I am getting the same problem when I started to do code. I am at beginner level in Qt. That's why I am facing the problem.
But, here if Data size is less than 0. It should print only one enter value, not both value on one LCD widget. But, It is printing the both value on one LCD widget. -
@Mohit-Tripathi said in How we can read particular string/data from any device to print on particular LCD in qt?:
void Dialog::updateLCD(QString sensor_reading)
{
ui->temp_lcdNumber_2->display(sensor_reading);
ui->temp_lcdNumber_3->display(sensor_reading);
}As already explained several times: you are updating both
temp_lcdNumber_2
andtemp_lcdNumber_3
with the same value each time you call that function.