Universal windows app Serieel data ontvangen en versturen

Ha leden,

Ik lijk de grens van mijn kunnen bereikt te hebben. Ik zou graag een connectie willen leggen tussen arduino programma's en de computer. Met behulp van lichtsluisen wil ik bijhouden hoelang een ruiter bezig is om een parcours af te leggen. Dat lukt mij, maar nu wil ik de timestamps doorgeven aan de computer zodat ik uiteindelijk nog meer kan met de data. Ik verwacht dat het niet meer kan zijn dan 10 Bytes aan data

Ik dacht een paar maanden geleden dat ik dit wel voor elkaar kon krijgen met visual studio en UWP. Maar puntje bij paaltje raak ik in de war. De uitgebreide tutorials die ik vind zijn bedoeld voor windows forms, en dat lijkt iets anders te werken. De keuze voor UWP is gevallen om de schijnbare eenvoud waarmee het programma dan ook via een telefoon en zelfs de raspberry pi gebruikt kan worden.

Ik heb naar Firmata gekeken, maar de tijdsmeting mag niet afhankelijk zijn van de computer. Bovendien de sensoren versturen hun signalen ook draadloos door. Als de computer faalt moet de tijdsmeting nog steeds kunnen werken.

De zoektermen "UWP" en "Bluetooth" leveren meer voorbeelden op maar ik kwam er gisteren achter dat mijn computer toch soms verbindingsproblemen heeft.

Voor de duidelijkheid, ik vraag niet persé of iemand dit probleem voor mij oplost. Maar ik kan wel hulp gebruiken in de weg er naartoe.

*Edit: Ik heb bijvoorbeeld deze link gevonden: https://stackoverflow.com/questions/43844327/sending-commands-to-a-serial-device-in-uwp

Maar eigenlijk weet ik niet hoe ik dit kan toepassen.

Er lijken een paar stappen te zijn:

1) Ontdekken welke seriele poorten er beschikbaar zijn 2) verbinding open zetten, net als bij de arduino zelf (serial.Begin()) 3) ontvangen of zenden?

4) Bij beëindigen van het programma de poort dicht zetten

Misschien vind je hier wat inspiratie: Demo of PC-Arduino comms using Python Serial Input Basics

De tweede link handelt vooral over het verzenden van data van de computer naar de Arduino, maar het principe blijft hetzelfde als je de twee rollen omdraait natuurlijk, je kan hetzelfde principe implementeren in je PC code.

Het belang van start- en eindmarkers wordt ook duidelijk, dit maakt je programma veel robuuster en maakt de data gemakkelijker te parsen zonder framing errors.

Pieter

Pieter bedankt voor je antwoord, het heeft er toe geleid dat ik eerst windows forms heb gebruikt. Dit werk allemaal prima.

verbinding maken met een seriële poort gebeurt in 2 stappen. Eerst de poort uitzoeken en daarna verbinden. Ik heb al hulp nodig met die eerste stap. In windows forms is dit echt een eitje.

windows forms:

        private void Form1_Load(object sender, EventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();
            ComboBoxPorts.Items.AddRange(ports);

        }

Ik zie in de voorbeelden van microsoft dat er gebruik wordt gemaakt van databinding. Maar ik kan niet achterhalen hoe ik dit kan vereenvoudigen naar zo'n pure vorm als in het Forms voorbeeld.

Oke ik ben een stukje verder. Regel voor regel begin ik dingen te begrijpen

using System;
using System.Collections.ObjectModel;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.Devices.Enumeration;
using Windows.Devices.SerialCommunication;
using Windows.Storage.Streams;
using System.Threading;
using System.Threading.Tasks;

// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409

