UWP Headless 应用程序上的串行连接
serial connection on UWP Headless app
我想为 Raspberry Pi 创建一个涉及从串行端口读取数据的无头应用程序。
Microsoft 的示例应用程序运行良好,只是它有一个用户界面。
在创建无头应用程序时,我将所有相关部分都接过来如下:
var aqs = SerialDevice.GetDeviceSelector();
var dis = await DeviceInformation.FindAllAsync(aqs);
foreach (var t in dis)
{
if (t.Id.Contains("FTDI"))
{
listOfDevices.Add(t);
}
}
if (listOfDevices.Count == 1)
{
DeviceInformation entry = listOfDevices[0];
try
{
serialPort = await SerialDevice.FromIdAsync(entry.Id);
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;
...
有一根USB-FTDI-cable,其中ID包含"FTDI"如下:
serialPort = await SerialDevice.FromIdAsync(entry.Id);
程序在程序实例消失之前到达这一行并忽略我的断点。
有什么想法吗?
我使用你的代码并在 Package.appxmanifest 中添加以下行。
<DeviceCapability Name="serialcommunication">
<Device Id="any">
<Function Type="name:serialPort" />
</Device>
</DeviceCapability>
对我有用。
更新:
根据你的项目(你发给我的),因为你的 ListAvailablePorts() 是一个异步操作,你需要 use the GetDeferral method to get a background task deferral to keep the host process from being suspended or terminated before the asynchronous operation complete。您可以像这样编辑您的代码:
BackgroundTaskDeferral _deferral = null;
public async void Run(IBackgroundTaskInstance taskInstance)
{
_deferral = taskInstance.GetDeferral();
//
// TODO: Insert code to start one or more asynchronous methods
//
try
{
//var u = new USART();
//await u.Initialize(115200, SerialParity.None, SerialStopBitCount.One, 8);
listOfDevices = new ObservableCollection<DeviceInformation>();
ListAvailablePorts();
}
...
}
并在异步操作完成后调用_deferral.Complete()
。
我想为 Raspberry Pi 创建一个涉及从串行端口读取数据的无头应用程序。
Microsoft 的示例应用程序运行良好,只是它有一个用户界面。
在创建无头应用程序时,我将所有相关部分都接过来如下:
var aqs = SerialDevice.GetDeviceSelector();
var dis = await DeviceInformation.FindAllAsync(aqs);
foreach (var t in dis)
{
if (t.Id.Contains("FTDI"))
{
listOfDevices.Add(t);
}
}
if (listOfDevices.Count == 1)
{
DeviceInformation entry = listOfDevices[0];
try
{
serialPort = await SerialDevice.FromIdAsync(entry.Id);
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;
...
有一根USB-FTDI-cable,其中ID包含"FTDI"如下:
serialPort = await SerialDevice.FromIdAsync(entry.Id);
程序在程序实例消失之前到达这一行并忽略我的断点。
有什么想法吗?
我使用你的代码并在 Package.appxmanifest 中添加以下行。
<DeviceCapability Name="serialcommunication">
<Device Id="any">
<Function Type="name:serialPort" />
</Device>
</DeviceCapability>
对我有用。
更新:
根据你的项目(你发给我的),因为你的 ListAvailablePorts() 是一个异步操作,你需要 use the GetDeferral method to get a background task deferral to keep the host process from being suspended or terminated before the asynchronous operation complete。您可以像这样编辑您的代码:
BackgroundTaskDeferral _deferral = null;
public async void Run(IBackgroundTaskInstance taskInstance)
{
_deferral = taskInstance.GetDeferral();
//
// TODO: Insert code to start one or more asynchronous methods
//
try
{
//var u = new USART();
//await u.Initialize(115200, SerialParity.None, SerialStopBitCount.One, 8);
listOfDevices = new ObservableCollection<DeviceInformation>();
ListAvailablePorts();
}
...
}
并在异步操作完成后调用_deferral.Complete()
。