SerialDevice.FromIdAsync()返回null

时间:2017-03-14 18:15:09

标签: c# serial-port uwp raspberry-pi3 windows-iot-core-10

尝试通过串口(usb)将我的覆盆子pi连接到我的Arduino Uno时遇到了一个非常奇怪的问题。

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

始终返回null。 我尝试了很多东西,直到我把它放在循环中然后它才第二次工作。所以我删除了循环并使其运行了2次。

这是我的输出

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

这是我的代码

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

由于某种原因,这部分使它卡住了。它只是停在那里......

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

这是输出:

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).

我最后的问题为什么会自动停止运行?我的调试总是以这个退出(或者如上所示代码-1):

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

很抱歉,如果我的代码中有一个荷兰语单词。

1 个答案:

答案 0 :(得分:0)

您错误地使用IBackgroundTask,您必须在完成后注册您的诽谤和通知。这是通过将async void功能更改为async task并将Run改为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");
        }
    }
}