C# Vraagje

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

Moderator: Moderators

Plaats reactie
Arie Kabaalstra
Berichten: 11591
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: VB Vraagje

Bericht door Arie Kabaalstra »

Mijn projecten zijn nog niet dusdanig complex dat ik dat niet kan missen..
ik maak wel kopietjes van code die werkt in Notepad++, dan kan ik altijd stukken code weer terugzetten..

de basis, zoals gezegd werkt nu in C#, dus ga ik daar in verder.. DataGridviews zullen niet veel spannender zijn in C# dan in VB.NET.

Morgen eerst maar weer eens lekker de werkplaats in.. tijd om weer eens de frisse geur van Koelemulsie in de neus te hebben..
rverhag
Berichten: 74
Lid geworden op: 26 jul 2012 14:47
Locatie: Oost Souburg, Zeeland

Re: VB Vraagje

Bericht door rverhag »

Hoi Arie,

Nu je in C# verder gaat:

Mocht je nog een voorbeeld van de serialport in C# willen hebben dan is https://github.com/rverhag/SimpleGrblgui misschien iets voor je. Zie dan met name https://github.com/rverhag/SimpleGrblgu ... bl/Grbl.cs.

Is een projectje wat ik een jaar of 4 geleden heb gebouwd om Grbl aan te sturen, maar misschien heb je er wat aan voor jouw project.
Gebruikersavatar
Arie Kabaalstra
Berichten: 11591
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: VB Vraagje

Bericht door Arie Kabaalstra »

Zul je net zien... had ik me de haren uit het hoofd gesleurd omdat ik het ontvangen in VB.NET niet voor elkaar kreeg, en de KeyDown Events in C# niet..

Vind ik gisteren de oplossing voor de KeyDown in C#.. en denk ik.. 'k ga daar mee verder..

krijg ik vanmorgen via VBForums (Die reageren doorgaans niet zo snel)..

Code: Selecteer alles

