private void sendEndOftransmision(SerialPort sp) { sp.Write(new byte[] { (byte)0x04 }, 0, 1); YModemPacket endpacket = new YModemPacket(); endpacket.isend = true; endpacket.longpacket = false; endpacket.packetnum = 0; endpacket.data = new byte[128]; endpacket.createPacket(); sp.Write(endpacket.packet, 0, endpacket.packet.Length); return; }
private void SendPacket(SerialPort sp, YModemPacket pack) { for (int i = 0; i < 3; i++) { sp.Write(pack.packet, 0, pack.packet.Length); for (int j = 0; j < 10; j++) { int b = sp.ReadByte(); if (b == 0x06) { return; } Thread.Sleep(50); } } throw new Exception("Не удаётся отправить пакет с данными.\nСвязь с контроллером прервана!"); }
protected override void OnDoWork(DoWorkEventArgs e) { int oldBaudRate = ((SerialportChannel)_port).BaudRate; ProtocolType oldProtocol = _port.RelkonProtocolType; _port.Open(); _port.ControllerAddress = 0; if (_mode == LoaderMode.UploadProgram || _mode == LoaderMode.UploadProgramAndConfiguration) { if (this.CancellationPending) { e.Cancel = true; return; } byte[] req = _port.SendRequest(new byte[] { 0x00, 0xA0 }, 2); string s = ""; if (req != null) { s = Encoding.ASCII.GetString(req); } bool bootLoaderMode = !s.ToLower().Contains("relkon 6"); if (!bootLoaderMode) { if (this.CancellationPending) { e.Cancel = true; return; } _port.Open(); this.ReportProgress(0, "Перевод контроллера в режим загрузчика..."); //Перетераем первый символ слова для загрузчика _port.WriteByteToMemory(MemoryType.FRAM, 0x7FF5, 0x00); _port.ResetController(); this.ReportProgress(50, "Перевод контроллера в режим загрузчика..."); _port.Close(); if (this.CancellationPending) { e.Cancel = true; return; } Thread.Sleep(500); } if (this.CancellationPending) { e.Cancel = true; return; } ((SerialportChannel)_port).BaudRate = 115200; _port.RelkonProtocolType = ProtocolType.RC51BIN; _port.Open(); this.ReportProgress(100, "Перевод контроллера в режим загрузчика..."); ((SerialportChannel)_port).DirectPort.Write("1"); waitfor(((SerialportChannel)_port).DirectPort, 'C'); byte[] bytes2 = new byte[_progBuffer.Length - 1]; Buffer.BlockCopy(_progBuffer, 0, bytes2, 0, _progBuffer.Length - 1); ushort packetnum = 0; YModemPacket initpacket = new YModemPacket(); initpacket.isinit = true; initpacket.packetnum = packetnum; initpacket.filename = "program.bin"; initpacket.filelength = bytes2.Length; initpacket.longpacket = false; initpacket.createPacket(); ((SerialportChannel)_port).DirectPort.Write(initpacket.packet, 0, initpacket.packet.Length); waitforack(((SerialportChannel)_port).DirectPort); waitfor(((SerialportChannel)_port).DirectPort, 'C'); using (MemoryStream ms2 = new MemoryStream(bytes2)) { using (BinaryReader br2 = new BinaryReader(ms2)) { while (ms2.Position != ms2.Length) { if (this.CancellationPending) { e.Cancel = true; return; } int pers = (int)((float)100 / (float)ms2.Length * ms2.Position); this.ReportProgress(pers, "Загрузка программы в контроллер..."); packetnum++; YModemPacket sendPacket = new YModemPacket(); sendPacket.packetnum = packetnum; sendPacket.longpacket = true; sendPacket.isinit = false; sendPacket.data = br2.ReadBytes(1024); sendPacket.createPacket(); ((SerialportChannel)_port).DirectPort.Write(sendPacket.packet, 0, sendPacket.packet.Length); waitforack(((SerialportChannel)_port).DirectPort); } } } this.ReportProgress(100, "Загрузка программы в контроллер..."); sendEndOftransmision(((SerialportChannel)_port).DirectPort); waitforack(((SerialportChannel)_port).DirectPort); this.ReportProgress(100, "Перезапуск контроллера..."); Thread.Sleep(2000); ((SerialportChannel)_port).DiscardInBuffer(); _port.Close(); } if (this.CancellationPending) { e.Cancel = true; return; } if (_mode == LoaderMode.UploadConfiguration || _mode == LoaderMode.UploadProgramAndConfiguration) { _port.Open(); int beginAdress = 0x7B00; //End of arhive region int writeBlockSize = 128; int size = _confBuffer.Length; int writeCount = _confBuffer.Length / writeBlockSize; for (int i = 0; i < writeCount; i++) { if (this.CancellationPending) { e.Cancel = true; return; } int pers = (int)((float)100 / (float)writeCount * i); this.ReportProgress(pers, "Загрузка конфигурации в контроллер..."); byte[] buf = new byte[128]; Buffer.BlockCopy(_confBuffer, writeBlockSize * i, buf, 0, buf.Length); _port.WriteToMemory(MemoryType.FRAM, beginAdress, buf); beginAdress += writeBlockSize; } this.ReportProgress(0, "Перезагрузка контроллера..."); Thread.Sleep(2000); _port.ResetController(); this.ReportProgress(100, "Перезагрузка контроллера..."); } }
private void Upload(AbstractChannel port) { Exception error = null; port = (SerialportChannel)port; try { int oldBaudRate = ((SerialportChannel)port).BaudRate; ProtocolType oldProtocol = port.RelkonProtocolType; long programSize = 0; port.Open(); byte[] req; req = port.SendRequest(new byte[] { 0x00, 0xA2 }, 16); if (req != null) { string s = Encoding.ASCII.GetString(req); if (s.Substring(9, 4) != "PROG") { throw new Exception("Данный порт не предназначен для программирования!"); } } req = port.SendRequest(this.deviceSearcher.Request, this.deviceSearcher.Pattern.Length); if (req != null) { string s = Encoding.ASCII.GetString(req); bootLoaderMode = s.ToLower().Contains(this.deviceSearcher.Pattern.ToLower()) ? false : true; } if (uploadOnlyProgram) { if (!bootLoaderMode) { if (this.canceled) { throw new StopUploadinException(); } port.Open(); this.ChangeProgressMethod("Сброс контроллера...", 0); //Перетераем первый символ слова для загрузчика port.WriteByteToMemory(MemoryType.FRAM, 0x7FF5, 0x00); port.ResetController(); port.Close(); this.ChangeProgressMethod("Сброс контроллера...", 100); if (this.canceled) { throw new StopUploadinException(); } Thread.Sleep(1000); } ((SerialportChannel)port).BaudRate = 115200; port.RelkonProtocolType = ProtocolType.RC51BIN; port.Open(); ((SerialportChannel)port).DirectPort.Write("1"); waitfor(((SerialportChannel)port).DirectPort, 'C'); Stream fs = new FileStream(solution.DirectoryName + "\\" + solution.Name + ".bin", FileMode.Open); BinaryReader br = new BinaryReader(fs); MemoryStream ms = new MemoryStream(); BinaryWriter bw = new BinaryWriter(ms); byte[] bytes = new byte[br.BaseStream.Length]; while (br.BaseStream.Position != br.BaseStream.Length) { bw.Write(br.ReadBytes(1024)); bw.Flush(); } fs.Close(); br.Close(); bytes = ms.ToArray(); programSize = bytes.Length; ms.Close(); bw.Flush(); bw.Close(); //waitforack(port.DirectPort); //waitfor(port.DirectPort, 'C'); ushort packetnum = 0; YModemPacket initpacket = new YModemPacket(); initpacket.isinit = true; initpacket.packetnum = packetnum; initpacket.filename = solution.Name + ".bin"; initpacket.filelength = bytes.Length; if ((solution.Name + ".bin").Length > 125) { initpacket.longpacket = true; } else { initpacket.longpacket = false; } initpacket.createPacket(); ((SerialportChannel)port).DiscardInBuffer(); SendPacket(((SerialportChannel)port).DirectPort, initpacket); waitfor(((SerialportChannel)port).DirectPort, 'C'); //port.DiscardInBuffer(); MemoryStream ms2 = new MemoryStream(bytes); byte[] temparr = new byte[1024]; YModemPacket sendPacket; long numpack = Math.Abs(((long)ms2.Length) / ((long)1024)); BinaryReader br2 = new BinaryReader(ms2); this.ChangeProgressMethod("Загрузка программы в контроллер...", 0); while (ms2.Position != ms2.Length) { if (this.canceled) { throw new StopUploadinException(); } int pers = (int)((float)100 / (float)ms2.Length * ms2.Position); this.ChangeProgressMethod("Загрузка программы в контроллер...", pers); Application.DoEvents(); //_waitforack = false; packetnum++; temparr = br2.ReadBytes(1024); sendPacket = new YModemPacket(); sendPacket.packetnum = packetnum; sendPacket.longpacket = true; sendPacket.isinit = false; sendPacket.data = temparr; sendPacket.createPacket(); SendPacket(((SerialportChannel)port).DirectPort, sendPacket); } ((SerialportChannel)port).DirectPort.Write(new byte[] { (byte)0x04 }, 0, 1); YModemPacket endpacket = new YModemPacket(); endpacket.isend = true; endpacket.longpacket = false; endpacket.packetnum = 0; endpacket.data = new byte[128]; endpacket.createPacket(); SendPacket(((SerialportChannel)port).DirectPort, endpacket); Thread.Sleep(2000); ((SerialportChannel)port).DiscardInBuffer(); } if (!bootLoaderMode) { ((SerialportChannel)port).BaudRate = oldBaudRate; port.RelkonProtocolType = oldProtocol; } else { this.ChangeProgressMethod("Поиск параметров контроллера...", 0); string pattern = "relkon 6.0"; byte[] request = new byte[] { 0x00, 0xA0 }; bool searchingStopped = false; int[] baudRates = new int[] { 115200, 19200, 57600, 38400, 9600, 4800 }; ProtocolType[] protocols = new ProtocolType[] { ProtocolType.RC51BIN, ProtocolType.RC51ASCII }; int totalProgress = baudRates.Length * protocols.Length; for (int i = 0; i < protocols.Length && !searchingStopped; i++) { port.RelkonProtocolType = protocols[i]; for (int j = 0; j < baudRates.Length && !searchingStopped; j++) { ((SerialportChannel)port).BaudRate = baudRates[j]; try { if (this.canceled) { throw new StopUploadinException(); } port.Open(); byte[] res = port.SendRequest(request, pattern.Length); ((SerialportChannel)port).DiscardInBuffer(); if (res != null && Encoding.ASCII.GetString(res).ToLower().Contains(pattern)) { searchingStopped = true; break; } } catch { } finally { port.Close(); } this.ChangeProgressMethod("Поиск параметров контроллера...", (int)((100 / totalProgress) * (i * j + j))); } } } if (uploadOnlyParams) { port.Open(); this.ChangeProgressMethod("Загрузка настроек...", 1); if (uploadOnlyParams) { byte[] b = port.ReadFRAM(0x7F06, 4); programSize = (long)BitConverter.ToUInt32(b, 0); } byte[] ParamsBuffer = this.CreateParamsBuffer((uint)programSize); this.ChangeProgressMethod("Загрузка настроек...", 50); port.WriteToMemory(MemoryType.FRAM, 0x7F00, ParamsBuffer); this.ChangeProgressMethod("Загрузка настроек...", 100); this.ChangeProgressMethod("Загрузка заводских уставок...", 0); int adr = 0x7B00; for (int i = 0; i < 8; i++) { byte[] buf = new byte[128]; for (int j = 0; j < 128; j++) { if (this.canceled) { throw new StopUploadinException(); } buf[j] = (byte)this.solution.Vars.GetEmbeddedVar("EE" + (i * 128 + j).ToString()).Value; } port.WriteToMemory(MemoryType.FRAM, adr, buf); adr += 128; this.ChangeProgressMethod("Загрузка заводских уставок...", (int)(i * ((double)100 / (double)8))); } //this.ChangeProgressMethod("Загрузка настроек...", 75); //port.WriteToMemory(MemoryType.FRAM, 0x7B00, EmbeddedVarsBuffer); this.ChangeProgressMethod("Загрузка настроек...", 100); this.ChangeProgressMethod("Сброс контроллера...", -1); } if (_readEmbVars && !bootLoaderMode) { this.ChangeProgressMethod("Чтение заводских уставок...", 0); int adr = 0x7B00; for (int i = 0; i < 8; i++) { byte[] buf = port.ReadFromMemory(MemoryType.FRAM, adr, 128); for (int j = 0; j < 128; j++) { this.solution.Vars.GetEmbeddedVar("EE" + (i * 128 + j).ToString()).Value = buf[j]; } adr += 128; this.ChangeProgressMethod("Чтение заводских уставок...", (int)(i * ((double)100 / (double)8))); } } try { port.ResetController(); } catch { Utils.WarningMessage("Системе не удалось перезагрузить контроллер. Чтобы настройки вступили в силу, пересбросьте питание вручную."); } } catch (Exception ex) { if (!(ex is StopUploadinException)) { error = ex; } //throw ex; } finally { port.Close(); } lock (this.userStateToLifeTime) { this.CompletionMethod(error, this.canceled); this.userStateToLifeTime.Clear(); } }