Re: programování

Pavel Hudecek edizon na seznam.cz
Středa Červenec 25 19:32:20 CEST 2018


Ještě přidám ukázku ve VB, kdy jsem si hrál s nějakým čidlem CO2 a zároveň se chtěl naučit pracovat se sériákem přes události. Má to listbox s výběrem portů a indikací, zda jsou open/closed, zobrazuje obsah paketů a nakonec snad (nepamatuju si jistě, čidlo je zahrabané někde hluboko a podrobně zkoumat se mi to taky nechce) i výsledné hodnoty:

odkazuje se na objekty vložené v okně:
Form1, Me: Okno programu
tb1: textbox s hex textem, který to pak binárně posílá
tb2: textbox s výsledky
Button1: tlačítko
lb1: listbox se seznamem portů
timer1: timer, který pravidelně generuje událost (a není graficky viditelný)

“úchylárny” z .NET:
Me.Invoke...
- to je důsledek multithreadingu, ve starém VS stačilo prostě provést patřičnou věc a ono to rovnou fungovalo. Tady za určitých okolností nemůže obsluha události z jednoho objektu pracovat s jiným objektem.
Try/Catch:
- Zkusit, zda to půjde, nebo ne (např. port nejde otevřít, když ho už otevřelo něco jiného)

Imports System.IO.Ports 

Public Class Form1

    'tady se vytvoří instance sériáku, původně jsem měl sp1 a sp2, pak jsem sp1 zrušil
    Shared sp2 As New SerialPort("COM5", 9600, Parity.None, 8, StopBits.One) 

    'bin>hex Conversion.Hex (Byte) 'hex>bin Convert.ToInt32("c001", 16) 
    Private Function hexbin(h As String, n As Int32) As Byte
        Dim t 
        t = Mid(Me.tb1.Text, n + 1, 2) hexbin = Convert.ToInt32(t, 16)
    End Function 


    'tohle je obsluha stisku tlačítka
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim n As Int32
        Dim t As String
        Dim c
        Dim buf(100) As Byte 

        For n = 0 To Len(Me.tb1.Text) - 1 Step 3
            t = Mid(Me.tb1.Text, n + 1, 2) 
            c = Convert.ToInt32(t, 16) buf(n / 3) = c
       Next n
        recvInd = 0
        sp2.Write(buf, 0, n / 3) 
    End Sub 

    'tohle se děje při spuštění programu, resp. nahrání okna
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        sp2.ReadTimeout = 500
        sp2.WriteTimeout = 500
        AddHandler sp2.DataReceived, AddressOf Recv
    End Sub 

    Dim recvInd As Int32 = 0 Dim indata(256) As Byte 

    'událost, která nastane, když přijdou data
    Private Sub Recv(sender As Object, e As SerialDataReceivedEventArgs)
        Dim txt
        Dim ld

        ld = sp2.BytesToRead
        If ld > 0 Then sp2.Read(indata, recvInd, 20)
        recvInd = recvInd + ld
        If recvInd = 9 Then
            For n = 0 To recvInd – 1
                If indata(n) < 16 Then txt = txt + "0"
                txt = txt + Conversion.Hex(indata(n)) + " "
            Next n
            txt = txt + " " + Format(indata(2) * 256 + indata(3), "0") + vbCrLf
        ElseIf recvInd > 9 Then
            recvInd = 0
            txt = txt + " *" + vbCrLf
        Else
            txt = txt + " *"& recvInd & vbCrLf
        End If 
        Me.Invoke(DirectCast( 
                            Sub() 
                                If tb2.Text = "start" Then tb2.Text = ""
                                tb2.Text = tb2.Text + txt
                            End Sub,
        MethodInvoker))
    End Sub

    'ukončení programu, resp. zrušení okna
    Private Sub Form1_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
        Try
            sp2.Close()
        Catch ex As Exception 
        End Try
    End Sub 

    'timer: událost nastává v pravidelných intervalech nastavených ve vlastnostech timeru
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Dim port As String Dim ports As String() = SerialPort.GetPortNames()
        Dim sp3 As New SerialPort 

        lb1.Items.Clear()
        For Each port In ports
            sp3.PortName = port
            Try
                sp3.Open()
                port = port + " cl"
                sp3.Close()
            Catch ex As Exception
                port = port + " op"
            End Try
            lb1.Items.Add(port)
        Next port
        sp3.Dispose()
    End Sub 

    'listbox při změně vybraného prvku
    Private Sub lb1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lb1.SelectedIndexChanged
        Dim t, n

        n = Me.lb1.SelectedIndex
        t = Me.lb1.Items(n).ToString
        sp2.PortName = Mid(t, 1, Len(t) - 3) 

        sp2.Open()
        Me.tb2.Text = "start"
        Me.Button1.Enabled = 1
        Me.lb1.Enabled = 0
    End Sub

End Class 

(Když vytvoříte program ve VB, do okna naházíte výšeuvedené objekty, timeru nastavíte pár stovek ms a Enabled, pak na něco v okně doubleclicknete, aby se vyvolala editace události, dáte ctrl+A, pak ctrl+V s výšeudedeným programem a pak stisknete “play”, mělo by to komunikovat s MH-Z19 připojeném na USB/232.)

PH

From: Pavel Hudecek 
Sent: Wednesday, July 25, 2018 6:15 PM
To: HW-news 
Subject: Re: programování

Když znáte C, tak na PC programujte taky v C.

V MS Visual Studiu je C, C#, Visual basic a ještě něco. Je legálně zdarma a program pak bude normálně chodit i ve Win10.

Další možnost je placený Borland C Builder, resp. jeho nástupce Embarcadero Rad Studio. A stejný výrobce má i Delphi, tedy moderní Pascal. To Rad Studio bývá občas v akci zdarma. Pak taky Lazarus, ale s tím nemám zkušenosti.

Je fakt, že v tom novém Visual Studiu, je to složitější (než 6.0/98), ale není to zas tak hrozné. Pokud se obejdete bez událostí, tak je to triviální (něco jako putchar/getchar), ale já mám radši události, tak jsem se musel složitostmi .NET prokousat (ve VB). Mimo jiné i s pomocí některých zdejších členů.

Oproti MCU máte z hlediska sériáku prakticky neomezené prostředky, na druhou stranu v cestě jsou buffery, které nemáte jednoduchým způsobem pod kontrolou, takže např. nejde nijak snadno přijít na to, která data přišla “v jednom kuse”. Program může kusy dostat libovolně rozkouskované i pospojované.

PH

From: Radek Koutský 
Měl bych dotaz, zdali má někdo zkušenost s programováním sériové komunikace (RS232) na PC, následně doporučení nějakého obyčejného IDE.
O co mi jde – sám programuji desítky let pouze jednočipy (tedy znám assembler, mirkoPascal a C) a na PC jsem programoval kdysi před 25ti lety v Pascalu - rozhodně vím, že jsem nikdy nic neprogramoval se sériovou linkou. Kolegové v práci dělají C# a to mi přijde už strašně moc složité – nějak se v tom ztrácím.

 

Chtěl bych si pro domácí bastlení udělat program, který by mi monitoroval co se děje na mé RS485 a vyhodnocoval bych si stavy a nějak graficky zobrazoval co se děje. Následně i ovládal přes nějaké rozhraní.

 

Uměl by mi někdo doporučit vhodné prostředí? Upřednostnil bych něco na základech Pascalu. A ocenil bych strašně moc i nějaký základní program s prací sériové linky, abych si dokázal udělat představu, jak se k tomu vlastně PC chová.
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20180725/0076cfd1/attachment-0001.html>


Další informace o konferenci Hw-list