2016-06-26 8 views
1

Ich versuche, eine Klasse "Temperature" zu schreiben, die Kommunikation mit meinem RaspberryPi durch SPI behandelt, um einige Temperaturdaten zu lesen. Das Ziel ist, eine GetTemp() - Methode von außerhalb meiner Temperaturklasse aufrufen zu können, so dass ich Temperaturdaten verwenden kann, wann immer ich sie im Rest meines Programms brauche.SPI-Temperaturdaten von außerhalb der Klasse

Mein Code ist wie folgt aufgebaut:

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(); 
    } 
} 

Temperaturklasse:

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; 
    } 
} 

Wenn ich einen Haltepunkt in GetThermocoupleData() hinzufügen, kann ich sehen, dass ich die richtigen Sensordatum bin immer Werte. Wenn ich t.GetTemp() jedoch außerhalb meiner Klasse aufruft, ist mein Wert immer null.

Kann mir jemand helfen herauszufinden, was ich falsch mache? Vielen Dank.

Antwort

0

GetThermocouplerData() muss mindestens einmal aufgerufen worden sein, um Daten zurückzugeben. In Ihrem Codebeispiel wurde es erst 1 Sekunde nach der Instanziierung ausgeführt. Fügen Sie GetThermocoupleData (null) in InitSpi in der letzten Zeile Ihres try-Blocks einen Aufruf hinzu, so dass er bereits mit mindestens einem Aufruf beginnt.

+0

Das hat mich auf den richtigen Weg geleitet, also werde ich es als die Antwort markieren. Das Hinzufügen von GetThermocoupleData (null) am Ende von InitSpi's try {} hat nicht funktioniert, aber wenn ich mein temperatureData = new Byte [4] ändere und eine Verzögerung/Schleife in meine Run() Methode hinzufüge, dann bekomme ich meine Daten zurück. Vielen Dank! –

+0

oh verdammt, ich habe nicht bemerkt, dass die Init-Methode asynchron war. Deshalb hat mein Vorschlag nicht funktioniert. Es war immer noch möglich, nach der Temperatur zu fragen, bevor init ausgeführt wurde. Freut mich, dass es funktioniert hat. – Joel