コード例 #1
0
ファイル: SerialPortUpdater.cs プロジェクト: DIVON/MCUHelper
        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;
        }