我正在从一个串行端口接收数据的项目中工作。数据正在生成并从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位值时做错了什么,但无法弄清楚原因。 这里是输出:
http://stackoverflow.com/questions/11815894/how-to-read-write-arbitrary-bits-in-c-c/27592777#27592777 – dtech