2017-04-09 19 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