C# Vraagje

Vragen die je boven niet kwijt kunt, kan je hier stellen.

Moderator: Moderators

Plaats reactie
hfjbuis
Donateur
Berichten: 3058
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: VB Vraagje

Bericht door hfjbuis »

Even iets anders,

Ik zie dat je een "Windows Form Applicatie" aan het maken bent (klassiek windows programma). Mocht je dit ooit, zonder veel gedoe, via de "Microsoft Store" willen verkopen, dan kun je beter een UWP applicatie maken, daar is de "winkel" op ingericht.
Mocht je dat overwegen, reken er op dat het heel veel tijd kost om dat "UWP" te "leren". Is het alleen voor jezelf, vergeet het hele UWP gebeuren, niets dan gelazer. :mrgreen:
There are only 2 limits, the sky and your imagination
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13373
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: VB Vraagje

Bericht door Arie Kabaalstra »

ach.. verkopen.. hoeveel mensen blijven met de TM02 besturing werken?..
Aan de andere kant.. een handige programmeer applicatie kan er wel voor zorgen dat je niet zo nodig naar een nieuwe besturing hoeft over te stappen..

Er zijn wel wat belangstellenden in een EMCO Facebookgroep, ik bouw het eigenlijk vooral voor mezelf.. en als er mensen zijn die 't ook willen hebben.. dan kan ik 'm ook op een eigen pagina aanbieden, met een PayPal knopje ernaast..
QCad is ook een veel gebruikt programma.. hebben ook hun eigen shop..

Ik denk overigens dat het toevoegen van die NuGet Packages System.IO en System.IO.Ports ook het euvel waren in de VB Applicatie
Daar heb ik ze ook toegevoegd, en ik ben daar nu ook van de gevreesde rode lijntjes af.. al krijg ik nog geen bitje door de draad.. maar dat is een kwestie van even zoeken naar de juiste manier om de poort open te zetten..

Gevonden.. Parity Even.. da's :

Code: Selecteer alles

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        EMCOmport = New SerialPort()
        With EMCOmport
            .PortName = "Com1"
            .BaudRate = 2400
            .Parity = 2
            .StopBits = 1
            .DataBits = 7
            EMCOmport.Open()
        End With
nu nog even uitvlooien hoe we de bitjes over de draad van de andere machine hier binnen kunnen halen.. daarvoor moet ik een "Event" maken zodat ie in de gaten houdt of er aan de andere kant op de seinsleutel geramd wordt..
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13373
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: VB Vraagje

Bericht door Arie Kabaalstra »

Code: Selecteer alles

Imports System
Imports System.Threading
Imports System.IO
Imports System.IO.Ports
Imports System.IO.Ports.SerialPort


Public Class Form1
    Dim EMCOmport As SerialPort
    Dim EMCOmport_DataReceived As String

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Try
            EMCOmport = New SerialPort()
            With EMCOmport
                .PortName = "Com1"
                .BaudRate = 2400
                .Parity = 2
                .StopBits = 1
                .DataBits = 7
                EMCOmport.Open()
            End With
        Catch
        End Try

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        EMCOmport.Write(TextBox1.Text)
    End Sub

End Class
Dit is wat ik nu werkend heb.. na het indrukken van Button1 rost ie de hele inhoud van de textbox door de draad naar het ontvangende apparaat.. dat werkt..

echter.. het binnenhalen van de data.. 'k wil het zo hebben dat de Applicatie reageert op wat er binnenkomt, en dat in één keer in de textbox mietert..

Daarvoor moet ik blijkvaar een "Event" maken.. maar dat is me tot dusver niet gelukt..
hfjbuis
Donateur
Berichten: 3058
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: VB Vraagje

Bericht door hfjbuis »

Arie Kabaalstra schreef: 14 feb 2022 18:23 echter.. het binnenhalen van de data.. 'k wil het zo hebben dat de Applicatie reageert op wat er binnenkomt, en dat in één keer in de textbox mietert..
En hoe weet de event wanneer hij dat moet doen, na het ontvangen een karakter, meerdere karakters, na bepaalde tijd!

