/// <summary> /// Отправка запроса прибору /// </summary> /// <param name="request"></param> /// <param name="responseLength"></param> /// <param name="readHandler"></param> private void SendRequest(byte[] request, int responseLength, VktDataReadEventHandler readHandler) { CommandSettings cmd = new CommandSettings("", 1000, responseLength, 10); this.handlers.AddLast(readHandler); this.responseLength = responseLength; this.remoteConsole.SendCommandAsync(request, cmd, 0, DataReadCallback, null); }
private void remoteConsole_DeviceDataReceived(object sender, DeviceDataEventArgs args) { // Проверим, что консоль подключена к прибору if (!this.remoteConsole.IsConnected) { return; } // Получаем обработчик запроса VktDataReadEventHandler currentHandler = this.handlers.First.Value; this.handlers.RemoveFirst(); // Проверим длину считанного пакета if (args.Response.Length < 5) { // Повторяем запрос LogError("Неверная длина ответа прибора. Ожидалось не менее 5 байт, получено " + args.Response.Length); CallRequestError(); // Отключаемся try { this.remoteConsole.DisconnectAsync(null, null); } catch (Lers.PermissionDeniedException exc) { LogError("Ошибка отключения удалённого пульта. " + exc.Message); } return; } // Проверим контрольную сумму ushort calcCs = ModBusCrc.Calc(args.Response, 0, args.Response.Length - 2); ushort recvCrc = BitConverter.ToUInt16(args.Response, args.Response.Length - 2); if (calcCs != recvCrc) { LogWarning("Не сходится контрольная сумма ответа"); // Повторяем запрос SendRequest(args.Request, this.responseLength, currentHandler); return; } // Проверим сетевой адрес if (args.Response[0] != (byte)this.NetworkAddress) { LogWarning("В ответе указан неверный контрольный адрес"); // Повторяем запрос SendRequest(args.Request, this.responseLength, currentHandler); return; } // Возвращаем считанные прибором данные if (currentHandler != null) { byte[] rspData = new byte[args.Response.Length - 5]; Array.Copy(args.Response, 3, rspData, 0, rspData.Length); currentHandler(rspData); } }
/// <summary> /// Отправляет в устройство команду нажатия клавишы /// </summary> /// <param name="key"></param> /// <param name="readHandler"></param> public void SendKeyCode(Vkt5Key key, VktDataReadEventHandler readHandler) { byte[] rq = PackRequest(new byte[] { 0x10, 0x0D, 0x00, 0x00, 0x01, 0x01, (byte)key }); SendRequest(rq, 8, readHandler); }
/// <summary> /// Отправляет команду на чтение буфера экрана устройства /// </summary> /// <param name="readHandler"></param> public void ReadScreenBuffer(VktDataReadEventHandler readHandler) { byte[] rq = PackRequest(new byte[] { 0x03, 0x0C, 0x00, 0x00, 0x00 }); SendRequest(rq, 38, readHandler); }