Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
0
        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Связь с контроллером прервана!");
        }
Exemplo n.º 3
0
        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, "Перезагрузка контроллера...");
            }
        }
Exemplo n.º 4
0
        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();
            }
        }