UWP: не удается загрузить ШИМ-контроллеры с помощью Lightning на Raspberry Pi 2?

Я только что начал работать над старым проектом, который я когда-то начинал, но, к сожалению, ШИМ-контроллер больше не работает с драйвером Lightning. Я использую Visual Studio 2017, RPi2 работает по адресу 10.0.15063.414, и я установил следующие пакеты Nuget:

  • Microsoft.IoT.Lightning (v1.1.0)
  • Microsoft.NETCore.UniversalWindowsPlatform (v5.3.3)
  • WinRTXamlToolkit.Controls.DataVisualization (v2.3.0)

Проект включает ссылки на

  • Анализатор
  • Microsoft.IoT.Lightning
  • Microsoft.NETCore.UniversalWindowsPlatform
  • %Библиотека классов%
  • УниверсальныйWindows
  • Расширения Windows IoT для UWP
  • WinRTXamlToolkit.Controls.DataVisualization,

где %ClassesLibrary% — это определяемый пользователем проект, содержащий несколько классов для моего проекта. В веб-интерфейсе конфигурации Windows IoT Core в разделе устройств выбран Direct Memory Mapped Driver (Current Driver).

Мой код инициализации выглядит так

    private static async Task InitOnboardHardware()
    {
        if (LightningProvider.IsLightningEnabled)
        {
            LowLevelDevicesController.DefaultProvider = LightningProvider.GetAggregateProvider();
            GpioController gpioController = GpioController.GetDefault();

            var pwmControllers = await PwmController.GetControllersAsync(LightningPwmProvider.GetPwmProvider());
            if (pwmControllers != null)
            {
                m_PWMController = pwmControllers[1];
                //m_PWMController = (await PwmController.GetControllersAsync(LightningPwmProvider.GetPwmProvider()))[1];
                m_PWMController.SetDesiredFrequency(100);

                m_RPin = m_PWMController.OpenPin(18);
                m_GPin = m_PWMController.OpenPin(23);
                m_BPin = m_PWMController.OpenPin(24);
                m_WPin = m_PWMController.OpenPin(25);

                m_RPin.SetActiveDutyCyclePercentage(0);
                m_GPin.SetActiveDutyCyclePercentage(0);
                m_BPin.SetActiveDutyCyclePercentage(0);
                m_WPin.SetActiveDutyCyclePercentage(0);

                m_RPin.Start();
                m_GPin.Start();
                m_BPin.Start();
                m_WPin.Start();

                m_IsHardwareInitialized = true;
            }
        }
    }

Метод PwmController.GetControllersAsync никогда не завершается, и мое приложение зависает при запуске. Кроме того, более короткая версия с комментариями больше не работает ?!

Я действительно понятия не имею, что я мог пропустить. Поэтому буду очень признателен за любую помощь.

Заранее спасибо!

РЕДАКТИРОВАТЬ: я также попробовал другой пример (https://github.com/lprichar/WindowsIotPwmExample), где я заменил встроенную библиотеку молнии C/C++ пакетом NuGet (та же версия, что и в моем проекте). Образец также дает сбой: все выводы нулевые, потому что PwmController.GetControllersAsync никогда не завершается :-(

EDIT2: я забыл упомянуть, что мой файл package.appxmanifest также включает следующие изменения

  <Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:iot="http://schemas.microsoft.com/appx/manifest/iot/windows10"
  IgnorableNamespaces="uap mp iot">

так же как

<Capabilities>
<Capability Name="internetClient" />
<iot:Capability Name="lowLevelDevices" />
<DeviceCapability Name="109b86ad-f53d-4b76-aa5f-821e2ddf2141" />
</Capabilities>

person Roland    schedule 09.07.2017    source источник
comment
Я обновил Windows IoT Core до последней сборки Insider (10.0.16226.1000), после чего образец заработал нормально, а мое приложение — нет. Я сравнил каждую строку и обнаружил, что метод для GpioController не был асинхронным. Изменение его на асинхронный метод заставляет мое приложение работать нормально!   -  person Roland    schedule 09.07.2017


Ответы (1)


Смотрите также мой комментарий к первому сообщению. Мне пришлось изменить эту строку

GpioController gpioController = GpioController.GetDefault();

к вызову асинхронного метода

GpioController gpioController = await GpioController.GetDefaultAsync();

и теперь все работает отлично!

person Roland    schedule 09.07.2017