У меня есть задача, которая постоянно выполняет чтение с последовательного порта.Я не вижу какой-либо внешней причины, по которой это не сработает, но я не исключаю, что я мог упустить что-то очевидное.
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);
}
}