Ejemplo n.º 1
0
 private void DoWaitForExecute()
 {
     do
     {
         System.Threading.Thread.Sleep(500);
         _port.WriteByte(ENQ);
     }while(_port.ReadByte() == ACK);
 }
Ejemplo n.º 2
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.º 3
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.º 4
0
        private short ReadResponse(EasyCommunicationPort Port, byte[] nRsp)
        {
            short nErrorCode = 0;
            bool  bSuccess   = false;

            byte[] nRequest     = new byte[MAX_CMD_LEN];
            int    nRetries     = 0;
            short  dwPrefixSize = 3 + 3;
            //                 |CMD| RC|
            byte nResponse   = 0;
            int  nRequestLen = 0;

            short dwDataSize = (short)nRsp.Length;

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

                    Port.ReadTimeout = 600;
                    do
                    {
                        nResponse = (byte)Port.ReadByte();
                    }while (nResponse == SYN);

                    nRequestLen = 0;
                    // чтение полей CMD и RC - 6 байт
                    nRequestLen += Port.Read(nRequest, nRequestLen, 6);
                    nErrorCode   = Convert.ToInt16(Encoding.ASCII.GetString(nRequest, 3, 3));

                    // если ошибок не было, читаем данные ответа
                    if (nErrorCode == 0)
                    {
                        nRequestLen += Port.Read(nRequest, nRequestLen, nRsp.Length);
                    }

                    // читаем ETX и BCC
                    nRequestLen += Port.Read(nRequest, nRequestLen, 2);
                    bSuccess     = CalcBCC(nRequest, 0, nRequestLen - 1) == nRequest[nRequestLen - 1];

                    // если контрольная сумма не сошлась, нужно запросить повтора отправки данных
                    if (!bSuccess)
                    {
                        Port.WriteByte(NACK);
                    }
                    // если все успешно, скопировать данные в nRsp
                    else
                    {
                        Array.Copy(nRequest, dwPrefixSize, nRsp, 0, nRequestLen - dwPrefixSize - 2);
                    }
                }while (!bSuccess);
            }
            catch (TimeoutException)
            {
                nErrorCode = (short)GeneralError.Timeout;
            }

            if (nErrorCode == 0)
            {
                nErrorCode = (short)GeneralError.Success;
            }

            return(nErrorCode);
        }
Ejemplo n.º 5
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();
        }