在Windows 10 IOT上运行后台UWP时出现COMException

时间:2019-06-12 19:46:58

标签: c# windows raspberry-pi iot i2c

我正在为Raspberry Pi和Teensy 3.6 Arduino开发I2C解决方案。 Pi将通过I2C向Arduino发送NTP。我已经进行了数周的研究,并尝试测试以下代码,并收到一些错误。

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语句。

例外:

引发的异常:i2cTestIOT.winmd中的'System.Runtime.InteropServices.COMException' WinRT信息:传输了意外的字节数。预期:'。实际:'。 抛出异常:System.Private.CoreLib.ni.dll中的'System.Runtime.InteropServices.COMException' WinRT信息:传输了意外的字节数。预期:'。实际:'。

1 个答案:

答案 0 :(得分:0)

我无法使用准确的代码来重现Raspberry pi和Arduino Uno的错误(如果它是完整的可重现代码)。所以

  

使用调试控制台,我发现I2C方法永远不会消失   一直到using语句。

确保1是您的Teensy 3.6 Arduino的正确I2C地址,并检查SDA和SCL是否正确连接。请参阅Windows IoT Core pin mappings

如果希望background application始终运行,请添加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。