public async Task <byte[]> TakeData(int nbytes, int timeOut, CancellationToken ct) { byte[] bDataTemp = new byte[256]; int nByteTake = await AsyncHelp.WithTimeout(_terminalNetStream.ReadAsync(bDataTemp, 0, nbytes, ct), timeOut, ct); if (nByteTake == nbytes) { var bData = new byte[nByteTake]; Array.Copy(bDataTemp, bData, nByteTake); return(bData); } return(null); }
/// <summary> /// Функция посылает запрос в порт, и как только в буфер порта приходят данные сразу же проверяет их кол-во. /// Как только накопится нужное кол-во байт сразу же будет возвращен ответ не дожедаясь времени readTimeout. /// Таким образом период опроса не фиксированный, а определяется скоростью ответа slave устройства. /// </summary> public async Task <byte[]> RequestAndRespawnInstantlyAsync(byte[] writeBuffer, int nBytesRead, int readTimeout, CancellationToken ct) { if (!_port.IsOpen) { return(await Task <byte[]> .Factory.StartNew(() => null, ct)); } //очистили буферы порта _port.DiscardInBuffer(); _port.DiscardOutBuffer(); //отправили данные в порт _port.WriteTimeout = 500; _port.Write(writeBuffer, 0, writeBuffer.Length); await Task.Delay(300); //Выравнивающая задержка переодичности отправки запросов в порт //ждем ответа.... TaskCompletionSource <byte[]> tcs = new TaskCompletionSource <byte[]>(); var handler = new SerialDataReceivedEventHandler((o, e) => { if (_port.BytesToRead >= nBytesRead) { var buffer = new byte[nBytesRead]; _port.Read(buffer, 0, nBytesRead); tcs.SetResult(buffer); } }); _port.DataReceived += handler; try { var buff = await AsyncHelp.WithTimeout(tcs.Task, readTimeout, ct); return(buff); } catch (TimeoutException ex) { tcs.TrySetCanceled(); throw; } finally { _port.DataReceived -= handler; } }
/// <summary> /// Получение данных с указанием таймаута. /// Пока nbytes не полученно за время таймаута данные принимаются /// </summary> public async Task <byte[]> TakeDataAccurate(int nbytes, int timeOut, CancellationToken ct) { byte[] bDataTemp = new byte[1024]; var taskNByteTake = Task.Run(async() => { int nByteTake = 0; while (nByteTake != nbytes) { nByteTake += await _terminalNetStream.ReadAsync(bDataTemp, nByteTake, nbytes, ct); } return(nByteTake); }, ct); int resultNByteTake = await AsyncHelp.WithTimeout(taskNByteTake, timeOut, ct); if (resultNByteTake == nbytes) { var bData = new byte[resultNByteTake]; Array.Copy(bDataTemp, bData, resultNByteTake); return(bData); } return(null); }