問題:
QT撰寫了一個上位機程式,通過串口實時接收下位機以200Hz發過來的資料,波特率為460800,資料大小為21個位元組。現在的問題是,我的資料中有個計數自增位元組,所以能判斷資料接收是正確的,但是每次當接收到一段資料(大概190條)后,接收執行緒都會延時>900ms樣子,才會接收下一條資料,導致實時性顯示很差。
已確定下位機發送頻率和發送資料沒問題。
程式操作流程:
MainWindow中:
串口打開后,connect(comPort, SIGNAL(readyRead()), this, SLOT(readyReadComData()));
void MainWindow::readyReadComData()
{
emit readyReadData(*comPort);
}
void MainWindow::comReceiveTask()
{
//串口接收資料連接
comRecWorker = new receiveComData;
QObject::connect(this, SIGNAL(readyReadData(QSerialPort&)), comRecWorker, SLOT(receiveComDataSlot(QSerialPort&)),Qt::BlockingQueuedConnection);
comRecThread = new QThread;
comRecWorker->moveToThread(comRecThread);
}
receiveComData接收執行緒:
receiveComData::receiveComData(QObject *parent) : QObject(parent)
{
recDataBuf = new QByteArray;
recDataBuf->resize(2000);
}
void receiveComData::receiveComDataSlot(QSerialPort &comPort)
{
bool breakFlag = false, continueFlag = false;
recDataBuf->append(comPort.readAll());
while(recDataBuf->size() >= 21) //位元組總數最少為1幀
{
indexHead = recDataBuf->indexOf(currentProtocol::curProtocol.frameHeadBuf); //幀頭
if(indexHead==-1)
{
recDataBuf->clear();
break;
}
else
{
int selectTailIndex = indexHead;
while(1)
{ //判斷幀尾
indexTail = recDataBuf->indexOf(currentProtocol::curProtocol.frameTailBuf,selectTailIndex+1);
if(indexTail==-1)
{
breakFlag = true;
break;
}
//查找到幀尾
if((indexTail-indexHead+currentProtocol::curProtocol.frameTailBytesLen) < currentProtocol::curProtocol.frameTotalLength)
{ //校驗到幀尾時,位元組個數不完整
selectTailIndex = indexTail;
}
else if((indexTail-indexHead+currentProtocol::curProtocol.frameTailBytesLen) > currentProtocol::curProtocol.frameTotalLength)
{ //校驗到幀尾時,位元組個數超出
recDataBuf->remove(0, indexTail);
continueFlag = true;
break;
}
else
{ //校驗到正確幀尾和位元組長度
break;
}
}
if(breakFlag)
{
breakFlag = false;
break;
}
if(continueFlag)
{
continueFlag = false;
continue;
}
//計數自增位元組
int tempPos = indexHead + currentProtocol::curProtocol.frameHeadBytesLen + currentProtocol::curProtocol.frameIDBytesLen;
currentProtocol::curProtocol.frameCountBuf = recDataBuf->mid(tempPos, currentProtocol::curProtocol.frameCountBytesLen);
recDataBuf->remove(0, indexHead + currentProtocol::curProtocol.frameTotalLength);
//debug除錯
bool ok;
static long long recSaveTime = 0;
QString timestamp = QString::number(QDateTime::currentMSecsSinceEpoch());
long long timeTemp = timestamp.toLongLong();
int showTime = timeTemp - recSaveTime;
if(showTime > 10)
{
qDebug() << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
qDebug() << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
}
//debug顯示為:recTask---- + "當前毫秒數" + 上一幀與當前幀毫秒差 + 資料計數自增位元組
qDebug() << "recTask----" << timestamp << showTime << currentProtocol::curProtocol.frameCountBuf.toHex().toInt(&ok,16) << endl;
recSaveTime = timeTemp;
}
}
}
除錯結果:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
recTask---- "1587352390467" 942 65
recTask---- "1587352390477" 10 66
recTask---- "1587352390477" 0 67
recTask---- "1587352390477" 0 68
recTask---- "1587352390477" 0 69
recTask---- "1587352390477" 0 70
.....
recTask---- "1587352390481" 0 249
recTask---- "1587352390481" 0 250
recTask---- "1587352390481" 0 251
recTask---- "1587352390482" 1 252
recTask---- "1587352390482" 0 253
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
recTask---- "1587352391412" 930 254
recTask---- "1587352391412" 0 255
recTask---- "1587352391412" 0 0
recTask---- "1587352391412" 0 1
recTask---- "1587352391412" 0 2
recTask---- "1587352391412" 0 3
recTask---- "1587352391412" 0 4
recTask---- "1587352391412" 0 5
......
recTask---- "1587352391416" 0 184
recTask---- "1587352391416" 0 185
recTask---- "1587352391416" 0 186
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
recTask---- "1587352392357" 941 187
recTask---- "1587352392365" 8 188
recTask---- "1587352392365" 0 189
recTask---- "1587352392365" 0 190
recTask---- "1587352392365" 0 191
recTask---- "1587352392365" 0 192
recTask---- "1587352392365" 0 193
recTask---- "1587352392365" 0 194
recTask---- "1587352392365" 0 195
......
recTask---- "1587352392368" 0 117
recTask---- "1587352392368" 0 118
recTask---- "1587352392368" 0 119
麻煩各位高手解惑,不勝感激!!!
uj5u.com熱心網友回復:
把comPort放在receiveComData中,這樣信號發生及反應都在同一個執行緒里面。轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/40768.html
標籤:Qt
上一篇:有償求助,奇怪電子書閱讀要求
