/// <summary> /// 添加待发送数据包 /// </summary> /// <param name="Word">命令字</param> /// <param name="Reserve">保留位</param> /// <param name="Data">数据</param> /// <remarks>连续添加不应超过最多数据包个数(15)</remarks> public void AddBlock(byte Word, byte Reserve, byte[] Data) { if (Data == null || Data.Length != BlockLength - 3) { throw new Exception("Data Length!=12"); } ZBlock p = new ZBlock(); p.Word = Word; p.Reserve = Reserve; p.Data = Data; SendBlock.InsertObject(p); }
public void AddPoint(PointF point) { lock (DataList) { DataList.InsertObject(point); } this.Invalidate(); }
//协议解析 private void AnalyseProtocol() { //解析帧头 ZFrame f; f.S1 = Buffer.FetchObject(); f.S2 = Buffer.FetchObject(); f.Source = Buffer.FetchObject(); f.Target = Buffer.FetchObject(); f.Reserve = Buffer.FetchObject(); f.PackageNum = Buffer.FetchObject(); //插入帧头数据 ReceiveFrame.InsertObject(f); _ReceiveFrameNum++; //引发事件 if (OnReceviceFrame != null) { OnReceviceFrame(); } //循环读取数据包 for (int i = 0; i < f.PackageNum; i++) { //校验和 byte sum = 0; for (int j = 0; j < BlockLength - 1; j++) { sum += Buffer[j]; } if (sum == Buffer[BlockLength - 1]) { ZBlock p; p.Data = new byte[12]; p.Word = Buffer.FetchObject(); p.Reserve = Buffer.FetchObject(); for (int j = 0; j < BlockLength - 3; j++) { p.Data[j] = Buffer.FetchObject(); } p.CheckSum = Buffer.FetchObject(); ReceiveBlock.InsertObject(p); _ReceiveBlockNum++; } else { for (int j = 0; j < BlockLength; j++) { Buffer.FetchObject(); } _ErrorBlockNum++; } } //引发事件 if (ReceiveBlock.Amount > 0 && OnReceviceBlock != null) { OnReceviceBlock(); } }
//接收数据 void SerialObject_OnReceviceByte() { while (SerialObject != null && SerialObject.BufferByteNum > 0) { Buffer.InsertObject(SerialObject.ReadByte()); while (Buffer.Amount > 0) { if (Buffer[0] != S1) { Buffer.FetchObject(); _LostByteNum++; } else { break; } } if (CheckFrame()) { AnalyseProtocol(); } } }
/// <summary> /// 向示波器控件添加数据 /// </summary> /// <param name="data">待添加数据</param> public void AddData(float data) { //插入数据 _Datas.InsertObject(data); //检测模式,校验数据,计算极值 switch (_FillMode) { case FillModeEnum.All: high = ComputHigh(_Datas); low = ComputLow(_Datas); break; case FillModeEnum.AboveZero: if (data < 0) { throw new ArgumentException("Data must above zero in AboveZero mode"); } high = ComputHigh(_Datas); break; case FillModeEnum.Limit: if ((data < _Low) || (data > _High)) { throw new ArgumentException("Data must in the limit zone in Limit mode"); } break; } //递增网格绘制位置 GridPosi += _Interval; //当达到临界值则返回0 if (GridPosi >= _GridR) { GridPosi -= _GridR; } //重绘 this.Invalidate(); }