C# 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

我在从Nave32飞行控制器读取数据时遇到了一个小问题,我能够使用SerialDevice类将数据发送到卡上,但是当LoadAsync方法被调用时,没有更多的数据可以读取应用程序挂起且不向前移动,在执行过程中没有异常。我看了一下应用程序的状态,发现有一堆任务块,我不知道为什么。见下图

更新

固件源代码是

下面是我的示例代码

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);   
}