C# SerialDevice.LoadAsync块等待任务
我在从Nave32飞行控制器读取数据时遇到了一个小问题,我能够使用SerialDevice类将数据发送到卡上,但是当LoadAsync方法被调用时,没有更多的数据可以读取应用程序挂起且不向前移动,在执行过程中没有异常。我看了一下应用程序的状态,发现有一堆任务块,我不知道为什么。见下图 更新 固件源代码是 下面是我的示例代码C# SerialDevice.LoadAsync块等待任务,c#,serial-port,windowsiot,C#,Serial Port,Windowsiot,我在从Nave32飞行控制器读取数据时遇到了一个小问题,我能够使用SerialDevice类将数据发送到卡上,但是当LoadAsync方法被调用时,没有更多的数据可以读取应用程序挂起且不向前移动,在执行过程中没有异常。我看了一下应用程序的状态,发现有一堆任务块,我不知道为什么。见下图 更新 固件源代码是 下面是我的示例代码 namespace Apps.Receiver { /// <summary> /// An empty page that can be used on its
namespace Apps.Receiver
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
this.dataRecived.Text = DateTime.Now.ToString();
}
private async Task readAsync(SerialDevice serialPort)
{
string data = string.Empty;
using (var dataReaderObject = new DataReader(serialPort.InputStream))
{
try
{
dataReaderObject.InputStreamOptions = InputStreamOptions.None;
var hasData = true;
while (hasData)
{
var bytesRead = await dataReaderObject.LoadAsync(serialPort.DataBits);
if (bytesRead > 0)
data += dataReaderObject.ReadString(bytesRead);
else
hasData = false;
}
}
catch (Exception ex)
{
status.Text = "reading data fail: " + ex.Message;
closeDevice(serialPort);
}
}
dataRecived.Text = data;
}
private async void sendData_Click(object sender, RoutedEventArgs e)
{
var serialPort = await getSerialDevice("COM3");
if (dataToSend.Text.Length != 0)
{
using (var dataWriteObject = new DataWriter(serialPort.OutputStream))
{
try
{
if (dataToSend.Text.Equals("#", StringComparison.CurrentCultureIgnoreCase))
dataWriteObject.WriteString(dataToSend.Text);
else
dataWriteObject.WriteString(dataToSend.Text + "\n");
var bytesWritten = await dataWriteObject.StoreAsync();
if (bytesWritten > 0)
{
status.Text = dataToSend.Text + ", ";
status.Text += "bytes written successfully!";
}
await readAsync(serialPort);
}
catch (Exception ex)
{
status.Text = "writing data fail: " + ex.Message;
}
}
closeDevice(serialPort);
}
else
{
status.Text = "Enter the text you want to write and then click on 'WRITE'";
}
}
private void closeDevice(SerialDevice device)
{
device.Dispose();
device = null;
}
private async Task<SerialDevice> getSerialDevice(string portName)
{
var aqs = SerialDevice.GetDeviceSelector("COM3");
var devices = await DeviceInformation.FindAllAsync(aqs);
if (devices.Count == 0)
throw new Exception("Unablet to connect to device");
var serialPort = await SerialDevice.FromIdAsync(devices[0].Id);
if (serialPort == null)
throw new Exception("Unablet to Open to port " + portName);
serialPort.BaudRate = 115200;
serialPort.DataBits = 8;
return serialPort;
}
}
}
namespace Apps.Receiver
{
///
///可以单独使用或在框架内导航到的空页。
///
公共密封部分类主页面:第页
{
公共主页()
{
this.InitializeComponent();
this.dataRecived.Text=DateTime.Now.ToString();
}
专用异步任务readAsync(串行设备串行端口)
{
字符串数据=string.Empty;
使用(var dataReaderObject=newdatareader(serialPort.InputStream))
{
尝试
{
dataReaderObject.InputStreamOptions=InputStreamOptions.None;
var hasData=true;
while(hasData)
{
var bytesRead=wait dataReaderObject.LoadAsync(serialPort.DataBits);
如果(字节读取>0)
data+=dataReaderObject.ReadString(字节读取);
其他的
hasData=false;
}
}
捕获(例外情况除外)
{
status.Text=“读取数据失败:”+ex.消息;
关闭设备(串行端口);
}
}
datareceived.Text=数据;
}
私有异步void sendData\u单击(对象发送方,路由目标)
{
var serialPort=等待getSerialDevice(“COM3”);
if(dataToSend.Text.Length!=0)
{
使用(var dataWriteObject=newdatawriter(serialPort.OutputStream))
{
尝试
{
if(dataToSend.Text.Equals(“#”,StringComparison.CurrentCultureIgnoreCase))
dataWriteObject.WriteString(dataToSend.Text);
其他的
dataWriteObject.WriteString(dataToSend.Text+“\n”);
var bytesWrite=wait dataWriteObject.StoreAsync();
如果(字节写入>0)
{
status.Text=dataToSend.Text+“,”;
status.Text+=“字节写入成功!”;
}
等待readAsync(串行端口);
}
捕获(例外情况除外)
{
status.Text=“写入数据失败:”+ex.消息;
}
}
关闭设备(串行端口);
}
其他的
{
status.Text=“输入要写入的文本,然后单击“写入”;
}
}
专用无效关闭设备(串行设备)
{
device.Dispose();
设备=空;
}
专用异步任务getSerialDevice(字符串端口名)
{
var aqs=SerialDevice.GetDeviceSelector(“COM3”);
var设备=等待设备信息。FindAllAsync(aqs);
如果(devices.Count==0)
抛出新异常(“无法连接到设备”);
var serialPort=await SerialDevice.FromIdAsync(设备[0].Id);
if(serialPort==null)
抛出新异常(“无法打开端口”+端口名);
serialPort.BaudRate=115200;
serialPort.DataBits=8;
返回串口;
}
}
}
查看此示例,如果这样做有帮助,请尝试:
await reader.LoadAsync(8192);
while (reader.UnconsumedBufferLength > 0)
{
strBuilder.Append(reader.ReadString(reader.UnconsumedBufferLength));
await reader.LoadAsync(8192);
}