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