串口通信的MPU姿態(tài)傳感器數據包解析(xī)技術
2018/1/19 點擊(jī):
本程序段(duàn)描述了MPUXXX姿態傳感器通過(guò)串口發送給(gěi)主機時的數據包解析過程,僅(jǐn)供參(cān)考。
void Analysize_Data()
{
float CurrentTimeCounter = 0;
while (true){
bool data_1_catched = false;//緩存記錄數據是否捕獲到
//int CurrentTimeCounter = 0;
int buffer_len = buffer.Count;//獲取(qǔ)buffer長度
while (buffer.Count >= 5)//至少要包含頭(2字節) +功能字(1字(zì)節) +長度(dù)(1字節) +校驗(yàn)(1字節)
{
//1 查找數(shù)據頭
if (buffer[0] == 0x55 && buffer[1] == 0xaa)//檢測是否是包頭
{
int len = buffer[3];//數據(jù)長度
//數據不夠時移(yí)除數據
if (buffer.Count < len + 5)
{
buffer.RemoveRange(0, buffer.Count - 1);
break;
}
if (buffer[3] == 0x06) //該幀長度(dù)16字節//數據位沒(méi)有0x06位
{
Ctrl_Roll = (float)(((short)((buffer[4] << 8) | buffer[5])) / 100.0);//解析協議的,提取數據並將16進製轉(zhuǎn)換(huàn)為10進製,
Ctrl_Pitch = (float)(((short)((buffer[6] << 8) | buffer[7])) / 100.0);
Ctrl_Yaw = (float)(((short)((buffer[8] << 8) | buffer[9])) / 10.0);
data_1_catched = true;
buffer.RemoveRange(0, len + 4);//正確(què)分析一條數據,從緩存中移除(chú)數據。數據移除
if (data_1_catched)
{
//更新界麵
this.Invoke((EventHandler)(delegate//對監控的數據的實時曲線進行跟(gēn)新
{
chart1.Series[0].Points.AddXY(CurrentTimeCounter, Ctrl_Roll);
chart1.Series[1].Points.AddXY(CurrentTimeCounter, Ctrl_Pitch);
chart1.Series[2].Points.AddXY(CurrentTimeCounter, Ctrl_Yaw);
}));
}
}
else
{
buffer.RemoveAt(0);
break;
}
}
else
{ //這裏是很重要的,如果數據開始不是頭,則刪除數據
buffer.RemoveAt(0);
}
}
}
}
WONGLOVE將一直關(guān)注*實用的編程技術(shù),以(yǐ)饗網友。
- 上(shàng)一篇:UNITY3D MonoDevelop不能粘貼外部代碼文字怎 2018/3/4
- 下一篇:串口協議以及串口二進製整數據包解析(xī) 2018/1/11