UWP无头应用上的串行连接

时间:2016-12-05 08:25:09

标签: c# xamarin uwp iot headless

我想为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电缆,ID包含“FTDI”,如下所示:

serialPort = await SerialDevice.FromIdAsync(entry.Id);

程序在程序实例消失之前到达此行并忽略我的断点。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我使用您的代码并在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()