我用MFC+MSComm控制元件做的讀取九軸姿態的資料,但是就是無法實作資料包的決議!決議程序一直出錯!有沒有誰做過這方面的,求指導?幫我看下問題出現在哪里?

頭檔案:
public:
struct STime stcTime;
struct SAcc stcAcc;
struct SGyro stcGyro;
struct SAngle stcAngle;
struct SMag stcMag;
struct STime
{
unsigned char ucYear;
unsigned char ucMonth;
unsigned char ucDay;
unsigned char ucHour;
unsigned char ucMinute;
unsigned char ucSecond;
unsigned short usMiliSecond;
};
struct SAcc
{
short a[3];
short T;
};
struct SGyro
{
short w[3];
short T;
};
struct SAngle
{
short Angle[3];
short T;
};
struct SMag
{
short h[3];
short T;
};
cpp檔案:
oid CIMUDlg::OnCommMscomm1()
{
// TODO: 在此處添加訊息處理程式代碼
//接識訓沖區有資料
if (m_mscom.get_CommEvent() == 2)
{
//Receive1COMData();
CString str, str1;
CString strtemp;
BYTE chrBuffer[2000];
static unsigned char ucRxCnt = 0;
static unsigned short usRxLength = 0;
long k;
unsigned short usLength = 0, usCnt = 0, uklength = 0;
VARIANT InputData = m_mscom.get_Input();
COleSafeArray fs;
fs = InputData;
long ulComm;
ulComm = m_comb2.GetCurSel();
uklength = fs.GetOneDimSize();
//usLength = CollectData(ulComm, chrBuffer);
for (k = 0; k < uklength; k++)//錯誤
{
fs.GetElement(&k, chrBuffer + k);//將資料寫入陣列
BYTE bt = *(char*)(chrBuffer + k); //字符型
if (m_ctrlHexReceive.GetCheck())
strtemp.Format(_T("%02X "), bt); //將字符以十六進制方式送入臨時變數strtemp存放,注意這里加入一個空隔,以便顯示的時候有間隔
else
strtemp.Format(_T("%c"), bt); //將字符送入臨時變數strtemp存放
m_EditRev += strtemp; //加入接收編輯框對應字串
}
UpdateData(false);
}
用下面的方法是一直顯示有問題
usLength = fs.GetOneDimSize();
memcpy(chrBuffer, fs, usLength);
usRxLength += usLength;
while (usRxLength >= 11)
{
if (chrBuffer[0] != 0x55)
{
usRxLength--;
memcpy(&chrBuffer[0], &chrBuffer[1], usLength);
continue;
}
switch (chrBuffer[1])
{
case 0x50:
memcpy(&stcTime, &chrBuffer[2], 8);
break;
case 0x51:
memcpy(&stcAcc, &chrBuffer[2], 8);
break;
case 0x52:
memcpy(&stcGyro, &chrBuffer[2], 8);
break;
case 0x53:
memcpy(&stcAngle, &chrBuffer[2], 8);
break;
case 0x54:
memcpy(&stcMag, &chrBuffer[2], 8);
break;
}
usRxLength -= 11;
memcpy(&chrBuffer[0], &chrBuffer[1], usLength);
}
}
CString str_T;
str_T.Format(_T("Time:20%d-%d-%d %d:%d:%.3f\r\n"), (short)stcTime.ucYear, (short)stcTime.ucMonth,
(short)stcTime.ucDay, (short)stcTime.ucHour, (short)stcTime.ucMinute, (float)stcTime.ucSecond + (float)stcTime.usMiliSecond / 1000);
CString str_A;
str_A.Format(_T("Acc:%.3f %.3f %.3f\r\n"), (float)stcAcc.a[0] / 32768 * 16, (float)stcAcc.a[1] / 32768 * 16, (float)stcAcc.a[2] / 32768 * 16);
CString str_G;
str_G.Format(_T("Gyro:%.3f %.3f %.3f\r\n"), (float)stcGyro.w[0] / 32768 * 2000, (float)stcGyro.w[1] / 32768 * 2000, (float)stcGyro.w[2] / 32768 * 2000);
CString str_AG;
str_AG.Format(_T("Angle:%.3f %.3f %.3f\r\n"), (float)stcAngle.Angle[0] / 32768 * 180, (float)stcAngle.Angle[1] / 32768 * 180, (float)stcAngle.Angle[2] / 32768 * 180);
CString str_M;
str_M.Format(_T("Mag:%d %d %d\r\n"), stcMag.h[0], stcMag.h[1], stcMag.h[2]);
m_EditRev += str_T;
m_EditRev += str_A;
m_EditRev += str_G;
m_EditRev += str_AG;
m_EditRev += str_M;
//UpdateData(false); //將資料在螢屏中對應控制元件中顯示出來。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/148532.html
標籤:單片機/工控
上一篇:mysql問題處理總結
下一篇:JDBC概述
