Seriak ve VB 2017

Ladislav Vaiz spam na nagano.cz
Středa Červen 7 07:39:36 CEST 2017


Dobrý den,
nevím, jestli je něco z toho ta hlavní příčina, ale na kódu se mi nelíbí:

1) Událost Form.Activated se vyvolává vícekrát, například při Alt+Tab. 
Na podobnou inicializaci je nejlepší Load. Já v C# používám "override 
OnLoad" místo události, při dědění mám definované pořadí volání obsluh.

2) Událost DataReceived je volána v jiném vlákně než ve kterém běží GUI. 
Očekával bych, že nastavení Label1.Text spadne. Doporučuju použít něco 
takového (v C#):
                         string indata = ...
                         Form1.Invoke((MethodInvoker)delegate
                         {
                             form1.Label.Text = indata;
                         });
Vlákno (celý SerialPort) je pak nutné ukončit před tím, než se ukončí 
fronta zpráv pro Form1, jinak se vlákno zasekne, port zůstane otevřený...

3) Je třeba důsledně zavírat SerialPort, nejlépe přes using. Pokud to 
třeba u příjemce nejde, tak volat Dispose ve Form1.Dispose.

Možná, že hlavní problém je 2), jen se vám výjimka nějak zamete pod koberec.

L.


Dne 7.6.2017 v 1:29 Pavel Hudecek napsal(a):
> Dobrý den všem,
>
> připojil jsem dva převodníky USB-sériák, propojil je a začal si hrát s 
> VB 2017:
>
> První pokus jsem rozchodil, ale ten neměl eventy a to se mi nelíbí.
>
> Našel jsem toto:
> https://msdn.microsoft.com/cs-cz/library/system.io.ports.serialport.datareceived(v=vs.110).aspx 
>
>
> A tam uvedenou ukázku upravil na:
>
> Imports System.IO.Ports
>
> Public Class Form1
>
>    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles 
> Button1.Click
>        PortTest.Send()
>    End Sub
>
>    Private Sub Form1_Activated(sender As Object, e As EventArgs) 
> Handles Me.Activated
>        PortTest.startRd()
>    End Sub
>
> End Class
>
> Public Class PortTest
>    Shared sp1 As New SerialPort("COM4", 19200, Parity.None, 8, 
> StopBits.One)
>    Shared sp2 As New SerialPort("COM5", 19200, Parity.None, 8, 
> StopBits.One)
>
>    Public Shared Sub startRd()
>        sp2.ReadTimeout = 500
>        sp2.WriteTimeout = 500
>        AddHandler sp2.DataReceived, AddressOf Recv
>        sp2.Open()
>        Form1.Label1.Text = "start"
>
>    End Sub
>
>    Public Shared Sub Send()
>        sp1.ReadTimeout = 500
>        sp1.WriteTimeout = 500
>        sp1.Open()
>
>        sp1.WriteLine(Form1.tb1.Text) 'tb1 je textbox
>
>        sp1.Close()
>    End Sub
>
>    Private Shared Sub Recv(sender As Object, e As 
> SerialDataReceivedEventArgs)
>        Form1.Label1.Text = "recv"
>        Dim indata As String = sp2.ReadExisting()
>        Form1.Label1.Text = indata
>    End Sub
> End Class
>
> Po spuštění se label nastaví na "start", po stisku buttonu blikají 
> LEDky na obou převodnících, ale label se nemění, takže event vůbec 
> nenastává. Poradí někdo, proč?
>
> Díky,
> PH
> _



Další informace o konferenci Hw-list