C# Vraagje
Moderator: Moderators
Re: VB Vraagje
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.
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.
There are only 2 limits, the sky and your imagination
- Arie Kabaalstra
- Donateur
- Berichten: 13373
- Lid geworden op: 07 feb 2007 18:37
- Locatie: Bakhuuz'n
- Contacteer:
Re: VB Vraagje
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 :
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..
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
- Arie Kabaalstra
- Donateur
- Berichten: 13373
- Lid geworden op: 07 feb 2007 18:37
- Locatie: Bakhuuz'n
- Contacteer:
Re: VB Vraagje
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
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..
Re: VB Vraagje
En hoe weet de event wanneer hij dat moet doen, na het ontvangen een karakter, meerdere karakters, na bepaalde tijd!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..
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
- Arie Kabaalstra
- Donateur
- Berichten: 13373
- Lid geworden op: 07 feb 2007 18:37
- Locatie: Bakhuuz'n
- Contacteer:
Re: VB Vraagje
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..
Ik heb hier zo'n EventHandler in mijn Code, en in :
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..
'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
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
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..
Re: VB Vraagje
Inderdaad, dat mag niet. Welkom in de wereld van multi threading.Blijkbaar mag ik wat er binnenkomt niet zomaar in een Textbox gooien..
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(); } }
}
}
There are only 2 limits, the sky and your imagination
- Arie Kabaalstra
- Donateur
- Berichten: 13373
- Lid geworden op: 07 feb 2007 18:37
- Locatie: Bakhuuz'n
- Contacteer:
Re: VB Vraagje
Moet je daar een hele nieuwe namespace voor aanmaken?..
Re: VB Vraagje
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.
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
- Arie Kabaalstra
- Donateur
- Berichten: 13373
- Lid geworden op: 07 feb 2007 18:37
- Locatie: Bakhuuz'n
- Contacteer:
Re: VB Vraagje
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?...
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?...
Re: VB Vraagje
Een bibliotheek is een verzameling van namespaces
Een name space is een verzameling van classes, enums, defines, etc
Je kunt gebruiken omdat je hebt gezet aan het begin van het programma.
Zonder deze regel zou je voluit moeten schrijven:;
Dat is veel extra type werk en je moet onthouden wat in welke namespace zit.
Een name space is een verzameling van classes, enums, defines, etc
Je kunt
Code: Selecteer alles
Task.Delay(10)
Code: Selecteer alles
using System.Threading.Tasks;
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
- Arie Kabaalstra
- Donateur
- Berichten: 13373
- Lid geworden op: 07 feb 2007 18:37
- Locatie: Bakhuuz'n
- Contacteer:
Re: VB Vraagje
Stukje bij beetje kom ik wel wat verder.. maar..werken doet het nog niet..
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..
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?
Code: Selecteer alles
Private Sub DataReceivedHandler(sender As Object, e As SerialDataReceivedEventArgs)
ReceiveSerialData()
TextBox1.Text = TextBox1.Text + "incoming"
End Sub
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?
Re: VB Vraagje
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:
Dan kun je zien wat er in Incoming staat.
Maar beginnen bij het begin
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
Maar beginnen bij het begin
There are only 2 limits, the sky and your imagination
- Arie Kabaalstra
- Donateur
- Berichten: 13373
- Lid geworden op: 07 feb 2007 18:37
- Locatie: Bakhuuz'n
- Contacteer:
Re: VB Vraagje
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"
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..
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..
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!");
}
}
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..
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.
Re: VB Vraagje
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.
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