Метод утилизации SerialDevice не работает в некоторых случаях, Windows 10 IOT - PullRequest
0 голосов
/ 30 августа 2018

Я разработал простое приложение UWP для связи через последовательный порт. Я использую SerialDevice класс для общения. Прежде чем читать какие-либо данные из последовательного порта, если я располагаю объект SerialDevice, его методы удаления работают нормально как только я начинаю читать данные через последовательный порт, а затем, если я хочу отключиться от этого устройства и располагаю объект SerialDevice, он застревает в методе dispose. Ниже приведены мои функции, которые я использую для чтения, записи и отключения:

public class UARTCommunicationProvider
{
    SerialDevice _serialPort;
    private DataReader _serialPortReader;
    private DataWriter _serialPortWriter;
    private CancellationTokenSource _serialPortReadWriteCTS = null;
    public UARTCommunicationProvider()
    {
        _serialPortReadWriteCTS = new CancellationTokenSource();
    }
    public async Task<bool> ConnectAsync(string comportId)
    {
        _serialPort = await SerialDevice.FromIdAsync(comportId);

        if (_serialPort != null)
        {
            _serialPort.WriteTimeout = TimeSpan.FromMilliseconds(50);
            _serialPort.ReadTimeout = TimeSpan.FromMilliseconds(50);
            _serialPort.BaudRate = 9600;
            _serialPort.Parity = SerialParity.None;
            _serialPort.StopBits = SerialStopBitCount.One;
            _serialPort.DataBits = 8;
            _serialPort.Handshake = SerialHandshake.None;

            _serialPortReader = new DataReader(_serialPort.InputStream);
            // Set InputStreamOptions to complete the asynchronous read operation when one or more bytes is available
            _serialPortReader.InputStreamOptions = InputStreamOptions.Partial;
            _serialPortWriter = new DataWriter(_serialPort.OutputStream);
            return true;
        }
        else
        {
            return false;
        }
    }

    public async void CollectData()
    {
        var command = "FL 1\n";
        while (true)
        {
            var response = await ResponseForCommandAsync(command);
            Debug.WriteLine(response)

        }
    }

    public void Disconnect()
    {
        try
        {
            _serialPort?.Dispose(); //Stuck at this point when I try to dispose after reading few chunks of data from serial port
            _serialPortReadWriteCTS.Cancel();
            _serialPort = null;
        }
        catch (Exception ex)
        {

            throw;
        }
    }

    public async Task<string> ResponseForCommandAsync(string command)
    {
        string response = string.Empty;
        if (_serialPort != null)
        {
            // Load the text from the sendText input text box to the dataWriter object
            _serialPortWriter.WriteString(command);
            UInt32 bytesWritten = await _serialPortWriter.StoreAsync();
            if (bytesWritten > 0)
            {
                bytecount = bytecount + (int)bytesWritten;
                _logger.WriteLine("Data Sent Successfully", AEIoTCommon.Common.LoggingType.Verbose);
                response = await ReadAsync();
            }
        }

        return response;
    }

    private async Task<string> ReadAsync()
    {
        string valueRead = null;
        Task<UInt32> loadAsyncTask;

        uint ReadBufferLength = 1024;

        try
        {
            CancellationToken cancellationToken = _serialPortReadWriteCTS.Token;

            //If task cancellation was requested, comply
            cancellationToken.ThrowIfCancellationRequested();

            using (var childCancellationTokenSource = new CancellationTokenSource(3000))
            {
                // Create a task object to wait for data on the serialPort.InputStream
                loadAsyncTask = _serialPortReader.LoadAsync(ReadBufferLength).AsTask(childCancellationTokenSource.Token);

                // Launch the task and wait
                UInt32 bytesRead = await loadAsyncTask;
                if (bytesRead > 0)
                {
                    //byte[] buffer = new byte[bytesRead];
                    var value = _serialPortReader.ReadString(bytesRead);

                    valueRead = value;
                }
            }
        }
        catch (TaskCanceledException ex)
        {
            Disconnect();
        }


        return valueRead;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...