尝试从SerialDevice ReadAsync静默崩溃应用程序

时间:2018-06-10 18:26:02

标签: c# uwp .net-core

我有一个从串口连续读取的任务。我没有看到任何外在的原因,这不会起作用,但我不打算说我可能会遗漏一些明显的东西。

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 :(得分:0)

我想我已经明白了。

除了读取线程之外,我还使用DataWriter编写。但是我的写方法会在每次写入时处理DataWriter。相反,我现在将其声明为我的序列类的私有成员,并在连接时实例化DataWriter并在我的close方法中处理它。

这似乎可以保持沟通。

不知道为什么会发生这种情况,欢迎任何解释。