Function ReceiveSerialData() As String
        Try
            Do
                incoming = EMCOmport.ReadLine()
                If incoming Is Nothing Then
                    Exit Do
                Else
                    incoming &= EMCOmport.ReadLine + Environment.NewLine
                    Me.Invoke(Sub() TextBox1.AppendText(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
en

Code: Selecteer alles

 Me.Invoke(Sub() TextBox1.AppendText(incoming))
Is dus eigenlijk Alles...

Wat ik nu nog heb.. , maar ik vermoed dat dat in het overdrachtsprotocol van de Psion kan zitten.. Ik krijg alles binnen per 2 regels.. en dan een lege regel..

nou staat er in mijn code: " incoming &= EMCOmport.ReadLine + Environment.NewLine".. maar da's maar 1 Newline.. als ik em weglaat.. krijg ik alles achter elkaar in mijn scherm.. Da's in de VB Applicatie..
in de C# Applicatie gooit ie er een extra CRLF in na elke regel.

Op zich geen ramp, eh.. ja wel.. want in de Textbox in de beide applicaties zijn ze niet zichtbaar.. en bij het versturen naar de machine kan dat wel problemen geven dat de helft niet aankomt.. of dat ie alleen de eerste regel doorstuurt..
Maar .. daar is vast wel een pasklare oplossing voor te verzinnen.. als ik ga verzenden, dan moet ik er wel gewoon 2 lege regels achterplakken.. maar dat kan ik dan wel weer doen met iets in de trant van "Textbox1.text=Textbox1.text+environment.newline+environment.newline"..
Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 10651
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

Re: VB Vraagje

Bericht door hugo stoutjesdijk »

Arie Kabaalstra schreef: 16 feb 2022 13:04 Maar .. daar is vast wel een pasklare oplossing voor te verzinnen.. als ik ga verzenden, dan moet ik er wel gewoon 2 lege regels achterplakken.. maar dat kan ik dan wel weer doen met iets in de trant van "Textbox1.text=Textbox1.text+environment.newline+environment.newline"..
Niet met pleisters de boel recht proberen te breien, (dat is net zo iets als je product opmeten en achteraf in de tekening alle maten in te vullen en +/- 0.01 er bij te zetten :lol: )en zoals je gemerkt hebt is er echt wel een juiste manier, die heb jij alleen nog niet gevonden.
Dat hele seriële communicatie stuk is nu eenmaal iets complexer dan het lijkt zodra je alles er uit wilt halen.

Ik vermoed dat er ergens iets met buffers leegmaken moet gebeuren om die laatste 2 regels ook mee te krijgen.
En die CRLF dingetjes zijn ook echt wel netjes op te lossen zoals het bedoeld is.

Probeer ook voor de zekerte even wat er gebeurt als je gaat zenden wanneer er geen kabel aangesloten is. Dan mag de boel niet over het tapijt lopen. (daar zorgt die handshake voor)
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
Gebruikersavatar
Arie Kabaalstra
Berichten: 11591
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: VB Vraagje

Bericht door Arie Kabaalstra »

Wat handshakes betreft..
ik weet nog niet eens hoe de EMCO dat doet.. over de communincatie staat er in de Manuals niet meer dan "7E1 2400 ASCII"

Ik heb die "Environment.Newline nu even "weggecomment", en lo and behold.. alles komt zo'n beetje achter elkaar te staan in het textboxje in de VB Applicatie.. maar als ik het kopiëer naar Notepad.. dan staat het er keurig zoals ik het hebben wil..

'k heb gevonden dat dit:

Code: Selecteer alles

 TextBox1.Lines = TextBox1.Lines.Where(Function(line) line <> String.Empty).ToArray()
de lege regels er wel uitvist..

Die heb ik nu onder een knopje zitten.. maar eigenlijk moet dat automagisch gebeuren..Alleen..eh..het lijkt erop dat de DataReceivedHandler niet eindigt.. want onder de oproep van ReceiveSerialData() heb ik een MsgBox staan, die een melding moet geven als ie klaar is.. maar die komt nooit op..
als ik dat voor elkaar heb, dan kan ik de routine oproepen om de lege regels eruit te halen.

OF!.. ik moet een manier vinden om de data meteen goed in de Textbox weer te geven.. maar hoe?
hfjbuis
Berichten: 2015
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: VB Vraagje

Bericht door hfjbuis »

onder de oproep van ReceiveSerialData() heb ik een MsgBox staan, die een melding moet geven als ie klaar is.. maar die komt nooit op..

Code: Selecteer alles

Do
                incoming = EMCOmport.ReadLine()
                If incoming Is Nothing Then
                    Exit Do
                Else
                    incoming &= EMCOmport.ReadLine + Environment.NewLine
                    Me.Invoke(Sub() TextBox1.AppendText(incoming))
                End If
            Loop
 
Als er geen data meer gestuurd wordt, komt er ook geen crlf meer. De applicatie blijft in de

Code: Selecteer alles

incoming = EMCOmport.ReadLine()
regel "hangen", want die leest tot dat er een crlf komt!
Zonder verandering geen verbetering. Soms is niets meer veranderen al een verbetering.
Gebruikersavatar
Arie Kabaalstra
Berichten: 11591
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: VB Vraagje

Bericht door Arie Kabaalstra »

Ja.. precies.. zoiets vermoedde ik al.. hoe "vang ik dat af"?
moet er dan iets van een Timeout in?..

Of.. want dat is eigenlijk het belangrijkste.. hoe krijg ik de code goed in een Textbox?..

Ik heb ook al overwogen om het programma in een DataGridview te gooien.. want dan heb je de Formatting van de code makkelijker voor elkaar.. Ik kan dan bij het verzenden de 2 spaties die er voor elke regel moeten staan, als je geen regelnummer hebt makkelijker invoegen.
Regelnummers zijn niet nodig, staan ze erin.. dan is dat prima, staan ze er niet in?.. is dat ook geen bezwaar.
Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 10651
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

Re: VB Vraagje

Bericht door hugo stoutjesdijk »

In plaats van readline kun je waarschijnlijk ook read character (gewoon read waarschijnlijk) doen. Dan kun je op elk gelezen character een aktie doen waar je zin in hebt.
Kun je die timer niet starten zodra je 1 character hebt ontvangen, elk character reset je die, en zodra die 2 seconden passeert ben je klaar.
Maar het kan ook zo zijn dat de EMCO een afsluitend character stuurt. M30 of M02 is officieel einde programma dus als de laatste regel M30 bevat ben je ook klaar.
Meeste besturingen sturen wel iets, misschien character 04 (end of file)
Maar daarna niets meer, dus dan moet je wel op character niveau werken. Maar als het 04 is, kun je in software misschien ook op eof testen.
Zijn vele wegen om een oplossing te vinden.
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
Gebruikersavatar
Arie Kabaalstra
Berichten: 11591
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: VB Vraagje

Bericht door Arie Kabaalstra »

de EMCO stuurt aan het eind 1 of 2 lege regels (2 CRLF's) na de M30
'k heb nu om te testen een DataGridview genomen om mijn programma in te smijten.. na elke Readline voegt ie een Row toe

Met ReadChar krijg ik voor de Regelnummers 78(van N) en dan het regelnummer.. en 37 voor het programma nummer.. dat zal dan wel de Ascii van % zijn


ReadExisting.. die moet het zijn.. nu krijg ik alles goed binnen..Ik heb de binnengekomen Code gekopiëerd en in NotePad++ geplakt, en daar de weergave van niet afdrukbare karakters aangezet.. Na %0042 (filenummer) staat een Space (rood puntje) en dan en CRLF, en onderaan het programma keurig een CRLF na het laatste blok, en een CRLF op de regel daaronder.. dus 2 lege regels..

Dus.. dat werkt.. en nu kan ik die Code in de VB Applicatie gaan mikken..
rverhag
Berichten: 74
Lid geworden op: 26 jul 2012 14:47
Locatie: Oost Souburg, Zeeland

Re: VB Vraagje

Bericht door rverhag »

Zoals Hugo al aangeeft kan je ook karakters 1 voor 1 lezen.

In de DataReceived handler van de serialport dan zoiets als:

Do While SerialPort.BytesToRead > 0
rx = SerialPort1.ReadByte
....

Zolang er nog bytes in de pipeline zitten=> lees iedere byte afzonderlijk (en bepaal wat je er mee wilt doen)
hfjbuis
Berichten: 2015
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: VB Vraagje

Bericht door hfjbuis »

Arie Kabaalstra schreef: 16 feb 2022 15:07 Of.. want dat is eigenlijk het belangrijkste.. hoe krijg ik de code goed in een Textbox?..

Code: Selecteer alles

String[] GrblControllerSettings = GrblConfigurations.Split("\r\n".ToCharArray()); //Read from controller
Zo lees ik een configuratie (GrblConfigurations is een string met regels die eindigen op crlf) en stop dat in een array.
Zonder verandering geen verbetering. Soms is niets meer veranderen al een verbetering.
Gebruikersavatar
Arie Kabaalstra
Berichten: 11591
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: VB Vraagje

Bericht door Arie Kabaalstra »

Met ReadExisting ben ik er..

Het Leuke is, dat het vergelijkbaar is nu, met bijvoorbeeld een programma als Coolterm, zodra ik nu op de Psion wat intik, staat het ook meteen op het PC scherm.

ofwel.. alles werkt zoals het zou moeten werken.. dus hoeven we daar vooralsnog niet meer aandacht aan te schenken.

Nu Alle data binnenkomt zoals ik het wil hebben.. hoef ik dat ook naderhand niet meer te "Formatten" door lege regels weg te halen.. 't enige "struikelblokje" is nu bij het verzenden als een programma geen regelnummers heeft, om 2 spaties toe te voegen..
't al dan niet automagisch weghalen van de regelnummers zou ook een mooie functie zijn.. maar daar kijken we later wel naar..
Gebruikersavatar
Arie Kabaalstra
Berichten: 11591
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: VB Vraagje

Bericht door Arie Kabaalstra »

toch nog een "glitch".. omdat de poort open blijft staan.. en de Applicatie constant aan het "luisteren" is.. blijft de applicatie hangen als je em af wilt sluiten.. dat hoort natuurlijk niet..

misschien toch maar de timer erin gooien om de poort te sluiten , 2 seconden nadat de laatste bitjes over de schutting gekomen zijn..
even kijken hoe ik dat in die Functie kan gooien..
Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 10651
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

Re: VB Vraagje

Bericht door hugo stoutjesdijk »

Ik zie het nut niet zo van dat openstaan, maar het lijkt me dat je ook in die afsluitprocedure die poort wel eerst kunt sluiten en daarna de applicatie.
Is allemaal te beheren.
Iets met On-close of zo??
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
Plaats reactie