2016-06-26 8 views
1

Я пытаюсь написать класс «Температура», который обрабатывает связь с моей RaspberryPi через SPI, чтобы прочитать некоторые данные о температуре. Цель состоит в том, чтобы иметь возможность вызвать метод GetTemp() из-за пределов моего температурного класса, чтобы я мог использовать данные о температуре, когда мне это нужно, в остальной части моей программы.Получение данных температуры SPI вне класса

Мой код настроен так:

public sealed class StartupTask : IBackgroundTask 
{ 
    private BackgroundTaskDeferral deferral; 

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

     Temperature t = new Temperature(); 

     //Want to be able to make a call like this throughout the rest of my program to get the temperature data whenever its needed 
     var data = t.GetTemp(); 
    } 
} 

Температурный класс:

class Temperature 
{ 
    private ThreadPoolTimer timer; 
    private SpiDevice thermocouple; 
    public byte[] temperatureData = null; 

    public Temperature() 
    { 
     InitSpi(); 
     timer = ThreadPoolTimer.CreatePeriodicTimer(GetThermocoupleData, TimeSpan.FromMilliseconds(1000)); 

    } 
    //Should return the most recent reading of data to outside of this class 
    public byte[] GetTemp() 
    { 
     return temperatureData; 
    } 

    private async void InitSpi() 
    { 
     try 
     { 
      var settings = new SpiConnectionSettings(0); 
      settings.ClockFrequency = 5000000; 
      settings.Mode = SpiMode.Mode0; 

      string spiAqs = SpiDevice.GetDeviceSelector("SPI0"); 
      var deviceInfo = await DeviceInformation.FindAllAsync(spiAqs); 
      thermocouple = await SpiDevice.FromIdAsync(deviceInfo[0].Id, settings); 
     } 

     catch (Exception ex) 
     { 
      throw new Exception("SPI Initialization Failed", ex); 
     } 
    } 

    private void GetThermocoupleData(ThreadPoolTimer timer) 
    { 
     byte[] readBuffer = new byte[4]; 
     thermocouple.Read(readBuffer); 
     temperatureData = readBuffer; 
    } 
} 

Когда я добавить контрольную точку в GetThermocoupleData(), я могу видеть, что я получаю правильные данные датчика значения. Однако, когда я вызываю t.GetTemp() из-за пределов моего класса, мое значение всегда равно нулю.

Может ли кто-нибудь помочь мне выяснить, что я делаю неправильно? Спасибо.

ответ

0

GetThermocouplerData() должен был быть вызван по крайней мере один раз для возврата данных. В вашем примере кода он не будет выполняться до 1 секунды после создания экземпляра. Просто добавьте вызов GetThermocoupleData (null) в InitSpi в последней строке блока try, чтобы он начинал с уже по крайней мере 1 вызова.

+0

Это направило меня по правильному пути, поэтому я буду отмечать его как ответ. Добавление GetThermocoupleData (null) в конце try {} не было выполнено, но если я изменю свой температурный_данный = новый байт [4] и добавлю цикл delay/loop в мой метод Run(), я верну свои данные. Благодаря! –

+0

oh darn, я не заметил, что метод Init был асинхронным. Вот почему мое предложение не сработало. По-прежнему можно было запросить температуру до того, как init завершил выполнение. Рад, что вы его работали. – Joel

 Смежные вопросы

  • Нет связанных вопросов^_^