namespace ManJ_UWP_serial_2
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        //variabelen
        string Poortenlijst = SerialDevice.GetDeviceSelector();
        //Lijstvanpoorten = new ObservableCollection<DeviceInformation>(); //heeft iets met binding te maken waardoor het niet werkt denk ik

        string[] lijstvanpoorten;
        public MainPage()
        {
           this.InitializeComponent(); //builds the interface places the controls and everything
    

            ListAvailablePorts(); //roep functie aan om de listbox te vullen

        }

        private async void ListAvailablePorts()
        {
            // Get a list of devices that match the given name
            //DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(selector);

            string aqs = SerialDevice.GetDeviceSelector("COM13"); //Deze regel zoekt alle devices waar COM13 onderdeel van de naam is.
            var poorten = await DeviceInformation.FindAllAsync(aqs); // Geen idee

            PortsListbox.Items.Clear(); //maakt de Listbox weer leeg

            for (int i = 0; i < poorten.Count; i++) //vul de listbox met alle devices die gevonden zijn.
            {
                PortsListbox.Items.Add(poorten[i]);

            }

            //ReceiveTextbox.Text = poorten; //dit kan niet want "var poorten = DeviceInformation.FindAllAsync(Poortenlijst);" levert geen string op.

            //PortsListbox.Items.Add(poorten);

        }


        private void RefreshButton_Click(object sender, RoutedEventArgs e) //Bij klikken op de refresh button wordt deze opnieuw gevuld
        {
            ListAvailablePorts();
        }


    }

}

Het levert het volgende resultaat voor elk apparaat dat aan de zoektocht voldoet.

“windows.Devices.Enumeration.DeviceInformation”

Ik wil echter COM13 in het lijstje zien. Wat doe ik nu verkeerd?

Ik heb geen ervaring met UWP, dus daar kan ik je jammer genoeg niet mee helpen.

Pieter

Ondertussen ben ik een heel eind verder gekomen.

En ik had hier een heel verhaal getypt en toen stopte mijn internetverbinding ermee. En kon ik alleen nog maar herstarten.

Komt er op neer. Ik ga dit topic gebruiken om jullie op de hoogte te houden van mijn ontwikkelingen.

Dit staat allemaal in de xaml.CS code

using System;
using System.Collections.ObjectModel;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.Devices.Enumeration;
using Windows.Devices.SerialCommunication;
using Windows.Storage.Streams;
using System.Threading;
using System.Threading.Tasks;

// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409

namespace ManJ_UWP_serial_2
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {

        public MainPage()
        {
           this.InitializeComponent(); //builds the interface places the controls and everything
    

            ListAvailablePorts(); //roep functie aan om de listbox te vullen

        }

        private async void ListAvailablePorts()//begin van de functie om listbox te vullen met aanwezige seriele poorten
        {
            // Get a list of devices that match the given name
            //DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(selector);

            string SerialDeviceSearchVariable = SerialDevice.GetDeviceSelector(); // GetDeviceSelector maakt een string variable aan die alle informatie bevat om seriele apparaten te vinden. aqs staat voor  Advanced Query Syntax 

            var poorten = await DeviceInformation.FindAllAsync(SerialDeviceSearchVariable); //alle informatie van de gevonden devices is opgeslagen in de array poorten. 
           
            PortsListbox.Items.Clear(); //maak de listbox leeg

 

            // Return if no external devices are connected
            if (poorten.Count == 0)
            {
                PortsListbox.Items.Add("Er zijn geen apparaten gevonden");
                PortsListbox.IsEnabled = false;
                return;
            }

            // Else, add each connected input device to the list
            foreach (DeviceInformation deviceInfo in poorten)
            {
                PortsListbox.Items.Add(deviceInfo.Name); //plaats een item in de listbox, toon de naam van de seriële poort, bijvoorbeeld "USB to Serial COM13"
                PortsListbox.IsEnabled = true;
            }


        }

        private void PortsListbox_SelectionChanged(object sender, SelectionChangedEventArgs e) //deze functie heeft nog geen doel
        {

        }

        private void RefreshButton_Click(object sender, RoutedEventArgs e) //klikken op de refreshbutton 
        {
            ListAvailablePorts(); //voer deze functie uit
        }


    }

}

Oké, helaas kan ik zeggen dat ik nu wel de code begrijp maar het niet werkend gekregen.

Ook de apps in de windows store werken niet op mijn computer. Ik vrees dat er andere problemen zijn die ik niet begrijp.