Qt slow when reading from serialPort
-
whenever i do , my qt code always get slow compared c#. I dont expect any performance between c# and qt framework but at least dont late read from serialport.
here two example , one of them writting at C# and the other is Qt.
c# code (this code isnt belong to me)byte[] pkg2 = new byte[3]; // just console output while ((1 == 1) && (Buffer.Count > 0)) { // packet header available and one packet available while ((Buffer.Count > 0) && (Buffer[0] != 0xa5)) Buffer.RemoveAt(0); Debug.WriteLine(Buffer.Count); // // just console output if ((Buffer.Count >= 17) && (Buffer[0] == 0xa5)) { pkg2[0] = Buffer[0]; // read packet byte[] pkg = new byte[17]; Olimexino328_packet pk = new Olimexino328_packet(); for (int i = 0; i < 17; i++) { pkg[i] = Buffer[0]; Buffer.RemoveAt(0); } if ((pkg[0] == 0xa5) && (pkg[1] == 0x5a)) { pk.sync0 = pkg[0]; pk.sync1 = pkg[1]; pk.version = pkg[2]; pk.count = pkg[3]; pk.d1 = (UInt16)(pkg[5] + (pkg[4] << 8)); pk.d2 = (UInt16)(pkg[7] + (pkg[6] << 8)); pk.d3 = (UInt16)(pkg[9] + (pkg[8] << 8)); pk.d4 = (UInt16)(pkg[11] + (pkg[10] << 8)); pk.d5 = (UInt16)(pkg[13] + (pkg[12] << 8)); pk.d6 = (UInt16)(pkg[15] + (pkg[14] << 8)); //Debug.WriteLine(pk.d1); pk.switches = pkg[16]; rtfv1.Pop(pk.d1); rtfv2.Pop(pk.d2); rtfv3.Pop(pk.d3); rtfv4.Pop(pk.d4); rtfv5.Pop(pk.d5); rtfv6.Pop(pk.d6); } else { Debug.WriteLine("Invalid packet received!"); } } else { break; } }
and its my Qt Code
void myRecord::readData() { int const_a5=165; int const_5a=90; Buffer.append(serialPort->readAll()); while ((Buffer.size()> 0) && (Buffer.at(0) != char(const_a5))) { Buffer.remove(0,1); } qDebug() << Buffer.size(); if ((Buffer.size() >= 17) && (Buffer.at(0) == char(const_a5))) { char pkg[17]; Olimexino328_packet pk ; for (int i = 0; i < 17; i++) { pkg[i] = Buffer.at(0); Buffer.remove(0,1); } if ((pkg[0] == (char)const_a5) && (pkg[1] == (char)const_5a)) { pk.sync0 = pkg[0]; pk.sync1 = pkg[1]; pk.version = pkg[2]; pk.count = pkg[3]; pk.d1 = (quint16)(pkg[5] + (pkg[4] << 8)); pk.d2 = (quint16)(pkg[7] + (pkg[6] << 8)); pk.d3 = (quint16)(pkg[9] + (pkg[8] << 8)); pk.d4 = (quint16)(pkg[11] + (pkg[10] << 8)); pk.d5 = (quint16)(pkg[13] + (pkg[12] << 8)); pk.d6 = (quint16)(pkg[15] + (pkg[14] << 8)); pk.switches = pkg[16]; emit incomingData(pk.d1); } } }
ofc this (myRecord::readData) connect to signal readyRead().
There are two code just trying to read from arduino and arduino sending just 17 byte.
but how did i understood my Qt code is slow ? From output...
when i seeking Buffer.size() , at Qt , size increasing without any stopping , just Qt does not keep up to remove, on the other hand at c#, number sometimes get bigger sometimes thinner but i can understand at least c# keep up to remove dataAnyway, maybe my code isnt just good as i think, maybe tell me someone say what's wrong with my code ?
Thank you...------UPDATED-------
i finally find my solution for problem.
Solution is , everybody says there is common mistake do something in readyRead() so i created new method and send data to it.
like that :void myRecord::readData()
{
if (serialPort->isReadable())
processData(serialPort->readAll());}
void myRecord::processData(QByteArray &Buffer)
{
int const_a5=165;
int const_5a=90;
while ((Buffer.size()> 0) && (Buffer.at(0) != char(const_a5)))
{
Buffer.remove(0,1);} if ((Buffer.size() >= 17) && (Buffer.at(0) == char(const_a5)))
{
char pkg[17]; Olimexino328_packet pk ; for (int i = 0; i < 17; i++) { pkg[i] = Buffer.at(0); Buffer.remove(0,1); } if ((pkg[0] == (char)const_a5) && (pkg[1] == (char)const_5a)) { pk.sync0 = pkg[0]; pk.sync1 = pkg[1]; pk.version = pkg[2]; pk.count = pkg[3]; pk.d1 = (quint16)(pkg[5] + (pkg[4] << 8)); pk.d2 = (quint16)(pkg[7] + (pkg[6] << 8)); pk.d3 = (quint16)(pkg[9] + (pkg[8] << 8)); pk.d4 = (quint16)(pkg[11] + (pkg[10] << 8)); pk.d5 = (quint16)(pkg[13] + (pkg[12] << 8)); pk.d6 = (quint16)(pkg[15] + (pkg[14] << 8)); pk.switches = pkg[16]; if (pk.d1 < 60000) emit incomingData(pk.d1); } } }
So that's it ..
-
This post is deleted!