/// <summary> /// Sends a command to the serial port. The first byte is sent as is, but /// all other successive bytes are expanded to two "Kamstrup bytes". /// </summary> /// <returns> /// The command. /// </returns> /// <param name='data'> /// Data. /// </param> /// <param name='log'> /// Log. /// </param> public byte[] SendCommand(byte[] data) { byte[] payload = ToKamstrupBytes(data.Subset(MAGICBYTE_LENGTH)); byte[] checksum = ToKamstrupPair(Checksum(data.Subset(MAGICBYTE_LENGTH))); return(device.SendCommand(data.Subset(0, MAGICBYTE_LENGTH).Merge(payload, checksum))); }
private Dictionary <string, string> Fetch() { var results = new Dictionary <string, string>(); byte[] reply = connection.SendCommand(Encoding.ASCII.GetBytes(DOWNLOAD_METERDATA)); string stringReply = Encoding.ASCII.GetString(reply); results.Add("MAKE", stringReply.Substring(1, 3)); results.Add("MODEL", stringReply.Substring(5)); if (connection.ReadByte() != STX) { throw new MeterException("STX expected!"); } int checksum = 0; String input; int i = 2; do { input = connection.ReadLine(); string[] parts = input.Split("(".ToCharArray()); if (parts.Length == 2) { results.Add(parts[0], parts[1].Substring(0, parts[1].IndexOf(")"))); } else { results.Add("#" + i, input); } foreach (char value in input) { checksum += value; } checksum += CR; i++; }while(!input.Contains("!")); // TODO: Replace by EndsWith(..)? int etx = connection.ReadByte(); if (etx != ETX) { throw new MeterException("ETX expected!"); } checksum += etx; checksum &= 0x7F; // Remove anything but the 7 LSB's if (connection.ReadByte() != checksum) { throw new MeterException("Invalid checksum!"); } return(results); }