访问结构数组中的字段

时间:2014-09-23 12:06:26

标签: c# arrays struct field

我希望有人可以帮我解决这个问题。

我正在制定一个协议,通过以太网上的UDP与某些节点进行通信。

我正在尝试使用此代码实现的目标,我希望通过其SOURCE_ID及其注册表从SENSOR_DATA结构中的节点添加数据。

我在“MicroRov_Protocol_Structs.cs”

中制作了一些结构
public enum ADRESSES : byte
{
    ENERGY_MONITOR_MASTER       = 0x01,
    ENERGY_MONITOR_PC           = 0X02
}
public enum MICRO_ROV_ADDRESS : byte
{
    BOARD_ADDRESS               = 0x01,
    BOARD_SERIAL_NUMBER         = 0x02,
    BOARD_FW_VER                = 0x03,
    BOARD_STATUS                = 0x04,
    VOLTAGE_VPP                 = 0x05,
    CURRENT_VPP                 = 0x06,
    VOLTAGE_RMS                 = 0x07,
    CURRENT_RMS                 = 0x08,
    VOLTAGE_AMPLITUDE           = 0x09,
    CURRENT_AMPLITUDE           = 0x0A,
    FREQUENCY                   = 0x0B,
    BOARD_VOLTAGE               = 0x0C,
    BOARD_CURRENT               = 0x0D,
    BOARD_TEMPERATURE           = 0x0E,

    CURRENT_MEASURENEBT_ARRAY   = 0x0F,
    VOLTAGE_MEASURENEBT_ARRAY   = 0x10,
    SET_BACKLIGTH               = 0x11,
    GET_ADC                     = 0x12,
    // 0x12 - 0x18 availible
    HARDWARE_INFORMATION        = 0x19,
    FIRMWARE_INFORMATION        = 0x1A,
    // added rev.1.01
    HUMIDITY_MONITOR            = 0x1B,
    // Multicast Address
    MULTICAST_ADDRESS           = 0xFF


}    

public struct MICRO_ROV_MESSAGE_HEADER
{
    // ip and port details
    public COMMUNICATION_DETAILS SOCKET_DETAILS;
    //
    public ADRESSES SOURCE_ID;
    public ADRESSES DESTINATION_ID;
    //
    public MICRO_ROV_ADDRESS REGISTER_ADDRESS;
    public byte[] DATA;
    public byte DATA_LENGTH;
    //
    public Int16 Data8bit_MSB;
    public Int16 Data8bit_LSB;
    public Int32 Data16bit;
    //
    public double DataCalculated;
    //
    public byte CHECKSUM;
    //
    public DateTime LAST_RX;
    public DateTime LAST_TX;        

}   
public struct SENSOR_DATA
{
    // added: 18.09.14
    public MICRO_ROV_REGISTRY_DATA[] SENSORS_DATA;
}
public struct MICRO_ROV_REGISTRY_DATA
{
    public MICRO_ROV_MESSAGE_HEADER BOARD_ADDRESS;
    public MICRO_ROV_MESSAGE_HEADER BOARD_SERIAL_NUMBER;
    public MICRO_ROV_MESSAGE_HEADER BOARD_FW_VER;
    public MICRO_ROV_MESSAGE_HEADER BOARD_STATUS;
    public MICRO_ROV_MESSAGE_HEADER VOLTAGE_VPP;
    public MICRO_ROV_MESSAGE_HEADER CURRENT_VPP;
    public MICRO_ROV_MESSAGE_HEADER VOLTAGE_RMS;
    public MICRO_ROV_MESSAGE_HEADER CURRENT_RMS;
    public MICRO_ROV_MESSAGE_HEADER VOLTAGE_AMPLITUDE;
    public MICRO_ROV_MESSAGE_HEADER CURRENT_AMPLITUDE;
    public MICRO_ROV_MESSAGE_HEADER FREQUENCY;
    public MICRO_ROV_MESSAGE_HEADER BOARD_VOLTAGE;
    public MICRO_ROV_MESSAGE_HEADER BOARD_CURRENT;
    public MICRO_ROV_MESSAGE_HEADER BOARD_TEMPERATURE;

    public MICRO_ROV_MESSAGE_HEADER SET_BACKLIGTH;
    public MICRO_ROV_MESSAGE_HEADER GET_ADC;
    // 0x12 - 0x18 availible
    public MICRO_ROV_MESSAGE_HEADER HARDWARE_INFORMATION;
    public MICRO_ROV_MESSAGE_HEADER FIRMWARE_INFORMATION;
    // added rev.1.01
    public MICRO_ROV_MESSAGE_HEADER HUMIDITY_MONITOR;
    // Multicast Address
    public MICRO_ROV_MESSAGE_HEADER MULTICAST_ADDRESS;

    public Int32[] CURRENT_MEASURENEBT_ARRAY;
    public Int32[] VOLTAGE_MEASURENEBT_ARRAY;

    public MICRO_ROV_MESSAGE_HEADER[] ALL_DATA;
    //public object[] CALCULATION_ARRAY;

    public Dictionary<object, Func <int, double>> FunctionArray;

}

在我的“MicroROV_Protocol.cs”中

