C# 尝试从SerialDevice以静默方式从应用程序读取异步
我有一个任务正在从串行端口连续读取数据。我看不出任何外在的原因,这是行不通的,但我不认为我可能遗漏了一些明显的东西C# 尝试从SerialDevice以静默方式从应用程序读取异步,c#,uwp,.net-core,C#,Uwp,.net Core,我有一个任务正在从串行端口连续读取数据。我看不出任何外在的原因,这是行不通的,但我不认为我可能遗漏了一些明显的东西 if(serialPort!=null) { while(true) { Windows.Storage.Streams.Buffer inputBuffer=新的Windows.Storage.Streams.Buffer(1024); Windows.Storage.Streams.Buffer resultBuffer=新的Windows.Storage.Streams.Bu
if(serialPort!=null)
{
while(true)
{
Windows.Storage.Streams.Buffer inputBuffer=新的Windows.Storage.Streams.Buffer(1024);
Windows.Storage.Streams.Buffer resultBuffer=新的Windows.Storage.Streams.Buffer(1024);
使用(var childCancellationTokenSource=CancellationTokenSource.CreateLinkedTokenSource(ReadCancellationTokenSource.Token))
{
var t=serialPort.InputStream.ReadAsync(inputBuffer,inputBuffer.Capacity,InputStreamOptions.Partial).AsTask(ReadCancellationTokenSource.Token);
resultBuffer=(Windows.Storage.Streams.Buffer)等待t;
如果(resultBuffer.Length>0)
{
LogDebug(string.Format(“读取{0}字节”,resultBuffer.Length));
DataReader DataReader=Windows.Storage.Streams.DataReader.FromBuffer(resultBuffer);
string resultString=dataReader.ReadString(resultBuffer.Length);
OnDataReceived(新DataReceiptEventArgs{Data=resultString});
}
}
等待任务。延迟(10);
}
}
这样做的结果是,它在第一次迭代时读取正确,但在下一次迭代发生且所有数据都已读取时,ReadAsync
似乎无法正常处理流中的任何数据。我希望行为是直到数据可用时任务才返回。至少,我希望出现一个异常,这样我就可以发现读取失败了
相反,调试器会记录一条消息,表明我的应用程序“已退出,代码为-1073741811(0xc000000d)”,这是状态\u无效\u参数
我做错了什么?或者这真的永远不会奏效
编辑:
此代码产生相同的错误:
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);
}
}
我想我明白了 除了有一个读线程运行外,我还使用了一个
DataWriter
。但我的write方法会在每次写入时处理DataWriter
。相反,我现在将它声明为串行类的私有成员,并在连接时实例化DataWriter
,并在close方法中处理它
这似乎可以保持沟通
虽然不知道为什么会发生这种情况,但欢迎任何解释