private bool TrySend(Request request, out Response response) { // ждем, пока устройство не будет готово принять команду WaitForDevice(); // отправляем запрос var requestBytes = request .ToArray(); port.Write(requestBytes, 0, requestBytes.Length); // читаем подтверждение отправки сообщения port.ReadTimeout = Constants.ConfirmationTimeout; var confirmationByte = port.ReadByte(); switch (confirmationByte) { case Constants.ACK: // сообщение принято, читаем ответ response = ReadResponse(); return true; case Constants.NAK: // сообщение не принято из-за ошибки канала связи response = null; return false; } // неизвестный ответ от устройства throw new InvalidOperationException(string.Format(Resources.Client_InvalidResponse, confirmationByte)); }
public Response Send(Request request) { if (!port.IsOpen) { port.Open(); } Response response; var tryNumber = 0; while (!TrySend(request, out response)) { tryNumber++; if (tryNumber > Constants.MaxTryNumber) { throw new InvalidOperationException(Resources.Client_DeviceNotReady); } } return response; }