Суть проблемы: создаю приложение в UWP, которое загружаю в Windows IoT на raspberry. Суть программы в включении/отключении реле на плате, которая связяна с raspberry по i2c. Сама программа отрабатывает правильно, нажимаю кнопку - реле включается, нажимаю еще раз - выключается, но при повторном нажатии на включение - ничего не происходит. Подскажите, что может быть не так?
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.Devices.I2c;
// Документацию по шаблону элемента "Пустая страница" см. по адресу https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x419
namespace App3
{
/// <summary>
/// Пустая страница, которую можно использовать саму по себе или для перехода внутри фрейма.
/// </summary>
public sealed partial class MainPage : Page
{
I2cDevice I2C_PIC24FJ128GB106;
DispatcherTimer timer;
int addrSlave = 0x15;
bool Pump = false;
public MainPage()
{
InitializeComponent();
InitI2C();
}
async void InitI2C()
{
I2cConnectionSettings i2CConnectionSettings = new I2cConnectionSettings(addrSlave);
i2CConnectionSettings.BusSpeed = I2cBusSpeed.StandardMode;
I2cController i2CController = await I2cController.GetDefaultAsync();
I2C_PIC24FJ128GB106 = i2CController.GetDevice(i2CConnectionSettings);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var per1 = new byte[] { 13, 0x0 };
var per2 = new byte[] { 13, 0x1 };
if (Pump != false)
{
I2C_PIC24FJ128GB106.Write(per1);
}
else
{
Pump = true;
I2C_PIC24FJ128GB106.Write(per2);
}
}
}
}
Аналогичная обработка метода на Python, где кнопка отрабатывает как нужно
def onButtonEnableLevel1(self):
if self.enableLevel1 != False:
self.m_buttonEnableLevel1.configure(background=self.orig_color)
bus.write_byte_data(0x15, 13, 0x0)
self.enableLevel1 = False
else:
self.enableLevel1 = True
self.m_buttonEnableLevel1.configure(background='#0078D7')
bus.write_byte_data(0x15, 13, 0x1)
if (Pump != false)
{
Pump = false;
I2C_PIC24FJ128GB106.Write(per1);
}
else
{
Pump = true;
I2C_PIC24FJ128GB106.Write(per2);
}
Постоянно подавали сигнал на выключение, поскольку флаг не вернули в соответствующее состоянию положение.
А вообще лучше сделать как-нибудь так:
public void DeviceSwitch()
{
I2C_PIC24FJ128GB106.Write(Pump ? per1: per2);
Pump =!Pump;
}
И в Button_Click
дергайте уже этот метод. Вообще в обработчике событий контролов логики быть не должно.
Плюс это
var per1 = new byte[] { 13, 0x0 };
var per2 = new byte[] { 13, 0x1 };
Вынесите в константы класса. И название переменным давайте более удобоваримые - еще спасибо за совет скажете, когда-нибудь. А еще лучше вообще из класса MainPage
- всё это вынести в отдельный класс.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть база данных магазина (3 таблицы)Нужно выводить данные в datagrid, а также в нем же добавлять, обновлять, удалять и искать записи
Есть класс, содержащий оператор приведения типа int к типу этого класса
Пишу тестовый веб-сайт, где пробую разные аспекты CQRS (сначала это была самопальная реализация cqrs, потом попробовал MediatR)