Попытка ReadAsync из SerialDevice молча завершает работу приложения - PullRequest
0 голосов
/ 10 июня 2018

У меня есть задача, которая постоянно выполняет чтение с последовательного порта.Я не вижу какой-либо внешней причины, по которой это не сработает, но я не исключаю, что я мог упустить что-то очевидное.

if (serialPort != null)
{
    while (true)
    {
        Windows.Storage.Streams.Buffer inputBuffer = new Windows.Storage.Streams.Buffer(1024);
        Windows.Storage.Streams.Buffer resultBuffer = new Windows.Storage.Streams.Buffer(1024);
        using (var childCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(ReadCancellationTokenSource.Token))
        {
            var t = serialPort.InputStream.ReadAsync(inputBuffer, inputBuffer.Capacity, InputStreamOptions.Partial).AsTask(ReadCancellationTokenSource.Token);
            resultBuffer = (Windows.Storage.Streams.Buffer)await t;
            if (resultBuffer.Length > 0)
            {
                LogDebug(string.Format("Read {0} bytes", resultBuffer.Length));
                DataReader dataReader = Windows.Storage.Streams.DataReader.FromBuffer(resultBuffer);
                string resultString = dataReader.ReadString(resultBuffer.Length);
                OnDataReceived(new DataReceiptEventArgs { Data = resultString });
            }
        }
        await Task.Delay(10);
    }
}

Результатом этого является то, что он правильно читает на первомитерация, но ReadAsync, похоже, не обрабатывает данные в потоке изящно, когда происходит следующая итерация и все данные уже прочитаны.Я бы хотел, чтобы поведение не возвращалось до тех пор, пока данные не станут доступны.По крайней мере, я ожидал исключение, так что я мог бы понять, что чтение не удалось.

Вместо этого отладчик регистрирует сообщение о том, что мое приложение "завершилось с кодом -1073741811 (0xc000000d)".что STATUS_INVALID_PARAMETER.

Что я делаю не так?Или это действительно никогда не сработает?

Редактировать:

Этот код выдает ту же ошибку:

if (serialPort != null)
{
    dataReaderObject = new DataReader(serialPort.InputStream);
    LogDebug("Listening...");
    while (true)
    {
        uint ReadBufferLength = 1024;
        ReadCancellationTokenSource.Token.ThrowIfCancellationRequested();
        dataReaderObject.InputStreamOptions = InputStreamOptions.Partial;
        using (var childCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(ReadCancellationTokenSource.Token))
        {
            UInt32 bytesRead = 0;
            bytesRead = await dataReaderObject.LoadAsync(ReadBufferLength).AsTask(childCancellationTokenSource.Token);
            if (bytesRead > 0)
            {
                LogDebug(string.Format("Read {0} bytes", bytesRead));
                string resultString = dataReaderObject.ReadString(bytesRead);
                OnDataReceived(new DataReceiptEventArgs { Data = resultString });
            }
        }
        await Task.Delay(10);
    }
}

1 Ответ

0 голосов
/ 10 июня 2018

Я думаю, что я понял это.

Помимо того, что у меня есть поток чтения, я также писал с использованием DataWriter.Но мой метод записи будет использовать DataWriter при каждой записи.Вместо этого я теперь объявил это как закрытый член моего серийного класса, и я создаю экземпляр DataWriter при подключении и избавляюсь от него в своем методе close.

Кажется, это поддерживает связь.

Не уверен, почему это происходит, любые объяснения приветствуются.

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