2017-04-09 20 views
0

我正在從一個串行端口接收數據的項目中工作。數據正在生成並從Arduino Mega ADK發送。 Arduino數據以字符'S','N','P'開始以標識數據包的開始。接着是要存儲到9個quint16變量中的18個字節的數據。接下來是3個字節存儲在quint8值中,然後是20個字節存儲在4個int32值中。重新組合字節以生成quint32值的錯誤

我有這個他們重建自己的價值觀工作發送數據的字符串時,但我不能似乎找到一種方式來獲得發送數據的單個字節時它的工作,和。

從我的閱讀,Arduino是小端,所以我構建值在接收端通過以下方式:

該分析數據的功能在這裏:

void MainWindow::NoseAviByte() 
{ 
//Get data from nose cone avi bay 
readNoseConeAvi(); 

//Look for SNP packet header 
int curCount = 0; 
int maxCount = dataBytes.size(); 


//Loop through array of bytes 
while(curCount < maxCount) 
{ 

    //If packet header is found, parse data vals 
    if(((dataBytes.at(curCount) == 'S') && (dataBytes.at(curCount + 1) == 'N') && (dataBytes.at(curCount + 2) == 'P')) && (curCount + 62) < maxCount) 
    { 
     //All incoming values should be in little endian order 
     curCount += 3; 
     /***Start Low-g MEMS MPU-9250***/ 
     quint16 accX = 0; 
     quint16 accY = 0; 
     quint16 accZ = 0; 
     quint16 gyroX = 0; 
     quint16 gyroY = 0; 
     quint16 gyroZ = 0; 
     quint16 magX = 0; 
     quint16 magY = 0; 
     quint16 magZ = 0; 
     /***End Low-g MEMS MPU-9250***/ 

     /***Start High-g ACC***/ 
     quint8 accHX = 0; 
     quint8 accHY = 0; 
     quint8 accHZ = 0; 
     /***End High-g ACC***/ 

     /***Start Hgh precision Alt***/ 
     quint32 highPresAlt = 0; 
     /***End Hgh precision Alt***/ 

     /***Start GPS***/ 
     quint32 gpsLat = 0; 
     quint32 gpsLong = 0; 
     quint32 gpsAlt = 0; 
     quint32 gpsTime = 0; 

     accX = (dataBytes.at(curCount) + (dataBytes.at(curCount + 1) << 8)); 
     curCount += 2; 
     accY = (dataBytes.at(curCount) | (dataBytes.at(curCount + 1) << 8)); 
     curCount += 2; 
     accZ = (dataBytes.at(curCount) | (dataBytes.at(curCount + 1) << 8)); 
     curCount += 2; 
     gyroX = (dataBytes.at(curCount) | (dataBytes.at(curCount + 1) << 8)); 
     curCount += 2; 
     gyroY = (dataBytes.at(curCount) | (dataBytes.at(curCount + 1) << 8)); 
     curCount += 2; 
     gyroZ = (dataBytes.at(curCount) | (dataBytes.at(curCount + 1) << 8)); 
     curCount += 2; 
     magX = (dataBytes.at(curCount) | (dataBytes.at(curCount + 1) << 8)); 
     curCount += 2; 
     magY = (dataBytes.at(curCount) | (dataBytes.at(curCount + 1) << 8)); 
     curCount += 2; 
     magZ = (dataBytes.at(curCount) | (dataBytes.at(curCount + 1) << 8)); 
     curCount += 2; 

     accHX = dataBytes.at(curCount); 
     curCount += 1; 
     accHY = dataBytes.at(curCount); 
     curCount += 1; 
     accHZ = dataBytes.at(curCount); 
     curCount += 1; 

     highPresAlt = (dataBytes.at(curCount) | (dataBytes.at(curCount + 1) << 8) | (dataBytes.at(curCount + 2) << 16) | (dataBytes.at(curCount + 3) << 24)); 
     curCount += 4; 

     gpsLat = (dataBytes.at(curCount) | (dataBytes.at(curCount + 1) << 8) | (dataBytes.at(curCount + 2) << 16) | (dataBytes.at(curCount + 3) << 24)); 
     curCount += 4; 
     gpsLong = (dataBytes.at(curCount) | (dataBytes.at(curCount + 1) << 8) | (dataBytes.at(curCount + 2) << 16) | (dataBytes.at(curCount + 3) << 24)); 
     curCount += 4; 
     gpsAlt = (dataBytes.at(curCount) | (dataBytes.at(curCount + 1) << 8) | (dataBytes.at(curCount + 2) << 16) | (dataBytes.at(curCount + 3) << 24)); 
     curCount += 4; 
     gpsTime = (dataBytes.at(curCount) | (dataBytes.at(curCount + 1) << 8) | (dataBytes.at(curCount + 2) << 16) | (dataBytes.at(curCount + 3) << 24)); 
     curCount += 4; 
    } 
    else 
    { 
     curCount++; 
    } 
} 

} 

的功能填充的QByteArray是:

void MainWindow::readNoseConeAvi() 
{ 
QByteArray noseData = serial->readAll(); 
QDataStream stream(noseData); 
dataBytes = noseData; 
inDataStream = &stream; 

qDebug() << "Reading data bytes from telemetry source: "; 
} 

我開始創建一個電子表格來跟蹤任何錯誤值,發現問題的時候了。看來我在重新組裝32位值時做錯了什麼,但無法弄清楚原因。 這裏是輸出:

var type and expected output with actual output after two runs.

+0

http://stackoverflow.com/questions/11815894/how-to-read-write-arbitrary-bits-in-c-c/27592777#27592777 – dtech

回答

1

問題是QByteArray::at()返回一個char可以去負。先將char轉換爲quint8,然後再將它們相加。

quint32 myValue = quint8(dataBytes.at(curCount)) | quint8(dataBytes.at(curCount+1)) << 8 | quint8(dataBytes.at(curCount+2)) << 16 | quint8(dataBytes.at(curCount+3)) << 24; 

這意味着您的所有轉換都可能出錯,而不僅僅是quint32。請確保您在其他轉換中也指定了quint8

我建議你創建轉換函數,所以你不必一遍又一遍地寫出它。

+0

非常感謝。這似乎解決了我的問題。 QByteArray在使用at()時返回一個字符的默認行爲是什麼?我想我需要重新閱讀有關QByteArray –

+0

@ caveman.agz的文檔是的,這是默認設置。有時候可能很煩人,但我有一個包含數十個字節轉換的類,我在我的所有項目中都使用它。使用QByteArrays更容易。 – mrg95