예제 #1
0
        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));
        }
예제 #2
0
        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;
        }