// structs        
    public MICRO_ROV_ADDRESS microRov_address = new MICRO_ROV_ADDRESS();
    public MICRO_ROV_REGISTRY_DATA microRov_data = new MICRO_ROV_REGISTRY_DATA();        
    public MICRO_ROV_MESSAGE_HEADER microRov_msg_header = new MICRO_ROV_MESSAGE_HEADER();
    public MICRO_ROV_STATUS_DATAINDEX microRov_dataindex = new MICRO_ROV_STATUS_DATAINDEX();
    public SENSOR_DATA sensorData = new SENSOR_DATA();
    //
    microRov_data.ALL_DATA = new MICRO_ROV_MESSAGE_HEADER[255];
    //
    microRov_data.FunctionArray = new Dictionary<object, Func<int, double>>(); 
    microRov_data.FunctionArray[(byte)MICRO_ROV_ADDRESS.BOARD_ADDRESS] =   controller_information.GetVersionNumber;
    microRov_data.FunctionArray[(byte)MICRO_ROV_ADDRESS.BOARD_SERIAL_NUMBER] = controller_information.GetSerialNumber;
    microRov_data.FunctionArray[(byte)MICRO_ROV_ADDRESS.BOARD_TEMPERATURE] = ntc_calc.findNTCTemp;
    microRov_data.FunctionArray[(byte)MICRO_ROV_ADDRESS.BOARD_VOLTAGE] = volt_calc.findVoltage;
    //
    sensorData.SENSORS_DATA = new MICRO_ROV_REGISTRY_DATA[255];

对于我的方法中的问题:

private void ProcessAllData(IPAddress ipAddress, int ListenPort, byte[] buffer)
    {
        try
        {
            // check if message length is ok.
            if (buffer.Length == (byte)MICRO_ROV_STATUS_DATAINDEX.Packet_Length)
            {
                // calculate checksum of buffer
                Int16 checksumBuffer = additiveChecksum.ComputeChecksumBytes(buffer, (byte)(buffer.Length - 1));

                // update crc fields in buffer
                microRov_msg_header.CHECKSUM = buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.Checksum];

                // updata field containig info regarding crc validity
                if (microRov_msg_header.CHECKSUM == checksumBuffer)
                {
                    microRov_msg_header.LAST_RX = DateTime.Now;

                    microRov_msg_header.DESTINATION_ID = (ADRESSES)buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.Destination];
                    microRov_msg_header.SOURCE_ID = (ADRESSES)buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.Source];
                    microRov_msg_header.DATA_LENGTH = buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.DataLength];
                    microRov_msg_header.REGISTER_ADDRESS = (MICRO_ROV_ADDRESS)buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.Register];

                    //
                    microRov_msg_header.Data8bit_MSB = buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.Data_MSB];
                    microRov_msg_header.Data8bit_LSB = buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.Data_LSB];
                    //
                    microRov_msg_header.Data16bit = (byte)microRov_msg_header.Data8bit_MSB << 8 | (byte)microRov_msg_header.Data8bit_LSB;

                    // add data to its location in the array
                    microRov_data.ALL_DATA[(byte)microRov_msg_header.REGISTER_ADDRESS] = (MICRO_ROV_MESSAGE_HEADER)microRov_msg_header;
                    // calculate
                    microRov_data.ALL_DATA[(byte)microRov_msg_header.REGISTER_ADDRESS].DataCalculated = microRov_data.FunctionArray[(byte)microRov_msg_header.REGISTER_ADDRESS](microRov_msg_header.Data16bit);

                    MICRO_ROV_ADDRESS test = microRov_msg_header.REGISTER_ADDRESS;

                    //Type type = typeof(SENSOR_DATA);
                    //FieldInfo[] fields = type.GetFields();
                    //
                    //FieldInfo info = sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID].GetType().GetField("BOARD_TEMPERATURE");
                    //FieldInfo info = sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID].GetField("MaxValue");
                    //Console.WriteLine(info.ToString());

                    //info.SetValue(sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID], microRov_data.ALL_DATA[(byte)microRov_msg_header.REGISTER_ADDRESS]);

这非常有效:

     // save data by sensor number:
                    sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID].BOARD_TEMPERATURE  = microRov_data.ALL_DATA[(byte)microRov_msg_header.REGISTER_ADDRESS];

但这就是我想要代码的方式:

    // save data by sensor number:
                    sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID].microRov_msg_header.REGISTER_ADDRESS  = microRov_data.ALL_DATA[(byte)microRov_msg_header.REGISTER_ADDRESS];


 dataFromMicroRovProtocolCallback(ipAddress, ListenPort, buffer, microRov_data, StateMachines_Structs.ProtocolDataState.Data, microRov_msg_header.REGISTER_ADDRESS);

     }


    }
  }
  catch
  {
  }
}

我希望有人可以帮我提供一些有关此事的信息。我喜欢这样的代码而不是制作一个巨大的开关盒结构。我曾尝试在网上搜索一些代码示例,但没有。 我试图尽可能详细地解释这个问题。

1 个答案:

答案 0 :(得分:0)

SENSORS_DATAMICRO_ROV_REGISTRY_DATA类型的数组。 microRov_msg_headerMICRO_ROV_REGISTRY_DATA类型的对象,不是MICRO_ROV_REGISTRY_DATA的成员。

将对象添加到数组时,会在数组内部创建对象引用,而不是对象本身。