Ik heb alleen UWP applicaties met serial com. Onder de streep, is dat grotendeels hetzelfde. Ik zal morgen even kijken of ik snel iets in elkaar kan fabrieken.
There are only 2 limits, the sky and your imagination
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13373
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: VB Vraagje

Bericht door Arie Kabaalstra »

een Applicatie reageert op diverse events.. ButtonClicks, Keydowns, SelectionChanged, Focus to name but a few..
'k heb ook wel voorbeelden gezien van een SerialPort.DataReceived event.. maar hoe? of.. hoe haal ik de data daaruit naar een Textbox?.. Want..

Code: Selecteer alles

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Try
            EMCOmport = New SerialPort()
            With EMCOmport
                .PortName = "Com1"
                .BaudRate = 2400
                .Parity = 2
                .StopBits = 1
                .DataBits = 7
                AddHandler .DataReceived, AddressOf DataReceivedhandler
            End With
            EMCOmport.Open()
        Catch
        End Try

    End Sub
Ik heb hier zo'n EventHandler in mijn Code, en in :

Code: Selecteer alles

Private Sub DataReceivedHandler(sender As Object, e As SerialDataReceivedEventArgs)
        EMCOmport.ReadTimeout = 100

        Try
            Do
                Dim incoming As String = EMCOmport.ReadExisting
                If incoming Is Nothing Then
                    Exit Do
                Else
                    incoming = EMCOmport.ReadExisting + Environment.NewLine
                    TextBox1.Text = TextBox1.Text + incoming
                End If
            Loop
        Catch ex As TimeoutException
        Finally
        End Try

    End Sub
gebeurt er als er wat over de draad komt .. want dan krijg ik de volgende melding:

System.InvalidOperationException: 'Cross-thread operation not valid: Control 'TextBox1' accessed from a thread other than the thread it was created on.'

Blijkbaar mag ik wat er binnenkomt niet zomaar in een Textbox gooien..
hfjbuis
Donateur
Berichten: 3058
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: VB Vraagje

Bericht door hfjbuis »

Blijkbaar mag ik wat er binnenkomt niet zomaar in een Textbox gooien..
Inderdaad, dat mag niet. Welkom in de wereld van multi threading.

Je hebt een thread op de achtergrond, die probeert om een GUI control te benaderen die in een andere thread geserviced wordt, de GUI thread. Dat mag niet.

Je kunt de inhoud van de textbox linken aan een variabel. Beide threads mogen wel deze variable aanpassen.
Deze variable moet de GUI signaleren dat wat gewijzigd is. In UWP declareer ik dat zo:

Code: Selecteer alles

namespace TestNameSpace
{
    using System;
    using System.ComponentModel;
    using System.Runtime.CompilerServices;

    public class PropertyChangedBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)//Attention: usually: protected void
        {
            var eventHandler = this.PropertyChanged;
            if (eventHandler != null)
                eventHandler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

   public class TestData : PropertyChangedBase
    {
        private String _ID = "ID";
        public String ID { get { return _ID; } set { _ID = value; OnPropertyChanged(); } }
     }
 }
De aanroep OnPropertyChanged() signaleert de GUI dat er wat gewijzigd is.
There are only 2 limits, the sky and your imagination
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13373
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: VB Vraagje

Bericht door Arie Kabaalstra »

Moet je daar een hele nieuwe namespace voor aanmaken?..
hfjbuis
Donateur
Berichten: 3058
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: VB Vraagje

Bericht door hfjbuis »

Nee, is niet echt nodig.
Zelf zet ik alle bibliotheken in een eigen namespace. Dat is gemakkelijker met zoeken want bibliotheken kunnen erg uitgebreid raken.
There are only 2 limits, the sky and your imagination
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13373
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: VB Vraagje

Bericht door Arie Kabaalstra »

Hoe dan ook.. Namespaces, Classes, Bibliotheken..om eerlijk te zijn.. geen idee wat het zijn, wat het doet.. hoe het werkt..

