Windows 物联网 UWP - 中继
Windows IOT UWP - Relay
晚上好,
我正在对我的家庭自动化系统进行一些故障排除。我正在尝试在 C# 中使用 Raspberry PI 3 和 Windows IOT 切换继电器。我一直在玩代码,我可以看到继电器切换一两次,但随后应用程序崩溃了。我是物联网菜鸟,请问这段代码有问题吗? (变量名称在别处定义,我下面的奇怪变量名称是我的 WIP 项目...我更喜欢用英语进行故障排除)...
private void BtnTempFan_Click(object sender, RoutedEventArgs e)
{
if (BtnTempFan.IsChecked == true)
{
TogglePin(TempFan, TempFan_PIN, BtnTempFan, GpioPinValue.High);
}
else
{
TempFan.Dispose();
}
}
private void TogglePin(GpioPin PinName, int PinNumber, ToggleButton Name, GpioPinValue value)
{
int pinnumber = PinNumber;
GpioPinValue pinvalue;
var gpio = GpioController.GetDefault();
PinName = gpio.OpenPin(pinnumber);
if (gpio == null)
{
PinName = null;
LblError.Text = "We can't find the controller on the device" + PinName;
LblError.Visibility = Visibility.Visible;
return;
}
if (PinName == null)
{
LblError.Text = "We can't find the pin on the device. Pin number " + PinNumber + "does not exist";
LblError.Visibility = Visibility.Visible;
return;
}
if (Name.IsChecked == true)
{
pinvalue = value;
PinName.Write(pinvalue);
PinName.SetDriveMode(GpioPinDriveMode.Output);
}
你不说异常是什么。但是,我相信您应该只为每个应用打开一次 GPIO 引脚:
var gpio = GpioController.GetDefault();
PinName = gpio.OpenPin(pinnumber);
您在每次单击按钮时调用一次的方法中拥有它。通过多次打开图钉,您会遇到图钉已经打开的情况,我相信这就是抛出异常并导致应用程序崩溃的原因。
在我的代码中,我在 "driver" class 中处理引脚状态,并有一个名为 Connect
的方法,我在启动应用程序时调用一次。例如:
public async Task Connect()
{
var gpioController = await GpioController.GetDefaultAsync();
try
{
_openPin = gpioController.OpenPin(_doorMotorOpenPin);
_closePin = gpioController.OpenPin(_doorMotorClosePin);
}
}
这封装了 2 个引脚:_openPin
和 _closePin
到我可以管理其生命周期的 class。
Codekaizen 是正确的。我将 pin 打开到一个只被调用一次并解决问题的方法中。
private void BtnTempFan_Click(object sender, RoutedEventArgs e)
{
if (BtnTempFan.IsChecked == false)
{
TogglePin(TempFan, TempFan_PIN, BtnTempFan, GpioPinValue.High);
}
if (BtnTempFan.IsChecked == true)
{
TogglePin(TempFan, TempFan_PIN, BtnTempFan, GpioPinValue.Low);
}
}
private void InitializePins()
{
var gpio = GpioController.GetDefault();
// Show an error if there is no GPIO controller
if (gpio == null)
{
TempFan = null;
LblError.Text = "We can't find the controller on the device";
LblError.Visibility = Visibility.Visible;
return;
}
TempFan = gpio.OpenPin(TempFan_PIN);
TempFan.SetDriveMode(GpioPinDriveMode.Output);
}
private void TogglePin(GpioPin PinName, int PinNumber, ToggleButton Name, GpioPinValue value)
{
int pinnumber = PinNumber;
GpioPinValue pinvalue;
pinvalue = value;
PinName.Write(pinvalue);
}
晚上好,
我正在对我的家庭自动化系统进行一些故障排除。我正在尝试在 C# 中使用 Raspberry PI 3 和 Windows IOT 切换继电器。我一直在玩代码,我可以看到继电器切换一两次,但随后应用程序崩溃了。我是物联网菜鸟,请问这段代码有问题吗? (变量名称在别处定义,我下面的奇怪变量名称是我的 WIP 项目...我更喜欢用英语进行故障排除)...
private void BtnTempFan_Click(object sender, RoutedEventArgs e)
{
if (BtnTempFan.IsChecked == true)
{
TogglePin(TempFan, TempFan_PIN, BtnTempFan, GpioPinValue.High);
}
else
{
TempFan.Dispose();
}
}
private void TogglePin(GpioPin PinName, int PinNumber, ToggleButton Name, GpioPinValue value)
{
int pinnumber = PinNumber;
GpioPinValue pinvalue;
var gpio = GpioController.GetDefault();
PinName = gpio.OpenPin(pinnumber);
if (gpio == null)
{
PinName = null;
LblError.Text = "We can't find the controller on the device" + PinName;
LblError.Visibility = Visibility.Visible;
return;
}
if (PinName == null)
{
LblError.Text = "We can't find the pin on the device. Pin number " + PinNumber + "does not exist";
LblError.Visibility = Visibility.Visible;
return;
}
if (Name.IsChecked == true)
{
pinvalue = value;
PinName.Write(pinvalue);
PinName.SetDriveMode(GpioPinDriveMode.Output);
}
你不说异常是什么。但是,我相信您应该只为每个应用打开一次 GPIO 引脚:
var gpio = GpioController.GetDefault();
PinName = gpio.OpenPin(pinnumber);
您在每次单击按钮时调用一次的方法中拥有它。通过多次打开图钉,您会遇到图钉已经打开的情况,我相信这就是抛出异常并导致应用程序崩溃的原因。
在我的代码中,我在 "driver" class 中处理引脚状态,并有一个名为 Connect
的方法,我在启动应用程序时调用一次。例如:
public async Task Connect()
{
var gpioController = await GpioController.GetDefaultAsync();
try
{
_openPin = gpioController.OpenPin(_doorMotorOpenPin);
_closePin = gpioController.OpenPin(_doorMotorClosePin);
}
}
这封装了 2 个引脚:_openPin
和 _closePin
到我可以管理其生命周期的 class。
Codekaizen 是正确的。我将 pin 打开到一个只被调用一次并解决问题的方法中。
private void BtnTempFan_Click(object sender, RoutedEventArgs e)
{
if (BtnTempFan.IsChecked == false)
{
TogglePin(TempFan, TempFan_PIN, BtnTempFan, GpioPinValue.High);
}
if (BtnTempFan.IsChecked == true)
{
TogglePin(TempFan, TempFan_PIN, BtnTempFan, GpioPinValue.Low);
}
}
private void InitializePins()
{
var gpio = GpioController.GetDefault();
// Show an error if there is no GPIO controller
if (gpio == null)
{
TempFan = null;
LblError.Text = "We can't find the controller on the device";
LblError.Visibility = Visibility.Visible;
return;
}
TempFan = gpio.OpenPin(TempFan_PIN);
TempFan.SetDriveMode(GpioPinDriveMode.Output);
}
private void TogglePin(GpioPin PinName, int PinNumber, ToggleButton Name, GpioPinValue value)
{
int pinnumber = PinNumber;
GpioPinValue pinvalue;
pinvalue = value;
PinName.Write(pinvalue);
}