public override void Execute(DataRecorder recorder) { //log.Info("Измеряем температуру"); ArduinoCommand cmd = new ArduinoCommand(); cmd.Command = 'R'; ArduinoCommand resp; try { transport.SendReceive(cmd, out resp); float temp = 0, hum = 0; float.TryParse(resp.Parameters[0], NumberStyles.Float, CultureInfo.InvariantCulture, out temp); float.TryParse(resp.Parameters[1], NumberStyles.Float, CultureInfo.InvariantCulture, out hum); recorder.Record(Name, new [] { temp, hum }); //log.Info("Результат: " + resp.ToString()); } catch (TimeoutException ex) { log.Error("Время ожидания ответа от сенсора истекло"); } catch (Exception ex) { log.Error("Неизвестная ошибка при обмене данными с сенсором"); log.Error(ex.ToString()); } }
public void SendReceive(ArduinoCommand cmd, out ArduinoCommand resp) { const long timeout = 2000; byte[] packet = cmd.Build(); port.ReadExisting(); log.Info("Отправляем команду: {0}", Encoding.ASCII.GetString(packet)); port.Write(packet, 0, packet.Length); if (!ReadPort(packet, 3, timeout)) { log.Error("Не удалось прочитать заголовок команды"); port.Flush(); throw new IOException(); } if (packet[0] != ':') { log.Error("Заголовок команды содержит неверный стартовый символ"); port.Flush(); throw new IOException(); } string strLen = Encoding.ASCII.GetString(packet, 1, 2); int len = int.Parse(strLen, NumberStyles.AllowHexSpecifier); string strResp = ""; if (len > 0) { packet = new byte[len]; if (!ReadPort(packet, len, timeout)) { log.Error("Не удалось прочитать команду: неправильная длина"); port.Flush(); throw new IOException(); } strResp = Encoding.ASCII.GetString(packet, 1, packet.Length - 2); } resp = new ArduinoCommand { Command = Encoding.ASCII.GetString(packet, 0, 1)[0], Parameters = new List <string>(strResp.Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries)) }; log.Info("Получена команда {0} {1}", resp.Command, strResp); }