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