2017-04-09 2 views
0

직렬 포트에서 데이터를 수신하는 프로젝트에서 작업하고 있습니다. 데이터는 Arduino 메가 ADK에서 생성되어 전송됩니다. arduino 데이터는 'S', 'N', 'P'문자로 시작하여 패킷의 시작을 식별합니다. 9 개의 quint16 변수에 저장 될 18 바이트의 데이터가옵니다. 그 다음에 quint8 값으로 저장 될 3 바이트와 4 int32 값에 저장 될 20 바이트가옵니다.바이트를 재조합하여 quint32 값을 만드는 오류

데이터를 문자열로 전송할 때이 작업이 있었지만 데이터를 개별 바이트로 보내고 해당 값으로 재구성 할 때 작업을 수행하는 방법을 찾지 못하는 것 같습니다. 내 독서에서

는 아두 이노는 리틀 엔디안, 그래서 다음과 같은 방식으로 수신 측에 값을 구성 :

데이터를 분석하는 기능입니다 여기 :

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를 채 웁니다.

나쁜 값을 추적하기 위해 스프레드 시트를 만들기 시작했고 곧바로 문제가 발견되었습니다. 왜 내가 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를 반환하는 것입니다 : 다음은 출력됩니다. 함께 추가하기 전에 charquint8으로 먼저 변환하십시오.

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

정말 고마워요. 이 문제가 해결 된 것으로 보입니다. at()을 사용할 때 char을 반환하는 QByteArray의 기본 동작입니까? 나는 QByteArray에 대한 문서를 다시 읽을 필요가 있다고 생각한다. –

+0

@ caveman.agz 이것이 기본값이다. 때로는 귀찮을 수도 있지만 모든 프로젝트에서 사용하는 수십 바이트의 변환이 포함 된 클래스가 있습니다. QByteArrays로 작업하는 것이 훨씬 더 쉽습니다. – mrg95