Files

318 lines
11 KiB
VB.net
Raw Permalink Normal View History

2025-12-11 11:54:05 +08:00
Imports System.Threading
Imports Newtonsoft.Json
Public Class Form1
Public G_Dictionary As Dictionary(Of String, (Boolean, String, Integer, String, Color)
Public G_SerialPortli As Dictionary(Of String, CommuniNode)
Public G_msgqueue As Queue(Of (String, Color, String))
Public G_thread As Thread
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'设置页面标题为项目名称+版本号
Me.Text = Application.ProductName & " " & Application.ProductVersion
G_SerialPortli = New Dictionary(Of String, CommuniNode)()
G_msgqueue = New Queue(Of (String, Color, String))
loadSeting()
Initgrid()
G_thread = New Thread(AddressOf ThreadFun)
G_thread.Start()
End Sub
Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
saveSeting()
If Not IsNothing(G_thread) AndAlso G_thread.IsAlive Then
G_thread.Abort()
End If
End Sub
'加载Seting
Public Sub loadSeting()
'刷新内存
My.Settings.Reload()
If String.IsNullOrEmpty(My.Settings.SerialPortSettings) Then
G_Dictionary = New Dictionary(Of String, (Boolean, String, Integer, String, Color)
Else
G_Dictionary = JsonConvert.DeserializeObject(Of Dictionary(Of String, (Boolean, String, Integer, String, Color))(My.Settings.SerialPortSettings)
End If
End Sub
Public Sub saveSeting()
My.Settings.SerialPortSettings = JsonConvert.SerializeObject(G_Dictionary)
End Sub
Delegate Sub Deleg_ThreadFun(msg As (String, Color, String))
Private Sub ThreadFun()
Dim msg As (String, Color, String)
While True
If G_msgqueue.Count > 0 Then
msg = G_msgqueue.Dequeue()
AddMsgToGrid(msg)
End If
Thread.Sleep(10)
End While
End Sub
Public Sub AddMsgToGrid(msg As (String, Color, String))
Dim ts1, ts2, ts3 As String
Dim t1, t2, t3 As DateTime
Dim tc1, tc2 As Integer
Dim buf() As String
If Grid1.InvokeRequired Then
Dim d As New Deleg_ThreadFun(AddressOf AddMsgToGrid)
Grid1.Invoke(d, msg)
Else
'从表格末尾开始遍历但是不遍历第0行
For i As Integer = Grid1.Rows - 1 To 1 Step -1
If i = Grid1.Rows - 1 Then
ts2 = Grid1.Cell(i, 2).Text
't2 = DateTime.Parse(ts2)
DateTime.TryParseExact(ts2, "yyyy-MM-dd HH:mm:ss:fff",
System.Globalization.CultureInfo.InvariantCulture,
Globalization.DateTimeStyles.None, t2)
End If
If msg.Item1.Equals(Grid1.Cell(i, 5).Text) Then
ts1 = Grid1.Cell(i, 2).Text
't1 = DateTime.Parse(ts1)
DateTime.TryParseExact(ts1, "yyyy-MM-dd HH:mm:ss:fff",
System.Globalization.CultureInfo.InvariantCulture,
Globalization.DateTimeStyles.None, t1)
Exit For
End If
Next
buf = msg.Item3.Split("_")
ts3 = buf(0)
DateTime.TryParseExact(ts3, "yyyy-MM-dd HH:mm:ss:fff",
System.Globalization.CultureInfo.InvariantCulture,
Globalization.DateTimeStyles.None, t3)
If IsNothing(t1) Then
tc1 = 0
Else
Try
tc1 = (t3 - t1).TotalMilliseconds
Catch ex As Exception
tc1 = 65535
End Try
End If
If IsNothing(t2) Then
tc2 = 0
Else
Try
tc2 = (t3 - t2).TotalMilliseconds
Catch ex As Exception
tc2 = 65535
End Try
End If
Grid1.AddItem("")
Grid1.Cell(Grid1.Rows - 1, 0).Text = Grid1.Rows - 1
'Grid1.Cell(Grid1.Rows - 1, 1).Text = ts3
Grid1.Cell(Grid1.Rows - 1, 2).Text = ts3
Grid1.Cell(Grid1.Rows - 1, 3).Text = tc1
Grid1.Cell(Grid1.Rows - 1, 4).Text = tc2
Grid1.Cell(Grid1.Rows - 1, 5).Text = msg.Item1
Grid1.Cell(Grid1.Rows - 1, 6).Text = msg.Item3.Replace(ts3 & "_", "").Length
Grid1.Cell(Grid1.Rows - 1, 7).Text = msg.Item3.Replace(ts3 & "_", "")
Grid1.Cell(Grid1.Rows - 1, 8).Text = publicMode.StringToHexString(msg.Item3.Replace(ts3 & "_", ""))
Grid1.Range(Grid1.Rows - 1, 0, Grid1.Rows - 1, 8).WrapText = True
Grid1.Range(Grid1.Rows - 1, 0, Grid1.Rows - 1, 8).ForeColor = msg.Item2
Grid1.Cell(Grid1.Rows - 1, 0).SetFocus()
End If
End Sub
Public Sub Initgrid()
With Grid1
.NewFile()
.Cols = 9
.Rows = 1
.ExtendLastCol = True
.DisplayRowNumber = True
.Cell(0, 0).Text = "序号"
.Cell(0, 1).Text = "选择"
.Cell(0, 2).Text = "时间"
.Cell(0, 3).Text = "同串口时间差"
.Cell(0, 4).Text = "时间差"
.Cell(0, 5).Text = "串口名称"
.Cell(0, 6).Text = "包长"
.Cell(0, 7).Text = "TEXT"
.Cell(0, 8).Text = "HEX"
.Column(0).Width = 50
.Column(1).Width = 20
.Column(1).CellType = FlexCell.CellTypeEnum.CheckBox
.Column(2).Width = 150
.Column(3).Width = 50
.Column(4).Width = 50
.Column(5).Width = 100
.Column(6).Width = 50
.Column(7).Width = 300
.Column(8).Width = 300
.Column(6).Alignment = FlexCell.AlignmentEnum.CenterCenter
.Column(2).Alignment = FlexCell.AlignmentEnum.CenterCenter
.Column(3).Alignment = FlexCell.AlignmentEnum.CenterCenter
.Column(4).Alignment = FlexCell.AlignmentEnum.CenterCenter
.Column(5).Alignment = FlexCell.AlignmentEnum.CenterCenter
.Column(6).Alignment = FlexCell.AlignmentEnum.CenterCenter
.Column(7).Alignment = FlexCell.AlignmentEnum.CenterCenter
.Column(8).Alignment = FlexCell.AlignmentEnum.CenterCenter
.HighLightMode = FlexCell.HighLightModeEnum.Both
End With
End Sub
Private Sub ToolStripButton2_Click(sender As Object, e As EventArgs) Handles ToolStripButton2.Click
'创建设串口页面
Dim form2 As New SetingSerialPort
form2.G_Dictionary = G_Dictionary
form2.ShowDialog()
'判断是否确定关闭
If form2.DialogResult = DialogResult.OK Then
G_Dictionary = form2.G_Dictionary
End If
End Sub
Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs) Handles ToolStripButton1.Click
If ToolStripButton1.Text.Equals("打开") Then
ToolStripButton1.Text = "关闭"
ToolStripButton2.Enabled = False
Dim nCommuniNode As CommuniNode
'遍历G_Dictionary
For Each item In G_Dictionary
If item.Value.Item1 Then
nCommuniNode = New CommuniNode(item.Value.Item2, item.Value.Item3, item.Value.Item4, item.Value.Item5, G_msgqueue)
G_SerialPortli.Add(item.Value.Item4, nCommuniNode)
nCommuniNode.SetSerialPortOpen(True)
End If
Next
Button2.Text = "停止接收"
Button2.BackColor = Color.Red
SetReadFlag(True)
Else
ToolStripButton1.Text = "打开"
ToolStripButton2.Enabled = True
For Each item In G_SerialPortli
item.Value.SetSerialPortOpen(False)
Next
Button2.Text = "开始接收"
Button2.BackColor = Color.Green
SetReadFlag(False)
G_SerialPortli.Clear()
ComboBox1.Items.Clear()
ComboBox1.Text = ""
End If
End Sub
Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
If IsNothing(G_SerialPortli) OrElse G_SerialPortli.Count = 0 Then Return
For Each item In G_SerialPortli
item.Value.SetShowHex(CheckBox1.Checked)
Next
End Sub
Private Sub CheckBox2_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox2.CheckedChanged
If IsNothing(G_SerialPortli) OrElse G_SerialPortli.Count = 0 Then Return
For Each item In G_SerialPortli
item.Value.SetSendHex(CheckBox2.Checked)
Next
End Sub
Private Sub ComboBox1_DropDown(sender As Object, e As EventArgs) Handles ComboBox1.DropDown
ComboBox1.Items.Clear()
If IsNothing(G_SerialPortli) OrElse G_SerialPortli.Count = 0 Then Return
For Each item In G_SerialPortli
ComboBox1.Items.Add(item.Value.G_aliasname)
Next
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If IsNothing(G_SerialPortli) OrElse G_SerialPortli.Count = 0 Then Return
For Each item In G_SerialPortli
If ComboBox1.Text.Equals(item.Value.G_aliasname) Then
item.Value.SendData(TextBox1.Text.Trim)
Return
End If
Next
End Sub
Private Sub ToolStripButton3_Click(sender As Object, e As EventArgs) Handles ToolStripButton3.Click
Grid1.Rows = 1
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
If Button2.Text.Equals("停止接收") Then
Button2.Text = "开始接收"
Button2.BackColor = Color.Green
SetReadFlag(False)
Else
Button2.Text = "停止接收"
Button2.BackColor = Color.Red
SetReadFlag(True)
End If
End Sub
Public Sub SetReadFlag(ByVal flag As Boolean)
If IsNothing(G_SerialPortli) OrElse G_SerialPortli.Count = 0 Then Return
For Each item In G_SerialPortli
item.Value.SetReadFlag(flag)
Next
End Sub
Private Sub CheckBox3_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox3.CheckedChanged, CheckBox9.CheckedChanged, CheckBox8.CheckedChanged, CheckBox7.CheckedChanged, CheckBox6.CheckedChanged, CheckBox5.CheckedChanged, CheckBox4.CheckedChanged
Dim chBox As CheckBox = sender
'判断是否选中
'取到tag
Dim tag As Integer = CIntchBox.Tag)
If chBox.Checked Then
Grid1.Column(tag).Visible = False
Else
Grid1.Column(tag).Visible = True
End If
End Sub
Private Sub Grid1_Click(Sender As Object, e As EventArgs) Handles Grid1.Click
'获取选中单元格
Dim C_x, C_y As Integer
C_x = Grid1.ActiveCell.Row
C_y = Grid1.ActiveCell.Col
'判断行》0
If C_x > 0 Then
'获取行号设置到Xlabel
Xlabel.Text = "RowID:" & Grid1.Cell(C_x, 0).Text
Ylabel.Text = "ColumnName:" & Grid1.Cell(0, C_y).Text
TextBox2.Text = Grid1.Cell(C_x, C_y).Text
End If
End Sub
End Class