2016-07-16 112 views
0

我嘗試使用I2C協議在運行windows 10 IOT build 14376內部人員的T-REX Manual here和運行Windows 10的樹莓派3之間進行通信。事情是,它總是崩潰,所以經過一些調試過程後,我發現它看起來不會從DeviceInformation.FinAllAsync(..)中檢索到任何東西,並且導致在ArgumentOutOfRangeException之後。它應該有一些東西我不明白,也許在設備能力或權限,微軟教程沒有提到hereI2C窗口iOT找不到DeviceInformation

var settings = new I2cConnectionSettings(0x07); 
settings.BusSpeed = I2cBusSpeed.StandardMode; 
var aqs = I2cDevice.GetDeviceSelector("I2C1"); 
var dis = await DeviceInformation.FindAllAsync(aqs); 
int a = dis.Count; //is always equal to 0 

然後,我有一個using (I2cDevice device = await I2cDevice.FromIdAsync(dis[0].Id, settings)){...}其失敗

之前mentionned的ArgumentOutOfRangeException我嘗試了第二種方式是使用此代碼:

I2CDevice device; 
var settings = new I2cConnectionSettings(0x07); 
settings.BusSpeed = I2cBusSpeed.StandardMode; 

var controller = await Windows.Devices.I2c.I2cController.GetDefaultAsync(); 
device = controller.GetDevice(settings); 

其產生NullReferenceException到最後一行

+0

它與I2C設備無關。在與該奴隸交談之前拋出異常。 – Jackie

回答

2

您可能正在啓用「直接內存映射驅動程序」。您需要切換回「收件箱驅動程序」。

你的代碼應該適用於「收件箱驅動程序」。但是,使用「直接內存映射驅動程序」時,您必須使用「Microsoft.IoT.Lightning」軟件包與您的物聯網設備進行通信。

按照此tutorial用「閃電」庫,您設置您的I 2 C控制器看起來像下面的東西的方式,

 if (LightningProvider.IsLightningEnabled) 
     { 
      LowLevelDevicesController.DefaultProvider = LightningProvider.GetAggregateProvider(); 
     } 

     var i2cProvider = LightningI2cProvider.GetI2cProvider(); 
     var i2cControllers = await I2cController.GetControllersAsync(i2cProvider); 
     var i2cController = i2cControllers[0]; 
     var i2cDevice = i2cController.GetDevice(new I2cConnectionSettings(0x07)); 

注意,您需要包括

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

您包manifest文件,否則你不能訪問所有的串行外設。

按照此tutorial在「收件箱驅動程序」和「直接內存映射驅動程序」之間切換設備驅動程序。

+0

哦,我還沒有想到這一點,謝謝,我會在幾個小時內嘗試這個線索,以保持這個線程是最新的 –

+0

它是怎麼回事?有點好奇,想知道。 – Jackie

+0

有同樣的問題,你的答案是我的情況下的解決方案。非常感謝你! – Roland