public PressureMeterArgs(PressureMeterArgs data) : base(null) { this.Unit = data.Unit; this.PressureValue = data.PressureValue; this.ErrorMessage = data.ErrorMessage; }
/// <summary> /// 用于正式接收串口设备的数据 /// -32768 ~ 32767在此范围的值,当传过来的值超过32767时一定是负值,此时要异或0xFFFF后再加1补码是为负数的绝对值 /// 数据格式:以一对大括号开始结束,共9个字节 /// { DP D5 D4 D3 D2 D1 UNIT }\{ E R R O R 0 1 }\{ E R R O R 0 2 }\{ E R R O R 0 3 } /// </summary> /// <param name="sender"></param> /// <param name="args"></param> public override void ReceiveData(object sender, DataTransmissionEventArgs args) { byte[] temp = new byte[_detectByteLength]; try { lock (m_ReadBuffer) { m_ReadBuffer.AddRange(args.EventData); } PressureMeterArgs para = Analyze(m_ReadBuffer); if (para != null) { base.ReceiveData(sender, para); } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); throw ex; } }
/// <summary> /// 对压力表数据进行解析,分别生成数据和单位 /// </summary> /// <param name="eventData"></param> /// <returns></returns> private PressureMeterArgs Analyze(List <byte> eventData) { PressureMeterArgs args = null; if (eventData != null && eventData.Count < _detectByteLength) { return(null); } byte[] buffer = new byte[_detectByteLength]; bool bFind = false; lock (m_ReadBuffer) { while (eventData.Count >= _detectByteLength) { if (eventData[0] != 0x7B) { eventData.RemoveAt(0); continue; } else { if (eventData[_detectByteLength - 1] != 0x7D) { eventData.RemoveAt(0); continue; } else { bFind = true; eventData.CopyTo(0, buffer, 0, _detectByteLength); eventData.RemoveRange(0, _detectByteLength); } } } } if (bFind) { //小数点错误 if (buffer[1] > 0x33 || buffer[1] < 0x30) { return(null); } //单位错误 if (buffer[7] > 0x37 || buffer[1] < 0x30) { return(null); } for (int iLoop = 2; iLoop <= 6; iLoop++) { if (buffer[iLoop] < 0x30 || buffer[iLoop] > 0x39) { return(null); } } int D5 = (buffer[2] - 0x30) * 10000; int D4 = (buffer[3] - 0x30) * 1000; int D3 = (buffer[4] - 0x30) * 100; int D2 = (buffer[5] - 0x30) * 10; int D1 = (buffer[6] - 0x30); int total = D1 + D2 + D3 + D4 + D5; if (total > 0xFFFF) //错误数字 { return(null); } ushort num = 0; float sum = 0; if (total > 32767) //负数 { num = (ushort)total; num = (ushort)(num ^ 0xFFFF + 0x0001); sum = -1 * num; } else { num = (ushort)total; sum = num; } switch (buffer[1]) { case 0x31: sum *= 0.1f; break; case 0x32: sum *= 0.01f; break; case 0x33: sum *= 0.001f; break; } PressureUnit unit = (PressureUnit)(buffer[7] - 0x30); //单位换算,统一为KPa switch (unit) { case PressureUnit.MPa: sum = sum * 1000; break; default: break; } args = new PressureMeterArgs(unit, sum); return(args); } else { return(null); } }