Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 重新组合字节以生成32个值时出错_Qt_Serialization_Deserialization - Fatal编程技术网

Qt 重新组合字节以生成32个值时出错

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,因此

我正在从事一个项目,在该项目中,我从串行端口接收数据。数据由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(curCountaccX=(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;