SerialDevice.FromIdAsync() returns null

心已入冬 提交于 2019-12-12 04:47:38

问题


I encountered a really strange problem when trying to connect my raspberry pi to my Arduino Uno through serial (usb).

serialPort = await SerialDevice.FromIdAsync(myDevices[0].Id);

Always returns null. I tried many things and it won't until I put it in a loop and then it works the second time. So I removed the loop and made it run 2 times.

This is my output

begintest
testrange
\\?\USB#VID_2341&PID_0001#55639313633351210252#{86e0d1e0-8089-11d0-9ce4-08003e301f73}
test1
null
begintest
ok
ok2
debugtest2
gelukt
Opened device for communication.
test
test2

And here is my code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Http;
using Windows.ApplicationModel.Background;
using Windows.Devices.Enumeration;
using Windows.Devices.SerialCommunication;
using System.Diagnostics;

namespace BackgroundApplication2
{
    public sealed class StartupTask : IBackgroundTask
    {
        private SerialDevice serialPort = null;
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            FindDevice();
            Debug.WriteLine("test1");

            if (serialPort == null)
            {
                Debug.WriteLine("null");
            }
            FindDevice();
        }


        private async void FindDevice()
        {
            Debug.WriteLine("begintest");
            UInt16 vid = 0x2341;
            UInt16 pid = 0x0001;

            string aqs = SerialDevice.GetDeviceSelectorFromUsbVidPid(vid, pid);

            var myDevices = await DeviceInformation.FindAllAsync(aqs);

            if (myDevices.Count == 0)
            {
                Debug.WriteLine("Device not found!");
                return;
            }

            try
            {
                Debug.WriteLine("testrange");
                Debug.WriteLine(myDevices[0].Id);
                serialPort = await SerialDevice.FromIdAsync(myDevices[0].Id);
                if (serialPort == null)
                {
                    Debug.WriteLine("null2");
                    return;
                }
                Debug.WriteLine("ok");
                serialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000);
                serialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000);
                serialPort.BaudRate = 9600;
                serialPort.Parity = SerialParity.None;
                serialPort.StopBits = SerialStopBitCount.One;
                serialPort.DataBits = 8;
                serialPort.Handshake = SerialHandshake.None;
                Debug.WriteLine("ok2");
                /*String debugtest = "Serial port configured successfully: ";
                debugtest += serialPort.BaudRate + "-";
                debugtest += serialPort.DataBits + "-";
                debugtest += serialPort.Parity.ToString() + "-";
                debugtest += serialPort.StopBits;
                debugtest += (DeviceInformation)myDevices[0];

                Debug.WriteLine("debugtest1");
                Debug.WriteLine(debugtest);*/
                Debug.WriteLine("debugtest2");
                Listen();
            }
            catch (Exception exception)
            {
                Debug.WriteLine(exception.Message.ToString());
                Debug.WriteLine("error");
            }
            finally
            {
                Debug.WriteLine("Opened device for communication.");
            }
            Debug.WriteLine("test2");
        }
        private async void Listen()
        {
            Debug.WriteLine("gelukt");
        }
    }
}

For some reason this part makes it stuck. It just stops there...

String debugtest = "Serial port configured successfully: ";
debugtest += serialPort.BaudRate + "-";
debugtest += serialPort.DataBits + "-";
debugtest += serialPort.Parity.ToString() + "-";
debugtest += serialPort.StopBits;
debugtest += (DeviceInformation)myDevices[0];

Debug.WriteLine("debugtest1");
Debug.WriteLine(debugtest);

This is the output:

begintest
testrange
\\?\USB#VID_2341&PID_0001#55639313633351210252#{86e0d1e0-8089-11d0-9ce4-08003e301f73}
test1
null
begintest
ok
ok2
The thread 0x508 has exited with code 0 (0x0).
The program '[2308] serialsample.exe' has exited with code -1 (0xffffffff).

And my final question why does it automatically stop running? My debugging always exit's with this (or code -1 as seen above):

The program '[240] backgroundTaskHost.exe' has exited with code 1 (0x1).

Sorry if there's a dutch word here and there in my code.


回答1:


You are using IBackgroundTask incorrectly, you must register your deferal and notifiy when it is complete. This is done by changing your async void functions to async task and making Run a async void

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Http;
using Windows.ApplicationModel.Background;
using Windows.Devices.Enumeration;
using Windows.Devices.SerialCommunication;
using System.Diagnostics;
using System.Threading.Tasks;

namespace BackgroundApplication2
{
    public sealed class StartupTask : IBackgroundTask
    {
        private SerialDevice serialPort = null;
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            //This tells IBackgroundTask you will be doing some extra work in the background and it should not shut down.
            var deferral = taskInstance.GetDeferral();
            try
            {
                await FindDevice();
                Debug.WriteLine("test1");

                if (serialPort == null)
                {
                    Debug.WriteLine("null");
                }
                await FindDevice();
            }
            finally
            {
                //This tells IBackgroundTask that you are done with the last await.
                deferral.Complete();
            }
        }


        private async Task FindDevice()
        {
            Debug.WriteLine("begintest");
            UInt16 vid = 0x2341;
            UInt16 pid = 0x0001;

            string aqs = SerialDevice.GetDeviceSelectorFromUsbVidPid(vid, pid);

            var myDevices = await DeviceInformation.FindAllAsync(aqs);

            if (myDevices.Count == 0)
            {
                Debug.WriteLine("Device not found!");
                return;
            }

            try
            {
                Debug.WriteLine("testrange");
                Debug.WriteLine(myDevices[0].Id);
                serialPort = await SerialDevice.FromIdAsync(myDevices[0].Id);
                if (serialPort == null)
                {
                    Debug.WriteLine("null2");
                    return;
                }
                Debug.WriteLine("ok");
                serialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000);
                serialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000);
                serialPort.BaudRate = 9600;
                serialPort.Parity = SerialParity.None;
                serialPort.StopBits = SerialStopBitCount.One;
                serialPort.DataBits = 8;
                serialPort.Handshake = SerialHandshake.None;
                Debug.WriteLine("ok2");
                /*String debugtest = "Serial port configured successfully: ";
                debugtest += serialPort.BaudRate + "-";
                debugtest += serialPort.DataBits + "-";
                debugtest += serialPort.Parity.ToString() + "-";
                debugtest += serialPort.StopBits;
                debugtest += (DeviceInformation)myDevices[0];

                Debug.WriteLine("debugtest1");
                Debug.WriteLine(debugtest);*/
                Debug.WriteLine("debugtest2");
                await Listen();
            }
            catch (Exception exception)
            {
                Debug.WriteLine(exception.Message.ToString());
                Debug.WriteLine("error");
            }
            finally
            {
                Debug.WriteLine("Opened device for communication.");
            }
            Debug.WriteLine("test2");
        }
        private async Task Listen()
        {
            Debug.WriteLine("gelukt");
        }
    }
}


来源:https://stackoverflow.com/questions/42793572/serialdevice-fromidasync-returns-null

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!