SerialDevice.FromIdAsync() returns 空
SerialDevice.FromIdAsync() returns null
我在尝试通过串口 (usb) 将我的 raspberry pi 连接到我的 Arduino Uno 时遇到了一个非常奇怪的问题。
serialPort = await SerialDevice.FromIdAsync(myDevices[0].Id);
始终returns 为空。
我尝试了很多东西,直到我把它放在一个循环中,然后它第二次工作,它才会成功。所以我删除了循环并将其 运行 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).
还有我的最后一个问题,为什么它会自动停止 运行ning?我的调试总是以此(或上面看到的代码 -1)退出:
The program '[240] backgroundTaskHost.exe' has exited with code 1 (0x1).
抱歉,如果我的代码中到处都是荷兰语单词。
您使用 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");
}
}
}
我在尝试通过串口 (usb) 将我的 raspberry pi 连接到我的 Arduino Uno 时遇到了一个非常奇怪的问题。
serialPort = await SerialDevice.FromIdAsync(myDevices[0].Id);
始终returns 为空。 我尝试了很多东西,直到我把它放在一个循环中,然后它第二次工作,它才会成功。所以我删除了循环并将其 运行 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).
还有我的最后一个问题,为什么它会自动停止 运行ning?我的调试总是以此(或上面看到的代码 -1)退出:
The program '[240] backgroundTaskHost.exe' has exited with code 1 (0x1).
抱歉,如果我的代码中到处都是荷兰语单词。
您使用 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");
}
}
}