예제 #1
0
        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());
            }
        }
예제 #2
0
        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);
        }