/// <summary> /// Возвращает запрос на запись данных в память определенного типа (без CRC) /// </summary> public static byte[] CreateWriteMemoryRequest(MemoryType MemoryType, int controllerAddress, int Address, byte[] Data, Type type) { List <byte> l = new List <byte>(); l.Add((byte)controllerAddress); byte command = 0; int AddressLength = 0; switch (MemoryType) { case MemoryType.RAM: command = (byte)0x60; AddressLength = 1; break; case MemoryType.Clock: command = (byte)0x61; AddressLength = 1; break; case MemoryType.EEPROM: command = (byte)0x62; AddressLength = 2; break; case MemoryType.FRAM: command = (byte)0x63; AddressLength = 2; break; case MemoryType.XRAM: command = (byte)0x64; AddressLength = 2; break; case MemoryType.Flash: command = (byte)0x65; AddressLength = 2; break; default: throw new Exception("Указанный тип памяти " + MemoryType + " не поддерживается в " + type); } l.Add(command); byte[] a = AppliedMath.IntToBytes(Address); l.AddRange(Utils.GetSubArray <byte>(a, a.Length - AddressLength)); l.AddRange(Data); return(l.ToArray()); }
/// <summary> /// Возвращает запрос на запись данных в память определенного типа (без CRC) /// </summary> private byte[] CreateWriteMemoryRequest(MemoryType MemoryType, int Address, byte[] Data) { List <byte> request = new List <byte>(); request.Add((byte)_controllerAddress); byte command = 0; int AddressLength = 0; switch (MemoryType) { case MemoryType.RAM: command = (byte)0xE0; AddressLength = 1; break; case MemoryType.Clock: command = (byte)0xE1; AddressLength = 1; break; case MemoryType.EEPROM: command = (byte)0xE2; AddressLength = 2; break; case MemoryType.FRAM: command = (byte)0xE3; AddressLength = 2; break; case MemoryType.XRAM: command = (byte)0xE4; AddressLength = 2; break; case MemoryType.Flash: command = (byte)0xE5; AddressLength = 4; if (Data.Length % 2 != 0) { // В Relkon4 во Flash можно записывать только четное число байт Array.Resize <byte>(ref Data, Data.Length + 1); Data[Data.Length - 1] = 0xFF; } break; case MemoryType.SDCard: command = (byte)0xE7; AddressLength = 4; break; } // Добавление команды request.Add(command); // Добавление адреса byte[] a = AppliedMath.IntToBytes(Address); request.AddRange(Utils.GetSubArray <byte>(a, a.Length - AddressLength)); // Добавление размера буфера a = AppliedMath.IntToBytes(Data.Length); if (MemoryType == MemoryType.Flash || MemoryType == MemoryType.SDCard) { AddressLength = 2; } request.AddRange(Utils.GetSubArray <byte>(a, a.Length - AddressLength)); // Добавление данных request.AddRange(Data); return(request.ToArray()); }
/// <summary> /// Возвращает запрос на чтение данных с области памяти определенного типа (без CRC) /// </summary> private byte[] CreateReadMemoryRequest(MemoryType MemoryType, int Address, int Count) { List <byte> request = new List <byte>(); request.Add((byte)_controllerAddress); byte command = 0; int AddressLength = 0; switch (MemoryType) { case MemoryType.RAM: command = (byte)0xD0; AddressLength = 1; break; case MemoryType.Clock: command = (byte)0xD1; AddressLength = 1; break; case MemoryType.EEPROM: command = (byte)0xD2; AddressLength = 2; break; case MemoryType.FRAM: command = (byte)0xD3; AddressLength = 2; break; case MemoryType.XRAM: command = (byte)0xD4; AddressLength = 2; break; case MemoryType.Flash: command = (byte)0xD5; AddressLength = 4; if (Count % 2 != 0) { Count++; // в Relkon4 из Flash можно читать только четное число байт } break; case MemoryType.SDCard: command = (byte)0xD7; AddressLength = 4; break; } // Добавление команды request.Add(command); // Добавление адреса byte[] a = AppliedMath.IntToBytes(Address); request.AddRange(Utils.GetSubArray <byte>(a, a.Length - AddressLength)); // Добавление числа байт a = AppliedMath.IntToBytes(Count); if (MemoryType == MemoryType.Flash || MemoryType == MemoryType.SDCard) { AddressLength = 2; } request.AddRange(Utils.GetSubArray <byte>(a, a.Length - AddressLength)); return(request.ToArray()); }