Qt 重新组合字节以生成32个值时出错
我正在从事一个项目,在该项目中,我从串行端口接收数据。数据由Arduino Mega ADK生成和发送。arduino数据以字符“S”、“N”、“P”开头,以标识数据包的开头。它后面是18个字节的数据,这些数据将存储到9个16个变量中。接下来是存储在quint8值中的3个字节,然后是存储在4个int32值中的20个字节 当以字符串形式发送数据时,我可以使用它,但当以单个字节形式发送数据并将其重建为其值时,我似乎找不到一种方法使其工作 根据我的阅读,Arduino是little endian,因此我以以下方式构造接收端的值: 解析数据的函数如下所示:Qt 重新组合字节以生成32个值时出错,qt,serialization,deserialization,Qt,Serialization,Deserialization,我正在从事一个项目,在该项目中,我从串行端口接收数据。数据由Arduino Mega ADK生成和发送。arduino数据以字符“S”、“N”、“P”开头,以标识数据包的开头。它后面是18个字节的数据,这些数据将存储到9个16个变量中。接下来是存储在quint8值中的3个字节,然后是存储在4个int32值中的20个字节 当以字符串形式发送数据时,我可以使用它,但当以单个字节形式发送数据并将其重建为其值时,我似乎找不到一种方法使其工作 根据我的阅读,Arduino是little endian,因此
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++;
}
}
}
void主窗口::NoseAviByte()
{
//从鼻锥avi bay获取数据
readnosconeavi();
//查找SNP数据包头
int curCount=0;
int maxCount=dataBytes.size();
//循环遍历字节数组
while(curCount accX=(dataBytes.at(curCount)+(dataBytes.at(curCount+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 myValue=quint8(dataBytes.at(curCount))|quint8(dataBytes.at(curCount+1))非常感谢。这似乎解决了我的问题。使用at()时,QByteArray的默认行为是返回字符吗?我想我需要重新阅读QByteArray@caveman.agz是的,这是默认值。有时可能会很烦人,但我有一个包含数十个字节转换的类,我在所有项目中都使用它。这使得使用QbyteArray更容易。
quint32 myValue = quint8(dataBytes.at(curCount)) | quint8(dataBytes.at(curCount+1)) << 8 | quint8(dataBytes.at(curCount+2)) << 16 | quint8(dataBytes.at(curCount+3)) << 24;