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