我希望有人可以帮我解决这个问题。
我正在制定一个协议,通过以太网上的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
{
}
}
我希望有人可以帮我提供一些有关此事的信息。我喜欢这样的代码而不是制作一个巨大的开关盒结构。我曾尝试在网上搜索一些代码示例,但没有。 我试图尽可能详细地解释这个问题。
答案 0 :(得分:0)
SENSORS_DATA
是MICRO_ROV_REGISTRY_DATA
类型的数组。 microRov_msg_header
是MICRO_ROV_REGISTRY_DATA
类型的对象,不是MICRO_ROV_REGISTRY_DATA
的成员。
将对象添加到数组时,会在数组内部创建对象引用,而不是对象本身。