COMException при запуске фонового UWP в Windows 10 IOT - PullRequest
0 голосов
/ 12 июня 2019

Я разрабатываю решение I2C для Raspberry Pi и Teensy 3.6 Arduino. Pi собирается отправить NTP через I2C на Arduino. Я провел исследование в течение нескольких недель и пытался проверить приведенный ниже код, и получил пару ошибок.

public sealed class StartupTask : IBackgroundTask
{
    public async void Run(IBackgroundTaskInstance taskInstance)
    {
        while(true)
        {
            Wait(5000);
            try
            {
                await I2C();
            }
            catch (Exception ex)
            {
                // eats fast inputs
            }
        }
    }

    private async void Wait(int millis)
    {
        await Task.Delay(millis);
    }

    private async Task I2C()
    {
        var settings = new I2cConnectionSettings(1);
        settings.BusSpeed = I2cBusSpeed.FastMode;
        var controller = await I2cController.GetDefaultAsync();

        using (I2cDevice device = controller.GetDevice(settings))
        {
            byte[] writeBuf = { 0x01, 0x02, 0x03, 0x04 };
            device.Write(writeBuf);
        }
    }
}

Используя консоль отладки, я обнаружил, что метод I2C никогда не проходит через оператор using.

ИСКЛЮЧЕНИЯ:

Исключение: 'System.Runtime.InteropServices.COMException' в i2cTestIOT.winmd Информация WinRT: было передано неожиданное количество байтов. Ожидаемое: Актуальный: Возникло исключение: «System.Runtime.InteropServices.COMException» в System.Private.CoreLib.ni.dll Информация WinRT: было передано неожиданное количество байтов. Ожидаемое: Фактически: '.

1 Ответ

0 голосов
/ 13 июня 2019

Я не могу воспроизвести эту ошибку с Raspberry pi и Arduino Uno, используя точный код (если это полный воспроизводимый код).Итак,

Используя консоль отладки, я обнаружил, что метод I2C никогда не проходит весь путь с помощью оператора using.

Убедитесь, что 1 является правильнымАдрес I2C для вашего Teensy 3.6 Arduino и проверьте правильность подключения SDA и SCL.См. Сопоставление выводов ядра IoT Windows .

Добавьте deferral = taskInstance.GetDeferral();, если вы хотите, чтобы фоновое приложение всегда работало.В противном случае, когда метод Run заканчивается, фоновое приложение завершается.

private BackgroundTaskDeferral deferral;
public void Run(IBackgroundTaskInstance taskInstance)
{
    deferral = taskInstance.GetDeferral();

    //
    // TODO: Insert code to start one or more asynchronous methods
    //
}

Сначала попробуйте скорость StandardMode, а затем FastMode.

...