/// <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; } }
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); } } }
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); } } }