Dit is ook weer zo'n stukje code waarvan je denkt .. 't zou toch niet zo moeilijk moeten zijn, en er zijn toch legio mensen geweest die een applicatie hebben gebouwd om inkomende data in een Textbox te gooien?...
hfjbuis
Donateur
Berichten: 3058
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: VB Vraagje

Bericht door hfjbuis »

Een bibliotheek is een verzameling van namespaces
Een name space is een verzameling van classes, enums, defines, etc

Je kunt

Code: Selecteer alles

Task.Delay(10)
gebruiken omdat je

Code: Selecteer alles

 using System.Threading.Tasks;
hebt gezet aan het begin van het programma.
Zonder deze regel zou je voluit moeten schrijven:

Code: Selecteer alles

System.Threading.Tasks.Task.Delay(10)
;
Dat is veel extra type werk en je moet onthouden wat in welke namespace zit.
There are only 2 limits, the sky and your imagination
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13373
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: VB Vraagje

Bericht door Arie Kabaalstra »

Stukje bij beetje kom ik wel wat verder.. maar..werken doet het nog niet..

Code: Selecteer alles

Private Sub DataReceivedHandler(sender As Object, e As SerialDataReceivedEventArgs)
        ReceiveSerialData()
        TextBox1.Text = TextBox1.Text + "incoming"
    End Sub
ik heb inmiddels een EventHandler die reageert zodra er vanaf het andere apparaat wat over de schutting gesmeten wordt.
Daar heb ik een Msgbox in gegooid die roept dat er wat over de schutting komt.. da's voor mij een bevestiging dat er een bepaald deel wordt aangeroepen..

Dit Deel..

Code: Selecteer alles

Function ReceiveSerialData() As String

        MsgBox("Er komt wat over de schutting!!")
        ' Dim Emcomport As IO.Ports.SerialPort = Nothing
        Try
            'com1 = My.Computer.Ports.OpenSerialPort("COM1")
            'com1.ReadTimeout = 10000
            Do
                incoming = EMCOmport.ReadLine()
                If Incoming Is Nothing Then
                    Exit Do
                Else
                    incoming &= EMCOmport.ReadLine & vbCrLf
                    MsgBox(incoming)

                End If
            Loop
        Catch ex As TimeoutException
            incoming = "Error: Serial Port read timed out."
        Finally
            If Emcomport IsNot Nothing Then Emcomport.Close()
        End Try

        Return incoming
    End Function

Je zou dan toch verwachten dat ie de Returnstring Incoming in het textboxje kiepert.. maar dat doet ie niet

of denk ik nou helemaal de verkeerde kant uit, en doe ik veel te moeilijk?
hfjbuis
Donateur
Berichten: 3058
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: VB Vraagje

Bericht door hfjbuis »

Je probeert te veel tegelijk

Je moet data ontvangen
je moet data laten zien
Je detecteren dat het ontvangen klaar is
je moet de ontvangen data verwerken


Ik zou beginnen met elk karakter dat ontvangen wordt laten zien in de textbox.
Dan zie je
- of wat ontvangen wordt
- wanneer er wat ontvangen wordt (als je ergens op een knop drukt) en ook dat er niets ontvangen wordt als je nergens op drukt
- wat er ontvangen wordt, of dit is wat je verwacht
- of er rare data in staat, storingen of "verkeerde verwachting"

Vervolgens laat je alles zien totdat je detecteert dat je het einde ontvangen hebt.
Dan voeg je aan de ontvangen data de text "einde ontvangst" toe
Ondertussen blijf je ontvangen data toevoegen.

Als het goed is, komt er niets meer en is "einde ontvangst" de laatste.

Vervolgens verwerk je de ontvangen data.

Stap voor stap leren lopen...

Je kunt een breakpoint zetten op de regel:

Code: Selecteer alles

If Incoming Is Nothing Then
Dan kun je zien wat er in Incoming staat.

Maar beginnen bij het begin
There are only 2 limits, the sky and your imagination
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13373
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: VB Vraagje

Bericht door Arie Kabaalstra »

Ik krijg al geen karakters in die textbox..

