직렬 포트에서 데이터를 수신하는 프로젝트에서 작업하고 있습니다. 데이터는 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 비트 값을 재조합 할 때 잘못된 것을하고있는 것 같지만 그 이유를 알 수는 없다.
http://stackoverflow.com/questions/11815894/how-to-read-write-arbitrary-bits-in-c-c/27592777#27592777 – dtech