Ejemplo n.º 1
0
 /// <summary>
 /// Установка соединения с устройством
 /// </summary>
 public override void Open()
 {
     try
     {
         _port.Open();
         _port.DiscardBuffers();
     }
     catch (Win32Exception e)
     {
         throw new CommunicationException(
                   string.Format("Не удалось открыть порт {0}", _port.PortName), e);
     }
 }
Ejemplo n.º 2
0
        /// <summary>
        /// Выполнение команды
        /// </summary>
        /// <param name="nextRelayStatus">Новое состояние реле</param>
        /// <param name="retryCount">Число попыток повтора</param>
        private ErrorCode ExecuteCommand(byte nextRelayStatus, byte retryCount)
        {
            // формируем команду
            string command = string.Format("@{0:X2}{1:X2}00\r",
                                           _address, nextRelayStatus);

            bool      saveConnected = retryCount == 1;
            ErrorCode storedErrorCode;

            do
            {
                try
                {
                    // сбрасываем буферы порта
                    _port.DiscardBuffers();

                    // записываем команду в порт
                    _port.Write(Encoding.Default.GetBytes(command));

                    // читаем ответ
                    byte[] answer = new byte[4];
                    _port.Read(answer, 0, answer.Length);

                    if (saveConnected)
                    {
                        _connected = true;
                    }

                    if (answer[0] == (byte)'!')
                    {
                        _relayStatus = nextRelayStatus;
                        return(new ServerErrorCode(_parent, GeneralError.Success));
                    }

                    return(new ServerErrorCode(_parent, 1, "Команда не выполнена"));
                }
                catch (TimeoutException e)
                {
                    retryCount--;
                    storedErrorCode = OnException(!saveConnected, e);
                }
                catch (Win32Exception e)
                {
                    retryCount--;
                    storedErrorCode = OnException(!saveConnected, e);
                }
            }while (retryCount > 0);
            return(storedErrorCode);
        }
