/// <summary> /// 回调方法-配置器接收时 /// </summary> /// <param name="strNotice"></param> /// <param name="bArrBuffer"></param> private void SelChsForm_OnNotice(string strNotice, byte[] bArrBuffer) { if (!(string.IsNullOrEmpty(strNotice) || strNotice.Equals(""))) { string strContent = (RunVariable.IfDebug && bArrBuffer != null) ? string.Format("{0}:{1}", strNotice, ScaleConverter.ByteArr2HexStr(bArrBuffer)) : strNotice; ShowSendOrReceiveMessage(strContent); } }
private bool ProcessOne(byte[] bufFrame, out string strErrMsg) { bool bIfSucc = false; strErrMsg = ""; Package.ECommandType eResponseType = Package.GetResponseType(bufFrame, out strErrMsg); switch (eResponseType) { case Package.ECommandType.SwipingCard: SwipingCardData objSwipingCardData = new SwipingCardData(); IList <string> listResponseData = new List <string>(); bIfSucc = Package.ParseBag_SwipingCard(bufFrame, ref objSwipingCardData, out strErrMsg); if (bIfSucc) { SwipingCardData objSent = (objSwipingCardData != null) ? (SwipingCardData)objSwipingCardData.Clone() : null; _OnReceiveSwipingCard?.Invoke(objSent, strErrMsg); DoNotice(string.Format("接收刷卡数据正确"), bufFrame); //保存记录 SaveSwipingCardData(objSent); //响应 byte[] bArrTargetAddress = new byte[5]; byte[] bArrOrigialAddress = new byte[5]; Array.Copy(bufFrame, 5, bArrTargetAddress, 0, bArrTargetAddress.Length); Array.Copy(bufFrame, 10, bArrOrigialAddress, 0, bArrOrigialAddress.Length); //55 AA 00 0B 20 01 00 00 00 00 06 12 34 00 01 1E 主机链路层ACK byte[] bArrBag = Package.BuildBag_MainDeviceACK(bArrTargetAddress, bArrOrigialAddress); bIfSucc = SendCommand(bArrBag, out strErrMsg); DoNotice(string.Format("{0}{1}", "发送主机链路层ACK指令", (bIfSucc ? "成功" : "失败")), bArrBag); /* * Thread.Sleep(50);//停顿数50毫秒 * * //55 FF 00 0C 21 06 12 34 00 01 01 00 00 00 00 00 xx 主机应答 * byte[] bArrBag2 = Package.BuildBag_MainDeviceResponse(bArrTargetAddress, bArrOrigialAddress); * bIfSucc = SendCommand(bArrBag2, out strErrMsg); * DoNotice(string.Format("{0}{1}", "发送主机应答指令", (bIfSucc ? "成功" : "失败")), bArrBag2); * if (!(bArrBag2 == null || bArrBag2.Length == 0)) * { * this._LastReSendTime = DateTime.Now; * this._RetryCommandList.Add(new Model.RetryCommand(ScaleConverter.ByteArr2HexStr(bArrBag2).Replace(" ", ""), 1)); * } * //55 AA 00 0B 21 06 12 34 00 01 01 00 00 00 00 XX 刷卡头链路层ACK */ bIfSucc = true; } break; case Package.ECommandType.CardHeadDeviceACK: try { if (!(this._RetryCommandList == null || this._RetryCommandList.Count == 0)) { string strBuffHexStr = ""; string strCommandHexStr = ""; for (int i = this._RetryCommandList.Count - 1; i >= 0; i--) { Model.RetryCommand objCommand = (Model.RetryCommand) this._RetryCommandList[i]; if (objCommand != null) { strCommandHexStr = objCommand.CommandHexStr.Substring(10, 20); strBuffHexStr = ScaleConverter.ByteArr2HexStr(bufFrame).Replace(" ", "").Substring(10, 20); if (string.Compare(strCommandHexStr, strBuffHexStr) == 0) { this._RetryCommandList.RemoveAt(i); } } } } } catch (Exception err) { strErrMsg = err.Message; } DoNotice(string.Format("接收刷卡头链路层ACK指令"), bufFrame); bIfSucc = true; break; case Package.ECommandType.PingResponse: DeviceAddress objDeviceAddress = new DeviceAddress(); bIfSucc = Package.ParseBag_PingResponse(bufFrame, ref objDeviceAddress, out strErrMsg); if (bIfSucc) { DeviceAddress objSent = (objDeviceAddress != null) ? (DeviceAddress)objDeviceAddress.Clone() : null; _OnPingResponse?.Invoke(objSent, strErrMsg); //响应 byte[] bArrTargetAddress = new byte[5]; byte[] bArrOrigialAddress = new byte[5]; Array.Copy(bufFrame, 5, bArrTargetAddress, 0, bArrTargetAddress.Length); Array.Copy(bufFrame, 10, bArrOrigialAddress, 0, bArrOrigialAddress.Length); //Thread.Sleep(50);//停顿数50毫秒 //55 FF 00 0D 93 01 00 00 00 00 06 12 34 00 00 41 98 FE 从机PING应答 //55 AA 00 0B 93 01 00 00 00 00 06 12 34 00 00 09 AA 主机链路层应答 byte[] bArrBag = Package.BuildBag_MainDeviceACK4Ping(bArrTargetAddress, bArrOrigialAddress); bIfSucc = SendCommand(bArrBag, out strErrMsg); //DoNotice(string.Format("{0}{1}", "发送主机链路层ACK指令", (bIfSucc ? "成功" : "失败")), bArrBag); //_OnPingNotice?.Invoke(string.Format("发送Ping指令{0}", (bIfSucc ? "成功" : "失败")), bArrBag); //if (_OnPingNotice != null) _OnPingNotice(string.Format("发送主机链路层ACK指令{0}", (bIfSucc ? "成功" : "失败")), bArrBag); } break; case Package.ECommandType.MainDeviceACK4PingResponse: DeviceAddress objDeviceAddress1 = new DeviceAddress(); bIfSucc = Package.ParseBag_MainDeviceACK4PingResponse(bufFrame, ref objDeviceAddress1, out strErrMsg); if (bIfSucc) { DeviceAddress objSent = (objDeviceAddress1 != null) ? (DeviceAddress)objDeviceAddress1.Clone() : null; _OnMainDeviceACK4PingResponse?.Invoke(objSent, strErrMsg); } break; default: strErrMsg = "无效数据"; bIfSucc = false; break; } return(bIfSucc); }
/// <summary> /// 回调方法-当有Ping设备时 /// </summary> /// <param name="strNotice"></param> /// <param name="bArrBuffer"></param> private void OnPingNotice(string strNotice, byte[] bArrBuffer) { if (!(string.IsNullOrEmpty(strNotice) || strNotice.Equals(""))) { string strContent = (RunVariable.IfDebug && bArrBuffer != null) ? string.Format("{0}:{1}", strNotice, ScaleConverter.ByteArr2HexStr(bArrBuffer)) : strNotice; ShowNotice(string.Format("{0} {1}", DateTime.Now.ToString(Config.LongTimeFormat), strContent)); } }
private void OnMainDeviceACK4PingResponse(DeviceAddress objDeviceAddress, string strErrInfo) { if (!(objDeviceAddress == null || !string.IsNullOrEmpty(strErrInfo))) { if (this._LastDeviceAddress != null) { if (this._LastDeviceAddress.DeviceNo.Equals(objDeviceAddress.DeviceNo) && this._LastDeviceAddress.DeviceType.Equals(objDeviceAddress.DeviceType)) { //2017-07-13 11:14:17 接收从机链路层ACK指令:55 AA 00 0B 92 06 01 01 00 00 01 00 00 00 00 57 string strContent = string.Format("接收从机链路层ACK指令"); strContent = (RunVariable.IfDebug && objDeviceAddress.Buffer != null) ? string.Format("{0}:{1}", strContent, ScaleConverter.ByteArr2HexStr(objDeviceAddress.Buffer)) : strContent; ShowNotice(string.Format("{0} {1}", DateTime.Now.ToString(Config.LongTimeFormat), strContent)); //this._LastDeviceAddress = null; timer1.Enabled = false; } } } }
private void btnCreate_Click(object sender, EventArgs e) { PointLatLng point = PositionConverter.ParsePointFromString(txtPosition.Text); int number; double speed, bearing, height; if (point.IsEmpty) { } else if (!int.TryParse(txtNumber.Text, out number)) { } else if (!double.TryParse(txtSpeed.Text, out speed)) { } else if (!double.TryParse(txtBearing.Text, out bearing)) { } else if (!double.TryParse(txtHeight.Text, out height) && txtHeight.Text != "Unknown") { } else { var track = new TrackData { CallSign = txtCallSign.Text.ToUpper(), Status = (TrackStatus)Enum.Parse(typeof(TrackStatus), cmbStatus.Text), Number = number, Position = point, Speed = ScaleConverter.ConvertSpeed(speed, speedScale, "knots"), Bearing = ScaleConverter.ConvertBearing(bearing, bearingScale, "degree"), LastUpdated = DateTime.Now }; if (editMode) { MessageBox.Show("Passin"); if (this.track != null) { track.Faker = this.track.Faker; if (txtHeight.Text != "Unknown") { track.Height = ScaleConverter.ConvertHeight(height, heightScale, "ft"); } if (txtCallSign.Text == "") { track.CallSign = null; } if (track.Status == TrackStatus.Pending) { track.Status = TrackStatus.OverridePending; } CommandResponse response = ControlViews.Main.trackHandler.Update(track); if (response.Code == CommandResponseCode.Success) { ControlViews.Track.SetControl(ControlViews.TrackView); ControlViews.TrackView.setTrackInfo(track); } else { MessageBox.Show(response.Message); } } } else { MessageBox.Show("Passin2"); track.Faker = true; track.Height = ScaleConverter.ConvertHeight(height, heightScale, "ft"); CommandResponse response = ControlViews.Main.trackHandler.Create(track); if (response.Code == CommandResponseCode.Success) { clearFields(); } else { MessageBox.Show(response.Message); } } } }
private void OnPingResponse(DeviceAddress objDeviceAddress, string strErrInfo) { if (!(objDeviceAddress == null || !string.IsNullOrEmpty(strErrInfo))) { if (this._LastDeviceAddress != null) { if (this._LastDeviceAddress.DeviceNo.Equals(objDeviceAddress.DeviceNo) && this._LastDeviceAddress.DeviceType.Equals(objDeviceAddress.DeviceType) && this._LastDeviceAddress.PingNum.Equals(objDeviceAddress.PingNum)) { string strContent = string.Format("ping {0}{1}成功 !", GetDeviceTypeDesc(objDeviceAddress.DeviceType), objDeviceAddress.DeviceNo); strContent = (RunVariable.IfDebug && objDeviceAddress.Buffer != null) ? string.Format("{0}:{1}", strContent, ScaleConverter.ByteArr2HexStr(objDeviceAddress.Buffer)) : strContent; ShowNotice(string.Format("{0} {1}", DateTime.Now.ToString(Config.LongTimeFormat), strContent)); this._LastDeviceAddress = null; //timer1.Enabled = false; } } } }
public void MediatorContext_OnEarthquake(object sender, Client.Peer.EPSPQuakeEventArgs e) { if (e.InformationType == QuakeInformationType.Unknown) { return; } var earthquakeNotification = configuration.EarthquakeNotification; if (!earthquakeNotification.Enabled) { return; } if (!earthquakeNotification.Notice) { return; } // 震源情報は震度 3 以上で発表されるため、震度 3 とみなす var scale = e.InformationType == QuakeInformationType.Destination ? 30 : ScaleConverter.Str2Int(e.Scale); if (scale < earthquakeNotification.MinScale) { return; } var builder = new ToastContentBuilder(); // タイトル行 var type = e.InformationType switch { QuakeInformationType.ScalePrompt => "震度速報", QuakeInformationType.Destination => "震源情報", QuakeInformationType.ScaleAndDestination => "震源・震度情報", QuakeInformationType.Detail => "地震情報", QuakeInformationType.Foreign => "遠地(海外)地震情報", _ => "地震情報", }; if (e.InformationType == QuakeInformationType.Foreign || e.InformationType == QuakeInformationType.Destination) { builder.AddText($"{type} ({e.OccuredTime})"); } else { builder.AddText($"{type} ({e.OccuredTime} 震度{e.Scale})"); } if (e.InformationType == QuakeInformationType.ScalePrompt) { var maxScaleGroup = e.PointList.OrderBy(e => e.ScaleInt).Reverse().GroupBy(e => e.Scale).First(); builder.AddText($"震度{maxScaleGroup.Key}: {string.Join('、', maxScaleGroup.Select(e => e.Name))}"); } else { var tsunamiDescription = e.TsunamiType switch { DomesticTsunamiType.None => "津波の心配なし", DomesticTsunamiType.Checking => "津波の有無調査中", DomesticTsunamiType.Effective => "津波予報 発表中", _ => "津波の有無不明", }; builder.AddText($"{e.Destination} (深さ{e.Depth}, {e.Magnitude}) {tsunamiDescription}"); } builder.AddArgument("type", "quake").AddArgument("receivedAt", e.ReceivedAt.ToString()); builder.Show(); }
/// <summary> /// 创建包-写卡 /// </summary> /// <param name="objCard"></param> /// <returns></returns> private static byte[] BuildBag_WriteCard(Card objCard) { byte[] arrRtn = new byte[0]; if (objCard != null) { int iAreaCode, iBuidCode, iUnitCode, iRoomCode; iAreaCode = objCard.RAreaCode; iBuidCode = objCard.RBuildCode; iUnitCode = objCard.RUnitCode; iRoomCode = objCard.RRoomCode; if ((iAreaCode >= 0 && iAreaCode <= 99) && (iBuidCode >= 0 && iBuidCode <= 99) && (iUnitCode >= 0 && iUnitCode <= 99) && (iRoomCode >= 0 && iRoomCode <= 9999)) { byte[] arrRtnTemp = new byte[1450]; int iIndex = 0; //帧起始符 高位 arrRtnTemp[iIndex++] = 0x55; //帧起始符 低位 arrRtnTemp[iIndex++] = 0xFF; //数据长度 高位 arrRtnTemp[iIndex++] = 0x00; //数据长度 低位 arrRtnTemp[iIndex++] = 0x21; //命令字 arrRtnTemp[iIndex++] = GetCommandCodeByType(ECommandType.WriteCard_Send); //区编码 arrRtnTemp[iIndex++] = ScaleConverter.OneHexStr2Byte(BQ2(iAreaCode)); //栋编码 arrRtnTemp[iIndex++] = ScaleConverter.OneHexStr2Byte(BQ2(iBuidCode)); //单元编码 arrRtnTemp[iIndex++] = ScaleConverter.OneHexStr2Byte(BQ2(iUnitCode)); string strRoomCode = FormatRoomCode(iRoomCode); //楼层编码 arrRtnTemp[iIndex++] = ScaleConverter.OneHexStr2Byte(BQ2(strRoomCode.Substring(0, 2))); //房间编码 arrRtnTemp[iIndex++] = ScaleConverter.OneHexStr2Byte(BQ2(strRoomCode.Substring(2, 2))); //过期时间 DateTime dt = Functions.ConvertToNormalTime(objCard.ExpiryDate); string strYear = dt.Year.ToString(); //年-高位 arrRtnTemp[iIndex++] = ScaleConverter.OneHexStr2Byte(strYear.Substring(0, 2)); //年-低位 arrRtnTemp[iIndex++] = ScaleConverter.OneHexStr2Byte(strYear.Substring(2, 2)); //月 arrRtnTemp[iIndex++] = ScaleConverter.OneHexStr2Byte(BQ2(dt.Month)); //日 arrRtnTemp[iIndex++] = ScaleConverter.OneHexStr2Byte(BQ2(dt.Day)); //卡片类型 arrRtnTemp[iIndex++] = Convert.ToByte(objCard.CardType); DateTime CreateDt = System.DateTime.Now; //预留6个字节 //iIndex += 6; //发卡时间 当前 年 arrRtnTemp[iIndex++] = ScaleConverter.OneHexStr2Byte(BQ2(CreateDt.Year.ToString().Substring(2, 2))); //发卡时间 当前 月 arrRtnTemp[iIndex++] = ScaleConverter.OneHexStr2Byte(BQ2(CreateDt.Month)); //发卡时间 当前 日 arrRtnTemp[iIndex++] = ScaleConverter.OneHexStr2Byte(BQ2(CreateDt.Day)); //发卡时间 当前 时 arrRtnTemp[iIndex++] = ScaleConverter.OneHexStr2Byte(BQ2(CreateDt.Hour)); //发卡时间 当前 分 arrRtnTemp[iIndex++] = ScaleConverter.OneHexStr2Byte(BQ2(CreateDt.Minute)); //发卡时间 当前 写扇区 先转成16进制再转成字符串 string chsStr = ""; switch (Convert.ToInt32(objCard.listChsInfo[1][0])) { case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: chsStr = objCard.listChsInfo[1][0].ToString(); break; case 10: chsStr = string.Format("A"); break; case 11: chsStr = string.Format("B"); break; case 12: chsStr = string.Format("C"); break; case 13: chsStr = string.Format("D"); break; case 14: chsStr = string.Format("E"); break; case 15: chsStr = string.Format("F"); break; } arrRtnTemp[iIndex++] = ScaleConverter.OneHexStr2Byte(BQ2(chsStr)); //序号 16个字节 string strSerialNo = objCard.SerialNo.Replace(" ", "").PadLeft(32, '0'); for (int i = 1; i <= 16; i++) { arrRtnTemp[iIndex++] = ScaleConverter.OneHexStr2Byte(strSerialNo.Substring((i - 1) * 2, 2)); } //CRC8校验 arrRtnTemp[iIndex++] = CRC8A.GetCRC8(arrRtnTemp, 0, iIndex - 1); arrRtn = new byte[iIndex]; Array.Copy(arrRtnTemp, arrRtn, arrRtn.Length); } } return(arrRtn); }
/// <summary> /// 解包(读卡响应包) /// </summary> /// <param name="bArrBag"></param> /// <returns></returns> public static bool ParseBag_ReadCard(byte[] bArrBag, ref CardData objCardData, out string strErrMsg) { bool bIfSucc = false; objCardData = new CardData(); strErrMsg = ""; try { //数据位 byte bCode = bArrBag[5]; strErrMsg = GetFaultInfoByCode(bCode); if (strErrMsg.Equals("")) { //解析卡号 int iBeginIndex = 6; byte[] bArrCardNo = new byte[4]; for (int i = bArrCardNo.Length - 1; i >= 0; i--) { bArrCardNo[i] = bArrBag[iBeginIndex++]; } objCardData.CardNo = Functions.ConverToUInt(bArrCardNo);//低字节在前,高字节在后 //空卡直接返回 年月日为零则是空卡 if (int.Parse(bArrBag[15].ToString()) + int.Parse(bArrBag[16].ToString()) + int.Parse(bArrBag[17].ToString()) + int.Parse(bArrBag[18].ToString()) == 0) { objCardData.CardType = 6; } else { //解析区编码 objCardData.AreaCode = Convert.ToInt32(ScaleConverter.Byte2HexStr(bArrBag[iBeginIndex++])); //解析栋编码 objCardData.BuildCode = Convert.ToInt32(ScaleConverter.Byte2HexStr(bArrBag[iBeginIndex++])); //解析单元编码 objCardData.UnitCode = Convert.ToInt32(ScaleConverter.Byte2HexStr(bArrBag[iBeginIndex++])); //解析楼层编码 int iFloorCode = Convert.ToInt32(ScaleConverter.Byte2HexStr(bArrBag[iBeginIndex++])); //解析房间编码 objCardData.RoomCode = (iFloorCode * 100) + Convert.ToInt32(ScaleConverter.Byte2HexStr(bArrBag[iBeginIndex++])); //解析日期 //解析年 string strYear = ScaleConverter.Byte2HexStr(bArrBag[iBeginIndex++]) + ScaleConverter.Byte2HexStr(bArrBag[iBeginIndex++]); //解析月 string strMonth = ScaleConverter.Byte2HexStr(bArrBag[iBeginIndex++]); //解析日 string strDay = ScaleConverter.Byte2HexStr(bArrBag[iBeginIndex++]); objCardData.ExpiryDate = Functions.ConvertToUnixTime(Convert.ToDateTime(string.Format("{0}-{1}-{2} 00:00:00", strYear, strMonth, strDay))); //解析卡片类型 objCardData.CardType = Convert.ToInt32(bArrBag[iBeginIndex++]); //解析预留 6个字节 //iBeginIndex += 6; //新卡预留信息为开卡时间与及当前写扇区,旧卡信息为空 //bArrBag[iBeginIndex].ToString(); string strBeginYear = "20" + ScaleConverter.Byte2HexStr(bArrBag[iBeginIndex++]); string strBeginMonth = ScaleConverter.Byte2HexStr(bArrBag[iBeginIndex++]); string strBeginDay = ScaleConverter.Byte2HexStr(bArrBag[iBeginIndex++]); string strBeginHour = ScaleConverter.Byte2HexStr(bArrBag[iBeginIndex++]); string strBeginMin = ScaleConverter.Byte2HexStr(bArrBag[iBeginIndex++]); string chsStr = bArrBag[iBeginIndex++].ToString(); //月份为00表示旧卡 if (strBeginMonth.CompareTo("00") != 0 && strBeginMonth.CompareTo("0") != 0) { objCardData.BeginDate = Functions.ConvertToUnixTime(Convert.ToDateTime(string.Format("{0}-{1}-{2} {3}:{4}:00", strBeginYear, strBeginMonth, strBeginDay, strBeginHour, strBeginMin))); } //扇区00也表示旧卡, 防止乱写情况还是做个判断 if (chsStr.CompareTo("00") != 0 && chsStr.CompareTo("0") != 0) { objCardData.listChsInfo[1].Add(Convert.ToInt32(chsStr)); } else { objCardData.listChsInfo[1].Add(1); } //解析序号 16个字节 byte[] bArrSerialNo = new byte[16]; Array.Copy(bArrBag, iBeginIndex, bArrSerialNo, 0, bArrSerialNo.Length); objCardData.SerialNo = ScaleConverter.ByteArr2HexStr(bArrSerialNo).Replace(" ", ""); } bIfSucc = true; } } catch (Exception err) { strErrMsg = err.Message; } return(bIfSucc); }
/// <summary> /// 创建发送包 /// </summary> /// <param name="CommandType">指令类型</param> /// <param name="objCard">写卡指令专用</param> /// <param name="dt">时间,同步时间专用</param> /// <param name="objDeviceAddress">地址,Ping指令专用</param> /// <param name="chs">扇区重置,写卡专用</param> /// <returns></returns> public static byte[] BuildBag(ECommandType CommandType, Card objCard = null, String chs = null, DateTime?dt = null, DeviceAddress objDeviceAddress = null) { byte[] arrRtn = new byte[0]; byte[] arrTemp; switch (CommandType) { case ECommandType.WriteCard_Send: arrTemp = BuildBag_WriteCard(objCard); if (arrTemp.Length > 0) { arrRtn = new byte[arrTemp.Length]; Array.Copy(arrTemp, arrRtn, arrRtn.Length); } break; case ECommandType.ReadCard_Send: arrRtn = new byte[6]; arrTemp = ScaleConverter.HexStr2ByteArr("55 FF 00 01 34"); Array.Copy(arrTemp, arrRtn, arrTemp.Length); arrRtn[5] = CRC8A.GetCRC8(arrTemp); break; case ECommandType.Ping: if (objDeviceAddress != null) { arrTemp = BuildBag_Ping(objDeviceAddress); if (arrTemp.Length > 0) { arrRtn = new byte[arrTemp.Length]; Array.Copy(arrTemp, arrRtn, arrRtn.Length); } } break; case ECommandType.SyncTime_Send: //同步时间 if (dt != null) { byte[] arrRtnTemp2 = BuildBag_SyncTime(Convert.ToDateTime(dt)); if (arrRtnTemp2.Length > 0) { arrRtn = new byte[arrRtnTemp2.Length]; Array.Copy(arrRtnTemp2, arrRtn, arrRtn.Length); } } break; case ECommandType.ChsSel: //扇区查询 arrTemp = BuildBag_ChsSel(); if (arrTemp.Length > 0) { arrRtn = new byte[arrTemp.Length]; Array.Copy(arrTemp, arrRtn, arrRtn.Length); } break; case ECommandType.ChsClean: //扇区重置 arrTemp = BuildBag_ChsClean(chs); if (arrTemp.Length > 0) { arrRtn = new byte[arrTemp.Length]; Array.Copy(arrTemp, arrRtn, arrRtn.Length); } break; } return(arrRtn); }
/// <summary> /// 创建包-扇区重置 /// </summary> /// <param name="chs">需要重置的扇区</param> /// <returns></returns> private static byte[] BuildBag_ChsClean(String chs) { byte[] arrRtn = new byte[7]; int iIndex = 0; //帧起始符 高位 arrRtn[iIndex++] = 0x55; //帧起始符 低位 arrRtn[iIndex++] = 0xFF; //数据长度 高位 arrRtn[iIndex++] = 0x00; //数据长度 低位 arrRtn[iIndex++] = 0x02; //命令字 arrRtn[iIndex++] = 0x38; //数据 要重置的扇区 string chsStr = ""; switch (Convert.ToInt32(chs)) { case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: chsStr = chs; break; case 10: chsStr = string.Format("A"); break; case 11: chsStr = string.Format("B"); break; case 12: chsStr = string.Format("C"); break; case 13: chsStr = string.Format("D"); break; case 14: chsStr = string.Format("E"); break; case 15: chsStr = string.Format("F"); break; } arrRtn[iIndex++] = ScaleConverter.OneHexStr2Byte(BQ2(chsStr)); //CRC8校验 arrRtn[iIndex++] = CRC8A.GetCRC8(arrRtn, 0, arrRtn.Length - 1); return(arrRtn); }