void SendReadCommand() { byte[] data = new byte[MaxVariableCount * 4 + 3]; data[0] = (byte)0xA5; data[1] = (byte)0xB3; ElfVariableList fields = variables.GetAllFields(); if (previousFieldsCount != fields.Count) { previousFieldsCount = 0; prevLastIndex = 0; } if (fields.Count <= MaxVariableCount) { for (int i = 0; i < fields.Count; i++) { int address = Convert.ToInt32(fields[i].Address, 16); data[i * 4 + 2] = (byte)(address & 0xFF); data[i * 4 + 2 + 1] = (byte)((address >> 8) & 0xFF); data[i * 4 + 2 + 2] = (byte)((address >> 16) & 0xFF); data[i * 4 + 2 + 3] = (byte)((address >> 24) & 0xFF); } for (int i = fields.Count; i < MaxVariableCount; i++) { //int address = Convert.ToInt32(fields[i].Address, 16); data[i * 4 + 2] = (byte)(0); data[i * 4 + 2 + 1] = (byte)(0); data[i * 4 + 2 + 2] = (byte)(0); data[i * 4 + 2 + 3] = (byte)(0); } } else { if (prevLastIndex + MaxVariableCount <= fields.Count) { for (int i = prevLastIndex + 1; i <= prevLastIndex + MaxVariableCount; i++) { int address = Convert.ToInt32(fields[i].Address, 16); data[(i % MaxVariableCount) * 4 + 2] = (byte)(address & 0xFF); data[(i % MaxVariableCount) * 4 + 2 + 1] = (byte)((address >> 8) & 0xFF); data[(i % MaxVariableCount) * 4 + 2 + 2] = (byte)((address >> 16) & 0xFF); data[(i % MaxVariableCount) * 4 + 2 + 3] = (byte)((address >> 24) & 0xFF); } prevLastIndex = prevLastIndex + MaxVariableCount; if (prevLastIndex == fields.Count) { prevLastIndex = 0; } } else { int byteIndex = 0; for (int i = prevLastIndex + 1; i < fields.Count; i++) { int address = Convert.ToInt32(fields[i].Address, 16); int startByteIndex = byteIndex * 4 + 2; data[startByteIndex] = (byte)(address & 0xFF); data[startByteIndex + 1] = (byte)((address >> 8) & 0xFF); data[startByteIndex + 2] = (byte)((address >> 16) & 0xFF); data[startByteIndex + 3] = (byte)((address >> 24) & 0xFF); byteIndex++; } int count = MaxVariableCount - (fields.Count - prevLastIndex) + 1; for (int i = 0; i < count; i++) { int address = Convert.ToInt32(fields[i].Address, 16); int startByteIndex = byteIndex * 4 + 2; data[startByteIndex] = (byte)(address & 0xFF); data[startByteIndex + 1] = (byte)((address >> 8) & 0xFF); data[startByteIndex + 2] = (byte)((address >> 16) & 0xFF); data[startByteIndex + 3] = (byte)((address >> 24) & 0xFF); byteIndex++; } prevLastIndex = MaxVariableCount - count; } } data[MaxVariableCount * 4 + 2] = (byte)0x0D; if (serialPort.IsOpen) { try { serialPort.Write(data, 0, MaxVariableCount * 4 + 3); } catch { } } previousFieldsCount = fields.Count; }