Ejemplo n.º 3
0
        public short Execute(EasyCommunicationPort Port, byte[] nRsp)
        {
            byte nResponse;
            int  nRetries = 0;

            try
            {
                Port.DiscardBuffers();

                // отправка запроса на передачу данных
                do
                {
                    nRetries++;
                    // если максимальное число попыток исчерпано, считаем, что вышел таймаут
                    if (nRetries > MAX_RETRIES_COUNT)
                    {
                        throw new TimeoutException();
                    }

                    Port.WriteByte(ENQ);
                    nResponse = (byte)Port.ReadByte();
                }while (nResponse != ACK);

                // передача данных и ожидание ответа
                nRetries = 0;
                do
                {
                    nRetries++;
                    // если максимальное число попыток исчерпано, считаем, что вышел таймаут
                    if (nRetries > MAX_RETRIES_COUNT)
                    {
                        throw new TimeoutException();
                    }

                    Port.Write(GetCommandRequest(), 0, m_FullLen);
                    nResponse = (byte)Port.ReadByte();
                }while (nResponse != ACK);
            }
            catch (TimeoutException)
            {
                return((short)GeneralError.Timeout);
            }

            return(ReadResponse(Port, nRsp));
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Отправка AT-команды телефону
        /// </summary>
        /// <param name="command">Текст команды</param>
        /// <param name="terminator">Завершающий символ</param>
        /// <returns>Список строк, полученных в ответ на команду</returns>
        private string[] SendATCommand(string command, byte terminator)
        {
            // пишем команду и завершающий символ в порт
            _port.DiscardBuffers();
            _port.Write(Encoding.ASCII.GetBytes(command));
            _port.WriteByte(terminator);

            // отключаем генерацию исключений по таймауту (особенность AT-протокола)
            _port.ThrowTimeoutExceptions = false;
            try
            {
                // читаем ответ модема
                List <string> answers = new List <string>();
                ReceiveATCommandResponse(answers);
                return(answers.ToArray());
            }
            finally
            {
                // возвращаем флаг генерации исключений
                _port.ThrowTimeoutExceptions = true;
            }
        }
Ejemplo n.º 5
0
        internal void ExecuteCommand(string code, bool waitExecution, params string[] args)
        {
            _cmdBuffer = new byte[1024];
            _cmdLen    = 0;
            _rspBuffer = new byte[1024];
            _rspLen    = 0;

            // стартовый байт
            _cmdBuffer[_cmdLen++] = STX;
            // пароль передачи данных
            AppendString(_password);
            // отличительный байт
            _cmdBuffer[_cmdLen++] = 0x20;
            // код сообщения
            AppendString(code);
            // данные сообщения
            foreach (string value in args)
            {
                // параметр
                AppendString(value);
                // разделительный символ
                _cmdBuffer[_cmdLen++] = FS;
            }

            // стоповый байт
            _cmdBuffer[_cmdLen++] = ETX;
            // контрольная сумма
            AppendString(CalculateBCC(_cmdBuffer, _cmdLen));

            // отправка команды

            // сброс буферов порта
            _port.DiscardBuffers();

            // передача команды
            _port.Write(_cmdBuffer, 0, _cmdLen);


            // дожидаемся завершения выполнения команды
            if (waitExecution)
            {
                DoWaitForExecute();
                _rspBuffer[_rspLen++] = STX;
            }

            // чтение ответа
            _port.Read(_rspBuffer, _rspLen, 6);
            _rspLen += 6;
            while (_rspBuffer[_rspLen - 1] != ETX)
            {
                _rspBuffer[_rspLen++] = (byte)_port.ReadByte();
            }
            _port.Read(_rspBuffer, _rspLen, 2);
            _rspLen += 2;

            // проверка контрольной суммы
            string rspBcc = _encoding.GetString(_rspBuffer, _rspLen - 2, 2);

            if (rspBcc != CalculateBCC(_rspBuffer, _rspLen))
            {
            }

            // проверка кода ошибки
            int errorCode = Convert.ToInt32(_encoding.GetString(_rspBuffer, 4, 2));

            if (errorCode != 0)
            {
                throw new DeviceErrorException()
                      {
                          ErrorCode = (short)errorCode
                      }
            }
            ;
        }
Ejemplo n.º 6
0
        public void ExecuteCommand()
        {
            CompleteCmd();
            byte rspByte = 0;

            // отправка запроса на передачу данных
            int retries = 0;

            do
            {
                _port.DiscardBuffers();
                _port.ReadTimeout = T2;
                try
                {
                    WriteDebugLine("Отправка запроса на передачу данных, попытка " + (retries + 1));
                    _port.WriteByte(ENQ);
                    rspByte = (byte)_port.ReadByte();
                }
                catch (TimeoutException)
                {
                    WriteDebugLine("Таймаут при отправке запроса на передачу данных");
                    if (retries++ >= MAX_RETRIES_COUNT - 1)
                    {
                        WriteDebugLine("Исчерпаны все попытки начать обмен (шаг 1)");
                        throw;
                    }
                }
                // если вдруг ФР хочет передать ответ на предыдущую команду, нужно его выслушать
                if (rspByte == ACK)
                {
                    WriteDebugLine("Получет байт ACK. Чтение ответа на предыдущую команду");
                    SkipResponseBytes();
                }
                WriteDebugLine("Получен байт ответа " + rspByte);
            }while (rspByte != NAK);

            retries = 0;
            do
            {
                _port.DiscardBuffers();
                _port.ReadTimeout = T1;
                try
                {
                    WriteDebugLine("Отправка данных команды, попытка " + (retries + 1));
                    _port.Write(_cmdBuffer, 0, _cmdLen);
                    rspByte = (byte)_port.ReadByte();
                }
                catch (TimeoutException)
                {
                    WriteDebugLine("Таймаут при передаче данных команды");
                    if (retries++ >= MAX_RETRIES_COUNT - 1)
                    {
                        WriteDebugLine("Исчерпаны все попытки передачи данных (шаг 4)");
                        throw;
                    }
                }

                if (rspByte == NAK)
                {
                    WriteDebugLine("Получен байт NAK (шаг 2)");
                }
                else if (rspByte != ACK)
                {
                    WriteDebugLine("Ответ не соответствует протоколу (шаг 3): " + rspByte);
                }
            }while (rspByte != ACK);

            ReadResponse();
        }