/// <summary> /// Запись данных в указанный Slave /// </summary> /// <param name="SlaveAddr"></param> /// <param name="StartAddr"></param> /// <param name="DataSent"></param> /// <param name="Data"></param> public void SetData(byte SlaveAddr, ushort StartAddr, Action <bool> DataSent, params ushort[] Data) { if (serialPort == null) { return; } if (!serialPort.IsOpen) { return; } RequestUnit reqUnit = new RequestUnit(SlaveAddr, StartAddr, DataSent, Data); lock (locker) { if (portBusy) { Requests.Enqueue(reqUnit); } else { SendRequest(reqUnit); } } }
/// <summary> /// Чтение данных от заданного Slave /// </summary> /// <param name="SlaveAddr"></param> /// <param name="StartAddr"></param> /// <param name="Count"></param> /// <param name="DataReceived">Делегат вызывается после получения данных от Slave</param> public void GetData(byte SlaveAddr, ushort StartAddr, int Count, Action <bool, ushort[]> DataReceived) { if (serialPort == null) { return; } if (!serialPort.IsOpen) { return; } RequestUnit reqUnit = new RequestUnit(SlaveAddr, StartAddr, Count, DataReceived); lock (locker) { if (portBusy) { Requests.Enqueue(reqUnit); } else { SendRequest(reqUnit); } } }
private void SendRequest(RequestUnit RequestUnit) { portBusy = true; if (RequestUnit.RequestType == RequestType.GetData) { serialPort.GetData(RequestUnit.SlaveAddr, RequestUnit.StartAddr, RequestUnit.Count, DataReceived); currentRequest = RequestUnit; } else if (RequestUnit.RequestType == RequestType.SetData) { serialPort.SetData(RequestUnit.SlaveAddr, RequestUnit.StartAddr, DataSent, RequestUnit.DataToSent); currentRequest = RequestUnit; } else if (RequestUnit.RequestType == RequestType.NotStandartFunc) { (serialPort as INotStandartFunc).Request(RequestUnit.TxBuffer, RequestUnit.ExpectByteCount, DataReceivedByte); currentRequest = RequestUnit; } }
/// <summary> /// Отправка нестандартного запроса в Slave /// </summary> /// <param name="SlaveAddr"></param> /// <param name="Buffer">Отправляемые данные</param> /// <param name="ExceptByteCount">ожидаемое количество байтов в ответе</param> /// <param name="DataReceived">делегат, вызываемый после получения ответа от Slave</param> public void Request(byte SlaveAddr, byte[] Buffer, byte ExpectedByteCount, Action <bool, byte[]> DataReceived) { if (serialPort == null) { return; } if (!serialPort.IsOpen) { return; } if (!(serialPort is INotStandartFunc)) { throw new Exception("Invalid request for current instance of ISerialPort"); } int l = 0; if (Buffer != null) { l = Buffer.Length; } byte[] buff = new byte[l + 1]; buff[0] = SlaveAddr; Buffer.CopyTo(buff, 1); RequestUnit reqUnit = new RequestUnit(buff, ExpectedByteCount, DataReceived); lock (locker) { if (portBusy) { Requests.Enqueue(reqUnit); } else { SendRequest(reqUnit); } } }