Событие Windows Arduino StringMessageReceived для Windows - PullRequest
0 голосов
/ 04 сентября 2018

Хорошо, я устал от поиска в Google. Поэтому я работаю над проектом, который использует Windows Remote Arduino . Я только начинаю, поэтому я нахожусь в стадии "просто взломать это вместе" Arduino работает на стандартных фирмах, и я вызываю функцию sysex, которая возвращает некоторые данные с некоторых датчиков.

Я подписался на событие StringMessageReceived, но я обнаружил, что событие не всегда запускается. Я «должен» получать данные каждый раз, когда отправляю команду sysex. Я обнаружил закрытую проблему на сайте git hub для удаленного подключения, которая говорит, что я вызываю flush () для объекта firmata, что я делаю, но я не получаю ответ 1 на 1.

Вот пример вывода, который я получаю.

Событие готовности устройства сработало

Таймер Тик!

Таймер!

{\ "TEMP1 \": 21,50, \ "рН \": 0,000}

Таймер Тик!

{\ "TEMP1 \": 21,50, \ "рН \": 0,000}

Таймер Тик!

Таймер Тик!

Таймер!

{\ "TEMP1 \": 21,50, \ "рН \": 0,000}

Таймер Тик!

Таймер!

Таймер Tick!

Таймер Тик!

{\ "TEMP1 \": 21,50, \ "рН \": 0,000}

Таймер!

Таймер!

Таймер!

Таймер!

{\ "TEMP1 \": 21,50, \ "рН \": 0,000}

{\ "TEMP1 \": 21,50, \ "рН \": 0,000}

Таймер!

Таймер!

Таймер!

{\ "TEMP1 \": 21,50, \ "рН \": 0,000}

Таймер!

{\ "TEMP1 \": 21,50, \ "рН \": 0,000}

Таймер Тик!

Таймер!

Таймер!

{\ "TEMP1 \": 21.50, \ "PH \": 0.000} "

Я знаю, что arduino получает мои команды, потому что я вижу светодиоды на одном из моих датчиков, обрабатывающих команду.

Вот мой код UWP.

public sealed partial class MainPage : Page
{
    IStream connection;
    RemoteDevice arduino;
    UwpFirmata firmata;
    DispatcherTimer timer;

    public MainPage()
    {
        this.InitializeComponent();
    }

    private void btnConnect_Click(object sender, RoutedEventArgs e)
    {
        connection = new UsbSerial("VID_0403", "PID_6001");
        firmata = new UwpFirmata();
        arduino = new RemoteDevice(firmata);
        timer = new DispatcherTimer();
        firmata.begin(connection);

        connection.begin(57600, SerialConfig.SERIAL_8N1);
        arduino.DeviceReady += Setup;
        arduino.DeviceConnectionFailed += ConnectFailed;
        arduino.StringMessageReceived += StringRecieved;

        timer.Interval = new TimeSpan(0, 0, 5);
        timer.Tick += timerTick;
        timer.Start();
    }

    private void timerTick(object sender, object e)
    {
        Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, ()
        =>
        {
            lblPhData.Text += "Timer Tick!\n";
        }
        );
        byte PH_QUERY = 0x44;
        firmata.sendSysex(PH_QUERY, new byte[] { }.AsBuffer());
        firmata.flush();
    }

    private void StringRecieved(string message)
    {
        Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, ()
        =>
        {
            lblPhData.Text += message + "\n";
        }
        );
    }

    public void ConnectFailed(String message)
    {
        Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, ()
             =>
         {
             lblPhData.Text += message;
         }
        );
    }
    public void Setup()
    {
        Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, ()
             =>
         {
             lblPhData.Text += "Device Ready Event Fired\n";
         }
        );            
    }

    private void btnGetData_Click(object sender, RoutedEventArgs e)
    {
        byte PH_QUERY = 0x44;
        firmata.sendSysex(PH_QUERY, new byte[] { }.AsBuffer());
        firmata.flush();
    }
}

Я должен упустить что-то действительно простое.

...