Maar goed.. wat ik eerder deze week al overwoog.. C#..
Ik heb de communicatie in een C# Example werkend, ik ben een nieuw project gestart eerder deze week.. kleurtjes aangepast.. Textboxje erin.. code uit de Example overgezet.. de juiste Nuget Packages gedownload zoals je al aangegeven had. Knopje om te verzenden.. dat werkte allemaal.. maar ik kreeg mijn KeyDown event niet werkend.. tot ik me eerder vanavond realiseerde dat ik bij de Form1_load de KeyPreview niet op True had gezet.. dat nu wel gedaan.. en als ik nu op F12 druk, gooit ie de code over de schutting..

Ik heb als test al een paar keer een NC bestand van 1280 regels over en weer getennist..dus dat werkt.. Nu dus de code "opnetteren"
De verzendcode staat nu in een aparte sub (Void), zodat ik die kan benaderen vanaf een Button_Click Event, of een KeyDown_Event.
Ik ken gewoon een waarde toe aan een "KeyVariabele"

Code: Selecteer alles

 private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            e.Handled = true;
                  if (e.KeyData == Keys.F12)
            {
                textBox2.Text = " Sending...";
                SendString();
                textBox2.Text = "";
            }
        }

         void SendString()
        {
            try
            {
                if (!_serialPort.IsOpen)
                _serialPort.Open();
                _serialPort.Write(textBox1.Text);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
            }
        }
Dit is wat ik er nu in heb staan.. zodra ik F12 indruk, verschijnt in Textbox2 de tekst "Sending" en zodra het laatste bitje over de schutting is, verdwijnt die tekst weer.. niet dat het wat doet.. maar zo zie je dat ie bezig is..

in de KeyDown Event moet ik dus de KeyCode Fetchen, en dan beslissen naar welke void ik ga verwijzen... beetje net zoals ik in de VB Applicatie deed..en in mijn eigen Macro in EdingCNC, waar ik op grond van de waarde van #1100 bepaal welke cyclus uitgevoerd moet worden.

Volgende stappen: Toevoegen van 12 Buttons die de Functietoetsen vertegenwoordigen, daar een Button_Click Event aan hangen, en dan een waarde aan een Parameter meegeven om dan naar de juiste void te verwijzen.

Verder moeten er dan nog een DataGridview in gezet worden, die ik dan kan vullen met dialogen.. veel verschil met VB.NET zat dat niet maken..
EMCOturn 120 .jpg
Tot zover werkt alles gewoon, en zo voldoet het ook aan mijn "basis eisen" voor het verzenden en ontvangen van Code..
nog toe te voegen, een FileOpen Dialoog en een FileSave Dialoog, een routine om de inhoud van die Textbox naar een textfile weg te schrijven, en iets om een textfile in die Textbox te smijten zal er ook wel zijn..
Je hebt niet voldoende permissies om de bijlagen van dit bericht te bekijken.
hfjbuis
Donateur
Berichten: 3058
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: VB Vraagje

Bericht door hfjbuis »

Zelfs naar 40+ jaar is het vaak zoeken waarom iets niet werkt. Of het nu eenvoudig of complex is, het kost vaak veel tijd. Als ik het na een half uur nog steeds niet heb gevonden, ga ik wat anders doen.
Bij mij helpt fietsen, dan heb ik geen andere prikkels meer die afleiden. Vaak ben ik nog niet van de oprit af, dan valt het kwartje.

Naar de code blijven staren helpt niet bij mij.

Een 2e belangrijk ding is het gebruik van een software versie beheer. Daarmee kun je gemakkelijk terug naar een laatst werkende versie en de verschillen zien. Vaak rommel je op zoveel plekken in de code om een probleem op te lossen dat je dat niet meer kunt herstellen zonder hulp.

Git kan je daarbij helpen (Is ingebouwd in VS2019). Nadat je het probleem hebt gevonden is het een kwestie van de laatste versie terug zetten en de aanpassingen nog een maken. Git leren kost ook veel tijd maar dat verdien je er dubbel en dwars mee terug.
In VS2019 gebruik ik zelf sourcesafe omdat daar mijn hele history in zit. Even overstappen naar Git zit er voor mij niet in.
There are only 2 limits, the sky and your imagination
Plaats reactie