【发布时间】:2019-10-03 18:33:49
【问题描述】:
我正在尝试编写一个Task,它将一直运行到取消,它将读取 UART 接收到的任何数据并继续通过定义的event 发送接收到的数据。我希望读取循环读取 200 毫秒,然后返回它可能在该时间片中读取的任何数据(可能包括零数据)或读取完整缓冲区时,以先发生者为准;绝大多数情况下,超时将首先发生。我已成功从 UART 发送数据,但我未能接收到任何数据,即使已确认设备已通过线路接收数据。
SerialDevice device;
// Instantiate the SerialDevice.
device.ReadTimeout = new TimeSpan( 0, 0, 0, 0, 200 );
ReadDataCancellationTokenSource = new CancellationTokenSource();
const uint BufferSize_bytes = 50;
ReadDataTask = Task.Factory.StartNew( async () =>
{
using( DataReader reader = new DataReader( device.InputStream ) )
{
reader.InputStreamOptions = InputStreamOptions.Partial;
while( !ReadDataCancellationTokenSource.IsCancellationRequested )
{
uint dataRead = await reader.LoadAsync( BufferSize_bytes ).AsTask();
if( dataRead > 0 )
{
IBuffer buffer = reader.ReadBuffer( dataRead );
if( buffer.Length > 0 )
PropogateReceivedData( ReadBuffer( buffer ) );
}
}
}
}, ReadDataCancellationTokenSource.Token );
PropogateReceivedData( ReadBuffer( buffer ) )调用读取缓冲区中的所有数据,然后调度数据;众所周知,这可以正常工作。存储ReadDataCancellationTokenSource 成员以在需要时关闭Task。
考虑到我在尝试采用这种方法时遇到的挑战,我想知道它是否应该奏效,或者如果不奏效,我需要做些什么才能让它发挥作用。
【问题讨论】:
标签: serial-port raspberry-pi3 uart windows-10-iot-core