Seriak ve VB 2017

Pavel Hudecek edizon na seznam.cz
Středa Červen 7 09:28:44 CEST 2017


Tak jsem to upravil takto:

Imports System.IO.Ports

Public Class Form1
    Shared sp1 As New SerialPort("COM4", 19200, Parity.None, 8, 
StopBits.One)
    Shared sp2 As New SerialPort("COM5", 19200, Parity.None, 8, 
StopBits.One)

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles 
Button1.Click
        'PortTest.Send()
        sp1.ReadTimeout = 500
        sp1.WriteTimeout = 500
        sp1.Open()

        sp1.WriteLine(Me.tb1.Text) 'tb1 je textbox

        sp1.Close()

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        'PortTest.startRd()
        sp2.ReadTimeout = 500
        sp2.WriteTimeout = 500
        AddHandler sp2.DataReceived, AddressOf Recv
        sp2.Open()
        Me.Label1.Text = "start"

    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

    Private Sub Form1_Disposed(sender As Object, e As EventArgs) Handles 
Me.Disposed
        sp2.Close()
    End Sub

End Class

Což se mi i líbí víc, jen jsem včera něco dělal špatně, že mi to nešlo dát 
do class Form1. A taky jsem nenašel form_load, i když jsem ho hledal:-)

V každém případě, opakované open vždy vyvolalo error a tady to žádné errory 
nedělalo.
Zavírání pokud se otevře jen jednou taky pro začátek nemá čemu vadit. Teď už 
tam pro jistotu je, ale výsledek je stále stejný: událost nikdy nenastane.

Těm vláknům zatím vůbec nerozumím a celkově mám s .net minimální zkušenosti. 
Zlatej VB98:-)

PH

-----Původní zpráva----- 
From: Ladislav Vaiz
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.

---------------------------
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č? 



Další informace o konferenci Hw-list