Exemplo n.º 1
0
        /// <summary>
        /// Получение ответа на команду.
        /// </summary>
        /// <param name="spDevice">Порт устройства</param>
        /// <returns></returns>
        public void GetCommandRequest()
        {
            try
            {
                int retriesCount = 0;
                do
                {
                    // читаем ответ
                    if (ReadResponse())
                    {
                        // проверка контрольной суммы
                        if (_currEnconing.GetString(CalcBCC(_rspBuffer, _rspLen - 4)) == _currEnconing.GetString(_rspBuffer, _rspLen - 4, 4))
                        {
                            // ответ получен, выходим
                            short nErrorCode = (short)Array.IndexOf(HEX_BYTES, _currEnconing.GetString(_rspBuffer, 13, 2));

                            // ошибки печатающего устройства (документ может быть закрыт)
                            if (nErrorCode >= 22 && nErrorCode <= 25)
                            {
                                throw new PrintableErrorException();
                            }
                            // прочие протокольные ошибки (документ не закрыт)
                            else if (nErrorCode != 0)
                            {
                                throw new DeviceErrorException(nErrorCode);
                            }
                            return;
                        }
                        WriteDebugLine("GetCommandRequest: ошибка контрольной суммы в ответе");
                    }
                    // если с первого раза ответ получить не удалось
                    // проверяем статус выполнения команды
                    else if (!WaitForCommandExecuting())
                    {
                        WriteDebugLine("GetCommandRequest: не удалось дождаться выполнения команды");
                        throw new TimeoutException();
                    }

                    // отправляем NAK:
                    //  - если ошибка контрольной суммы
                    //  - если дождались выполнения команды
                    WriteDebugLine("GetCommandRequest: отправка NAK");
                    CommPort.DiscardBuffers();
                    Write(new byte[1] {
                        NACK
                    });
                }while (retriesCount++ < MAX_RETRIES_COUNT);
                WriteDebugLine("GetCommandRequest: количество попыток чтения ответа исчерпано");
                throw new TimeoutException();
            }
            catch (TimeoutException)
            {
                WriteDebugLine("GetCommandRequest: Таймаут чтения. Байты команды:", _cmdBuffer, _cmdLen);
                throw;
            }
        }
Exemplo n.º 2
0
 public byte ShortStatusRequest(bool ignoreDSR, byte mode, int retriesCount)
 {
     if (ignoreDSR)
     {
         SetDsrFlow(false);
     }
     try
     {
         do
         {
             try
             {
                 // очистка буферов порта
                 CommPort.DiscardBuffers();
                 // запрос статусного байта
                 Write(new byte[] { 0x10, mode });
                 // чтение ответа
                 return(ReadByte());
             }
             catch (TimeoutException)
             {
                 if (retriesCount > 0)
                 {
                     retriesCount--;
                 }
                 else
                 {
                     throw;
                 }
             }
         }while (true);
     }
     finally
     {
         if (ignoreDSR)
         {
             SetDsrFlow(true);
         }
     }
 }
Exemplo n.º 3
0
 public byte ShortStatusRequest(bool ignoreDSR, byte mode)
 {
     if (ignoreDSR)
     {
         SetDsrFlow(false);
     }
     try
     {
         // очистка буферов порта
         CommPort.DiscardBuffers();
         // запрос статусного байта
         Write(new byte[] { 0x10, mode });
         // чтение ответа
         return(ReadByte());
     }
     finally
     {
         if (ignoreDSR)
         {
             SetDsrFlow(true);
         }
     }
 }