/// <summary> /// Build 16 bit data header /// </summary> /// <param name="type"></param> /// <param name="p0"></param> /// <param name="p1"></param> /// <param name="p2"></param> /// <param name="p3"></param> /// <returns></returns> public static string Build16BitDataHeader(HeaderType type, int p0, int p1, int p2, int p3, CRC16 crcCalculator) { var sb = new StringBuilder(); sb.Append(Bin16BitHeader); sb.Append((char)ControlBytes.ZDLE); sb.Append('J'); sb.Append(((char)p0).ToString()); sb.Append(((char)p1).ToString()); sb.Append(((char)p2).ToString()); sb.Append(((char)p3).ToString()); var b = new byte[5]; b[0] = Convert.ToByte(type); b[1] = Convert.ToByte(p0); b[2] = Convert.ToByte(p1); b[3] = Convert.ToByte(p2); b[4] = Convert.ToByte(p3); var crc = CRCHelper.Compute16BitHeaderAsArray((int)type, p0, p1, p2, p3, crcCalculator); var crc1 = crc[1]; var crc2 = crc[0]; sb.Append(((char)crc1).ToString()); sb.Append(((char)crc2).ToString()); var command = sb.ToString(); return(command); }
/// <summary> /// 生成指令 /// </summary> /// <param name="rackList">仓位列表,用于相邻仓位的屏蔽</param> /// <returns></returns> public string ResetInstruction(IList <RackInfo> rackList = null) { StringBuilder sb = new StringBuilder(); sb.Append(this.TruckCode).Append(this.StartCode).Append(this.InOut); sb.Append(this.InPackCode).Append(this.InPackLayer).Append(this.OutPackCode).Append(this.OutPackLayer); int i = 0; string lastRoute = ""; foreach (var item in this.RouteWay) { if (i > 0) { string way = getTurnwayMap(item.Way); sb.Append(item.RouteCode).Append(way); lastRoute = item.RouteCode; } i++; } CRCHelper crcMethod = new CRCHelper(); string crc = crcMethod.CRCResult_ModBus(sb.ToString()); sb.Append(crc); return(sb.ToString()); }
/// <summary> /// Build 16 bit binary header. /// /// A binary header is sent by the sending program to the receiving program.All bytes in a binary header are ZDLE encoded. /// A binary header begins with the sequence ZPAD, ZDLE, ZBIN. /// 0 or more binary data subpackets with 16 bit CRC will follow depending on the frame type. /// * ZDLE A TYPE F3/P0 F2/P1 F1/P2 F0/P3 CRC-1 CRC-2 /// </summary> /// <param name="type"></param> /// <param name="f0"></param> /// <param name="f1"></param> /// <param name="f2"></param> /// <param name="f3"></param> /// <returns></returns> public static string Build16BitBinHeader(HeaderType type, ZFILEConversionOption f0, ZFILEManagementOption f1, ZFILETransportOption f2, ZFILEExtendedOptions f3, CRC16 crcCalculator) { var sb = new StringBuilder(); sb.Append(Bin16BitHeader); sb.Append(((char)(int)type).ToString()); sb.Append(((char)f3).ToString()); sb.Append(((char)f2).ToString()); sb.Append(((char)f1).ToString()); sb.Append(((char)f0).ToString()); var b = new byte[5]; b[0] = Convert.ToByte(type); b[1] = Convert.ToByte(f3); b[2] = Convert.ToByte(f2); b[3] = Convert.ToByte(f1); b[4] = Convert.ToByte(f0); var crc = CRCHelper.Compute16BitHeaderAsArray((int)type, (int)f3, (int)f2, (int)f1, (int)f0, crcCalculator); int crc1 = crc[1]; int crc2 = crc[0]; sb.Append(((char)crc1).ToString()); sb.Append(((char)crc2).ToString()); var command = sb.ToString(); return(command); }
/// <summary> /// 响应上线请求的数据 /// </summary> /// <param name="data"></param> /// <returns></returns> public byte[] ClientOnlineData(byte[] buffer) { byte[] response = new byte[GlobalStatus.ClientOnline.ResponseLen]; byte reslen = Convert.ToByte(GlobalStatus.ClientOnline.ResponseLen - 2); response[GlobalStatus.DataSOFOffset] = GlobalStatus.SOF; response[GlobalStatus.DataSOFOffset + GlobalStatus.DataLengthOffset] = reslen; response[GlobalStatus.DataSOFOffset + GlobalStatus.DataCommandOffset] = GlobalStatus.ClientOnline.ResponseType; //响应标准 response[3] = buffer[3]; response[4] = buffer[4]; response[5] = buffer[5]; response[6] = buffer[6]; response[7] = buffer[7]; response[8] = buffer[8]; response[9] = buffer[9]; response[10] = buffer[10]; response[11] = buffer[11]; response[12] = buffer[12]; response[13] = buffer[13]; response[14] = GlobalStatus.EOF; // 处理CRC byte[] crc = new byte[response.Length - 4]; Buffer.BlockCopy(response, 1, crc, 0, response.Length - 4); var crc_convert = CRCHelper.CCITT_CRC16_H2L(crc); response[12] = crc_convert[0]; response[13] = crc_convert[1]; return(response); }
//串口数据解析 private void ParseSerialData_Click(object sender, EventArgs e) { if (openFileDialog.ShowDialog() == DialogResult.OK) { try { BinaryReader br = new BinaryReader(openFileDialog.OpenFile()); byte[] b = br.ReadBytes((int)openFileDialog.OpenFile().Length); int NodeId; string time; byte[] data; if (DepackData(b, out NodeId, out time, out data)) { MainForm.pMainForm.mapdoc.Dvf.Text = "显示命令内容"; MainForm.pMainForm.mapdoc.Dvf.str = CRCHelper.ConvertCharToHex(b, b.Length); MainForm.pMainForm.mapdoc.Dvf.DataViewForm_ShowData(); } else { throw new Exception("数据校验错误!"); } br.Close(); } catch (Exception MyEx) { MessageBox.Show(MyEx.Message); } } }
public void TestMethod1() { //var val = TcpHelper.GetTemperature(1); //Assert.IsTrue(val == 300); //Int16 temp = 85; //var data = BitConverter.GetBytes(temp); //if (BitConverter.IsLittleEndian) //{ // Array.Reverse(data); //} //var str = CRCHelper.byteToHexStr(data, 2); //Assert.AreEqual(str, "0055"); ////byte[] 转 int16 ,需要反转数组 //Array.Reverse(data); //var intval = BitConverter.ToInt16(data); //Assert.IsTrue(intval == temp); var cmd = StringToByteArray("01 50 01 01 01 02"); var crc = CRCHelper.Checksum(cmd); Assert.IsTrue(crc == 86); var str = JsonConvert.SerializeObject(new HvacStateObject()); Assert.IsTrue(str.Length > 0); }
public void DataViewForm_ShowData() { try { SourceDataClass.isNodeTick = false; MainForm.ParseLock.WaitOne(); if (str.StartsWith("01EE")) { str = str.Substring(8); } SourceDataClass.GetData((CRCHelper.ConvertHexToChar(str))); ll = SourceDataClass.Parse(); MainForm.ParseLock.ReleaseMutex(); SourceDataClass.isNodeTick = true; InputGrid(); this.Show(); } catch (Exception e) { MainForm.ParseLock.ReleaseMutex(); SourceDataClass.isNodeTick = true; MessageBox.Show("无法解析文件:" + e.StackTrace); } //this.TopMost = true; }
public void Return32BitHeaderChecksumAsByte(byte[] expected) { var result = CRCHelper.Compute32BitHeaderAsArray((int)HeaderType.ZFILE, 0, 0, 0, 0, CRC32Calculator); for (int i = 0; i < expected.Length; i++) { Assert.True(result[i] == expected[i]); } }
public async Task SendCommand(string data) { var cmd = CRCHelper.StringToByteArray(data.Replace(" ", "")); var str = BitConverter.ToString(cmd, 0, cmd.Length).Replace("-", " "); _logger.LogInformation("SendCmd : " + str); using (var socket = SafeSocket.ConnectSocket(remoteEP)) { await SendAsync(socket, cmd, 0, cmd.Length, 0).ConfigureAwait(false); var response = await ReceiveAsync(socket); if (_curtainHelper != null) { await _curtainHelper.OnReceiveData(response); } } }
private void buttonX1_Click(object sender, EventArgs e) { if (!CircleCheck.Checked) { //string ans = CRCHelper.ConvertHexToChar(CommandBox.Text); //string str = CommandBox.Text; //byte[] c = new byte[1]; //for (int i = 0; i < str.Length / 2; i++) //{ // string s = str.Substring(i * 2, 2); // int d = Convert.ToByte(s, 16); // c[0] = (byte)d; //} //SyncSerialPort.Write(c, 0, 1); WriteCommand(CommandBox.Text); } else { if (buttonX1.Text == "发送") { buttonX1.Text = "停止"; timer.Interval = (int)float.Parse(CircleTime.Text) * 1000; string ans = CRCHelper.ConvertHexToChar(CommandBox.Text); WriteCommand(ans); timer.Start(); CircleTime.Enabled = false; CircleCheck.Enabled = false; CommandBox.Enabled = false; Commandlist.Enabled = false; } else { buttonX1.Text = "发送"; timer.Stop(); CircleTime.Enabled = true; CircleCheck.Enabled = true; CommandBox.Enabled = true; Commandlist.Enabled = true; } } }
/// <summary> /// 数据合法性检查 /// </summary> /// <returns>是否合法</returns> public override bool IsValid() { // 长度不匹配 if (Data.Length != GlobalStatus.ClientOnline.RequestLen) { return(false); } // 开始或者结束符不匹配 if (Data[GlobalStatus.DataSOFOffset] != GlobalStatus.SOF || Data[GlobalStatus.ClientOnline.RequestLen - 1] != GlobalStatus.EOF) { return(false); } // 标志位不匹配 if (Data[GlobalStatus.DataSOFOffset + GlobalStatus.DataCommandOffset] != GlobalStatus.ClientOnline.RequestType) { return(false); } return(CRCHelper.CheckCRC(Data)); // CRC 验证 }
/// <summary> /// Build 16 bit binary header. /// /// A binary header is sent by the sending program to the receiving program.All bytes in a binary header are ZDLE encoded. /// A binary header begins with the sequence ZPAD, ZDLE, ZBIN. /// 0 or more binary data subpackets with 16 bit CRC will follow depending on the frame type. /// * ZDLE A TYPE F3/P0 F2/P1 F1/P2 F0/P3 CRC-1 CRC-2 /// </summary> /// <param name="type"></param> /// <param name="p0"></param> /// <param name="p1"></param> /// <param name="p2"></param> /// <param name="p3"></param> /// <returns></returns> public static string Build16BitBinHeader(HeaderType type, int p0, int p1, int p2, int p3, CRC16 crcCalculator) { var sb = new StringBuilder(); sb.Append(Bin16BitHeader); sb.Append(((char)(int)type).ToString()); sb.Append(((char)p0).ToString()); sb.Append(((char)p1).ToString()); sb.Append(((char)p2).ToString()); sb.Append(((char)p3).ToString()); var crc = CRCHelper.Compute16BitHeader((int)type, p0, p1, p2, p3, crcCalculator); int crc1 = (crc & 0xff00) >> 8; int crc2 = crc & 0xff; sb.Append(((char)crc1).ToString()); sb.Append(((char)crc2).ToString()); var command = sb.ToString(); return(command); }
/// <summary> /// Build 32 bit binary header. /// /// A "32 bit CRC" Binary header is similar to a Binary Header, except the /// ZBIN(A) character is replaced by a ZBIN32(C) character, and four /// characters of CRC are sent. /// 0 or more binary data subpackets with 32 bit CRC will follow depending /// on the frame type. /// * ZDLE C TYPE F3/P0 F2/P1 F1/P2 F0/P3 CRC-1 CRC-2 CRC-3 CRC-4 /// </summary> /// <param name="type"></param> /// <param name="p0"></param> /// <param name="p1"></param> /// <param name="p2"></param> /// <param name="p3"></param> /// <returns></returns> public static string Build32BitBinHeader(HeaderType type, ZFILEConversionOption f0, ZFILEManagementOption f1, ZFILETransportOption f2, ZFILEExtendedOptions f3, CRC32 crcCalculator) { var sb = new StringBuilder(); sb.Append(Bin32BitHeader); sb.Append(((char)(int)type).ToString()); sb.Append(((char)f3).ToString()); sb.Append(((char)f2).ToString()); sb.Append(((char)f1).ToString()); sb.Append(((char)f0).ToString()); var crc = CRCHelper.Compute32BitHeaderAsArray((int)type, (int)f3, (int)f2, (int)f1, (int)f0, crcCalculator); foreach (char c in crc) { sb.Append(c); } var command = sb.ToString(); return(command); }
private void ShowData_Click(object sender, EventArgs e) { if (CmdList.Items.Count > 0) { if (SourceNodeBox.Text != "") { MainForm.pMainForm.mapdoc.Dvf.Text = "显示命令内容"; byte[] cmd = pack(); if (cmd.Length > 1024) { MessageBox.Show("命令长度多长,请删除部分命令!"); return; } MainForm.pMainForm.mapdoc.Dvf.str = CRCHelper.ConvertCharToHex(cmd, cmd.Length); MainForm.pMainForm.mapdoc.Dvf.DataViewForm_ShowData(); } else { MessageBox.Show("请选择一个正确的源地址!"); } } }
public async Task <string> SendCommand(string data, bool log = true) { try { var cmd = StringToByteArray(data.Replace(" ", "")); var cmdCRC = CRCHelper.get_CRC16_C(cmd); var cmd1 = new byte[cmd.Length + 2]; cmd.CopyTo(cmd1, 0); cmdCRC.CopyTo(cmd1, cmd.Length); var str = CRCHelper.byteToHexStr(cmd1, cmd1.Length); if (log) { _logger.Info("SendCmd : " + str); } using (var socket = SafeSocket.ConnectSocket(remoteEP)) { var ret = await SendAsync(socket, cmd1, 0, cmd1.Length, 0).ConfigureAwait(false); var response = await ReceiveAsync(socket); if (log) { _logger.Info("Cmd Receive : " + response); } if (_helper != null) { await _helper.OnReceiveCommand(response); } return(response); } } catch (Exception ex) { _logger.Info("err data:" + data); _logger.Error(ex.ToString()); return(string.Empty); } }
/// <summary> /// Build 32 bit data header /// </summary> /// <param name="type"></param> /// <param name="p0"></param> /// <param name="p1"></param> /// <param name="p2"></param> /// <param name="p3"></param> /// <returns></returns> public static string Build32BitDataHeader(HeaderType type, int p0, int p1, int p2, int p3, CRC32 crcCalculator) { var sb = new StringBuilder(); sb.Append(Bin32BitHeader); sb.Append((char)ControlBytes.ZDLE); sb.Append('J'); sb.Append(((char)p0).ToString()); sb.Append(((char)p1).ToString()); sb.Append(((char)p2).ToString()); sb.Append(((char)p3).ToString()); var crc = CRCHelper.Compute32BitHeaderAsArray((int)type, p0, p1, p2, p3, crcCalculator); foreach (char c in crc) { sb.Append(c); } var command = sb.ToString(); return(command); }
//网络数据解析 private void OpenData_Click(object sender, EventArgs e) { if (openFileDialog.ShowDialog() == DialogResult.OK) { try { BinaryReader br = new BinaryReader(openFileDialog.OpenFile()); byte[] b = br.ReadBytes((int)openFileDialog.OpenFile().Length); MainForm.pMainForm.mapdoc.Dvf.Text = "显示命令内容"; MainForm.pMainForm.mapdoc.Dvf.str = CRCHelper.ConvertCharToHex(b, b.Length); SourceDataClass.isCommDepack = true; MainForm.pMainForm.mapdoc.Dvf.DataViewForm_ShowData(); SourceDataClass.isCommDepack = false; br.Close(); } catch (Exception MyEx) { MessageBox.Show(MyEx.Message); } } }
public async Task SendCommand(string data, bool debug = false) { try { var cmd = StringToByteArray(data.Replace(" ", "")); var cmdCRC = CRCHelper.Checksum(cmd); var cmd1 = new byte[cmd.Length + 1]; cmd.CopyTo(cmd1, 0); cmd1[cmd.Length] = (byte)cmdCRC; var str = BitConverter.ToString(cmd1, 0, cmd1.Length).Replace("-", " "); if (debug) { _logger.LogInformation("SendCmd : " + str); } using (var s = SafeSocket.ConnectSocket(remoteEP)) { var ret = await SendAsync(s, cmd1, 0, cmd1.Length, 0).ConfigureAwait(false); var response = await ReceiveAsync(s); if (debug) { _logger.LogInformation("Receive : " + response); } if (!string.IsNullOrWhiteSpace(response) && !string.IsNullOrEmpty(response)) { await _helper.OnReceiveData(response); } } } catch (Exception ex) { _logger.LogError("err data: " + data); _logger.LogError(ex.ToString()); } }
/// <summary> /// Build common hex frame /// The receiver sends responses in hex headers. /// The sender also uses hex headers when they are not followed by binary data subpackets. /// </summary> /// <param name="type"></param> /// <param name="p0"></param> /// <param name="p1"></param> /// <param name="p2"></param> /// <param name="p3"></param> /// <returns></returns> public static string BuildCommonHexHeader(HeaderType type, int p0, int p1, int p2, int p3, CRC16 crcCalculator) { var sb = new StringBuilder(); sb.Append(HexHeader); sb.Append(((int)type).ToString("x2")); sb.Append(p0.ToString("x2")); sb.Append(p1.ToString("x2")); sb.Append(p2.ToString("x2")); sb.Append(p3.ToString("x2")); var crc = CRCHelper.Compute16BitHeaderAsArray((int)type, p0, p1, p2, p3, crcCalculator); foreach (var c in crc) { sb.Append(c.ToString("x2")); } sb.Append(HexCommonHeaderEnd); var command = sb.ToString(); return(command); }
private void Button_Click(object sender, RoutedEventArgs e) { var sou = source.Text; var plo = pole.Text; if (string.IsNullOrEmpty(sou)) { MessageBox.Show("请输入待校验的数据"); source.Focus(); return; } if (string.IsNullOrEmpty(plo)) { MessageBox.Show("请输入校验多项式"); pole.Focus(); return; } if (string.IsNullOrEmpty(ini.Text)) { MessageBox.Show("请输入初始值"); ini.Focus(); return; } CRCHelper helper = new CRCHelper(); var pole2 = Convert.ToUInt16(plo, 16); helper.pPoly = pole2; var pole3 = Convert.ToUInt16(ini.Text, 16); helper.CRCInit = pole3; var res2 = sou.ToHex(); var buffer = helper.GetCRC16(res2); var txt = buffer.ToHex(); result.Text = txt; }
private void AddToList_Click(object sender, EventArgs e) { int[] dat = new int[1]; if (DestNodeName.Text == "") { MessageBox.Show("未选择目标节点!!!"); return; } if (HexCheck.Checked) { byte[] end = CRCHelper.ConvertHexToChar(parameter.Text); if (end == null) { return; } int len = 20 + 8 + end.Length * 8; SourceDataClass.InitForPack(len); dat[0] = 119; SourceDataClass.OutPutIntBit(dat, 8); dat[0] = len; SourceDataClass.OutPutIntBit(dat, 12); dat[0] = 2;//默认值 if (CommBox.SelectedIndex == 0) { dat[0] = 2; } if (CommBox.SelectedIndex == 1) { dat[0] = 3; } SourceDataClass.OutPutIntBit(dat, 8); for (int i = 0; i < end.Length; i++) { dat[0] = end[i]; SourceDataClass.OutPutIntBit(dat, 8); } //SourceDataClass.OutPutIntBit(dat, endchar.Text.Length / 2 * 8); } else { int arraylen = parameter.Text.Length;//int[] 长度 int len = 20 + 8 + arraylen * 8; SourceDataClass.InitForPack(len); dat[0] = 119; SourceDataClass.OutPutIntBit(dat, 8); dat[0] = len; SourceDataClass.OutPutIntBit(dat, 12); dat[0] = 2;//默认值 if (CommBox.SelectedIndex == 0) { dat[0] = 2; } if (CommBox.SelectedIndex == 1) { dat[0] = 3; } byte[] para = Encoding.Default.GetBytes(parameter.Text); for (int i = 0; i < arraylen; i++) { dat[0] = para[i]; SourceDataClass.OutPutIntBit(dat, 8); } } //加入列表 MainForm.pMainForm.comlistwin.AddCmd(DestNodeName.Text, "设备参数设置", SourceDataClass.packdata); MainForm.pMainForm.RefreshListStat(); MessageBox.Show("设备参数设置命令已加入命令列表!"); }
private void DLoadDataWorker_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; networkdata data = (networkdata)e.Argument; try { filereader = new BinaryReader(File.Open(data.FileNamePath, FileMode.Open)); FileInfo d = new FileInfo(data.FileNamePath); long filelength = d.Length; if (ACPacketHandle == null) { ACPacketHandle = new EventWaitHandle(false, EventResetMode.AutoReset); } if (Dclient.Connected) { byte[] mySendBuffer = new byte[1028]; Int64 SendBytes = 0; if (Dstream.CanWrite) { int numberOfBytesRead = 0; uint head = 0xDADA; Buffer.BlockCopy(BitConverter.GetBytes(head), 0, mySendBuffer, 0, 2); while (((numberOfBytesRead = filereader.Read(mySendBuffer, 4, 1024)) != 0) && (!worker.CancellationPending)) { Buffer.BlockCopy(BitConverter.GetBytes(numberOfBytesRead), 0, mySendBuffer, 2, 2); Dstream.Write(mySendBuffer, 0, numberOfBytesRead + 4);// SendBytes += numberOfBytesRead; numberOfBytesRead = 0; worker.ReportProgress((int)((double)SendBytes * 100 / filelength)); if (!ACPacketHandle.WaitOne(10000))//等待信号超时 { Exception MyEx = new Exception("接收应答数据超时!"); throw MyEx; } if (worker.CancellationPending) { e.Cancel = true; break; } } if (worker.CancellationPending) { e.Cancel = true; } filereader.BaseStream.Seek(0, SeekOrigin.Begin);//回到文件头 byte[] totalb = filereader.ReadBytes((int)filereader.BaseStream.Length); ushort crc = CRCHelper.CRC16byte(totalb); filereader.Close(); head = 0xEDED; Buffer.BlockCopy(BitConverter.GetBytes(head), 0, mySendBuffer, 0, 2); Buffer.BlockCopy(BitConverter.GetBytes(crc), 0, mySendBuffer, 2, 2); Dstream.Write(mySendBuffer, 0, 4); } } } catch (Exception MyEx) { MessageBox.Show(MyEx.Message); AddtoBox(Color.Black, MyEx.Message + ":" + MyEx.StackTrace.ToString() + "\r\n/>"); filereader.Close(); } }
public void Return32BitHeaderChecksumAsInt(uint expected) { var crc = CRCHelper.Compute32BitHeader((int)HeaderType.ZFILE, 0, 0, 0, 0, CRC32Calculator); Assert.True(expected.Equals(crc)); }
/// <summary> /// 处理gps信息,刷新控件及发送信息给主窗口 /// </summary> /// <param name="sender"></param> /// <param name="e">gps信息</param> void GPSForm_GpsLogEvent(object sender, EventsClass.GpsEventArgs e) { if (GpsLog.InvokeRequired) { LogBoxCallback d = new LogBoxCallback(GPSForm_GpsLogEvent); this.Invoke(d, new object[] { sender, e }); } else { string comming = e.gpsdata; comming = comming.Substring(comming.LastIndexOf("EB90")); string[] str = comming.Split(','); if (str[1] == "03") { GpsLog.AppendText("430-->>" + e.gpsdata + ",END" + "\r\n"); GpsLog.ScrollToCaret(); if (str[2] == "Y") { GpsLog.AppendText("430回复ACK正确" + "\r\n"); GpsLog.ScrollToCaret(); } else { GpsLog.AppendText("430回复ACK错误" + "\r\n"); GpsLog.ScrollToCaret(); } } else { string oldstr = comming; oldstr = oldstr.Remove(oldstr.Length - 2); try { string crcnew = CRCHelper.CRC16(oldstr); string newstr = CRCHelper.ConvertCharToHex(comming) + CRCHelper.ConvertCharToHex(",END"); GpsLog.AppendText("430-->>" + newstr + "\r\n"); GpsLog.ScrollToCaret(); string crc = newstr.Substring(newstr.Length - 12, 4); if (crc == crcnew) { string ack = "EB90,03,Y,"; ack += CRCHelper.CRC16(ack); ack += ",END"; ack = CRCHelper.ConvertCharToHex(ack); WriteCommand(ack); GpsLog.AppendText("上位机回复ACK正确" + "\r\n"); GpsLog.ScrollToCaret(); } else { string ack = "EB90,03,N,"; ack += CRCHelper.CRC16(ack); ack += ",END"; ack = CRCHelper.ConvertCharToHex(ack); WriteCommand(ack); GpsLog.AppendText("上位机回复ACK错误" + "\r\n"); GpsLog.ScrollToCaret(); wrongnumber++; numberlabel.Text = "上位机校验错误次数:" + wrongnumber.ToString() + " 双击清零"; } } catch (Exception MyEx) { MessageBox.Show(MyEx.Message + ":" + MyEx.StackTrace); } } } }
public override bool Send(out string error) { bool isEnd = true; error = null; try { var filereader = new BinaryReader(_filestream); var mySendBuffer = new byte[1028]; var sendBytes = 0; Int16 numberOfBytesRead = 0; const ushort head = 0xDADA; Buffer.BlockCopy(BitConverter.GetBytes(head), 0, mySendBuffer, 0, 2); while ((numberOfBytesRead = (Int16)filereader.Read(mySendBuffer, 4, 1024)) != 0) { Buffer.BlockCopy(BitConverter.GetBytes(numberOfBytesRead), 0, mySendBuffer, 2, 2); base.LoadData(mySendBuffer); if (SendData(out error)) { if (EAutoResetEvent.WaitOne(TimeOut)) { Debug.WriteLine("WaitOne!!!"); if (!_args.ParseOK) { error = _args.ErrorMsg; isEnd = false; break; } sendBytes += numberOfBytesRead; if (ReportSendBytes != null) { ReportSendBytes(sendBytes); } } else { error = " 接收数据超时!"; isEnd = false; break; } } else { isEnd = false; break; } } //循环接收,两种可能:超时or出错;发完了 if (isEnd) { filereader.BaseStream.Seek(0, SeekOrigin.Begin);//回到文件头 var totalb = filereader.ReadBytes((int)filereader.BaseStream.Length); var crc = CRCHelper.CRC16Byte(totalb); filereader.Close(); const int End = 0xEDED; Buffer.BlockCopy(BitConverter.GetBytes(End), 0, mySendBuffer, 0, 2); Buffer.BlockCopy(BitConverter.GetBytes(crc), 0, mySendBuffer, 2, 2); base.LoadData(mySendBuffer); isEnd = SendData(out error); } return(isEnd); } catch (Exception exception) { error = exception.Message; return(false); } }