#region【方法:解析數據線程】 private void DataParse() { int waittime = 0;//等待時間 bool isExit = false;//是否超時退出 byte[] headData = new byte[4];//命令頭 byte[] cmdData = new byte[19];//命令 while (true) { try { if (m_RevQueue.Count > headData.Length) { isExit = false; while (m_RevQueue.Count < 4)//小於命令頭長度,進入等待狀態,2s超時退出 { waittime++; if (waittime > 100) { isExit = true; break; } Thread.Sleep(1); } headData = new byte[4];//命令頭 while (true) { while (m_RevQueue.Count < 1)//小於命令頭長度,進入等待狀態,2s超時退出 { waittime++; if (waittime > 100) { isExit = true; break; } Thread.Sleep(1); } //如果獲取字符與頭字符不一致則每位向后移一位 if (headData[0] != 0xAA|| headData[1] != 0x01 || headData[2] != 0x01 || headData[3] != 0x01 ) { headData[0] = headData[1]; headData[1] = headData[2]; headData[2] = headData[3]; headData[3] = m_RevQueue.Dequeue(); continue; } break; } while (m_RevQueue.Count < 19)//小於命令長度,進入等待狀態,2s超時退出 { waittime++; if (waittime > 100) { isExit = true; break; } Thread.Sleep(1); } waittime = 0; //Console.WriteLine(headData[3].ToString("X2")); if (isExit) continue; cmdData = new byte[23]; 取出后面的19位 for (int i = 0; i < 19; i++)//取出命令 { cmdData[i + 4] = m_RevQueue.Dequeue(); } //把頭字符復制到cmdData; headData.CopyTo(cmdData, 0); GCByteToModel(m_DeviceModel, cmdData); } else { Thread.Sleep(10); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } } #endregion