Я пытаюсь написать класс «Температура», который обрабатывает связь с моей 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() из-за пределов моего класса, мое значение всегда равно нулю.
Может ли кто-нибудь помочь мне выяснить, что я делаю неправильно? Спасибо.
Это направило меня по правильному пути, поэтому я буду отмечать его как ответ. Добавление GetThermocoupleData (null) в конце try {} не было выполнено, но если я изменю свой температурный_данный = новый байт [4] и добавлю цикл delay/loop в мой метод Run(), я верну свои данные. Благодаря! –
oh darn, я не заметил, что метод Init был асинхронным. Вот почему мое предложение не сработало. По-прежнему можно было запросить температуру до того, как init завершил выполнение. Рад, что вы его работали. – Joel