Files

591 lines
21 KiB
VB.net
Raw Permalink Normal View History

2025-12-11 13:59:46 +08:00
Imports System.IO.Ports
Imports System.Text
Imports System.Threading
Imports SharedFunction
Public Class Form1
#Region "窗体加载"
'富文本打印变量
Public G_RichTextPrint As RichTextPrint
Public G_CommunicationProtocol As CommunicationProtocol
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Text = $"{Application.ProductName}_V{Application.ProductVersion}"
G_RichTextPrint = New RichTextPrint(RichTextBox1)
G_CommunicationProtocol = New CommunicationProtocol(G_RichTextPrint, SerialPort1)
G_CommunicationProtocol.AddControlDic(&H18, Label4)
G_CommunicationProtocol.AddControlDic(&H19, TextBox6)
recvBufferli = New List(Of Byte)()
End Sub
#End Region
#Region "串口事务"
Public isread As Boolean = False '串口关闭标志
Public isListen As Boolean = False '串口等待关闭标志
Private Sub Btn_OpenPort_Click(sender As Object, e As EventArgs) Handles Btn_OpenPort.Click
If Btn_OpenPort.Text = "关闭" Then
Btn_OpenPort.Text = "打开"
Btn_OpenPort.BackColor = Color.Transparent
Cbo_Port.Enabled = True
Cbo_Baud.Enabled = True
G_CommunicationProtocol.setIsFlowList(False)
G_CommunicationProtocol.ClearFlowNode(True)
SharedFunction.CloseSerial(SerialPort1, isread, isListen)
Else
Cbo_Port.Enabled = False
Cbo_Baud.Enabled = False
Btn_OpenPort.Text = "关闭"
Btn_OpenPort.BackColor = Color.OrangeRed
Dim vmbaud As Integer = 0
'判断端口号是否合法
If String.IsNullOrEmpty(Cbo_Port.Text) Then
MsgBox("请选择端口号!")
Btn_OpenPort_Click(Nothing, Nothing)
Return
End If
'判断波特率是否合法
If String.IsNullOrEmpty(Cbo_Baud.Text) OrElse Not Integer.TryParse(Cbo_Baud.Text, vmbaud) Then
MsgBox("请选择波特率!")
Btn_OpenPort_Click(Nothing, Nothing)
Return
End If
'打开串口
If SharedFunction.OpenSerial(SerialPort1, Cbo_Port.Text, vmbaud) Then
Else
MsgBox("串口打开失败!")
Btn_OpenPort_Click(Nothing, Nothing)
Return
End If
End If
End Sub
Private _recvBuffer(4095) As Byte
Public recvBufferli As List(Of Byte)
Public recvBufferliindex As Integer = 0
Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
If isread Then Return
isListen = True
Static bytes As Integer = 0
Dim sp As SerialPort = DirectCast(sender, SerialPort)
Try
Do
bytes = sp.BytesToRead
If bytes <= 0 Then Exit Sub
Dim buf(bytes - 1) As Byte
sp.Read(buf, 0, bytes)
recvBufferli.AddRange(buf)
Thread.Sleep(5)
Loop While sp.BytesToRead > 0
If recvBufferli.Count > 0 Then
Dim buf(recvBufferli.Count - 1) As Byte
Array.Copy(recvBufferli.ToArray, 0, buf, 0, buf.Length)
recvBufferli.Clear()
G_RichTextPrint.AddQueue(RichTextBox1, New RichTextNodeConfig($"RX:", Color.Green, New Font("宋体", 8), buf), 1)
G_CommunicationProtocol.ProcessRecvData(buf)
End If
isListen = False
Catch ex As Exception
isListen = False
'AppendTipText($"串口接收数据失败,原因:{ex.Message}", Color.Red)
G_RichTextPrint.AddQueue(RichTextBox1, New RichTextNodeConfig($"串口接收数据失败,原因:{ex.Message}", Color.Red), 1)
'RichTextPrint.OutputLogsToTheControl(m_Control, New RuningLogConfig($"串口接收数据失败,原因:{ex.Message}", Color.Red), 1)
End Try
End Sub
Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
Timer1.Enabled = False
If Not IsNothing(G_RichTextPrint) Then
G_RichTextPrint.Close()
End If
If SerialPort1.IsOpen Then
SharedFunction.CloseSerial(SerialPort1, isread, isListen)
End If
End Sub
Private Sub Cbo_Port_DropDown(sender As Object, e As EventArgs) Handles Cbo_Port.DropDown
Cbo_Port.Items.Clear()
Cbo_Port.Items.AddRange(SerialPort.GetPortNames())
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If G_CommunicationProtocol.getIsFlowList Then
MsgBox("正在通信中!")
Return
Else
G_CommunicationProtocol.ClearFlowNode()
G_CommunicationProtocol.setIsFlowList(True)
End If
Dim li As List(Of Byte) = New List(Of Byte)()
Dim OSDstr As String = TextBox1.Text
Dim OSDbuf As Byte() = Encoding.ASCII.GetBytes(OSDstr)
If IsNothing(OSDbuf) OrElse OSDbuf.Length = 0 Then
MsgBox("请输入正确的OSD内容")
Return
End If
li.Add(OSDbuf.Length)
li.AddRange(OSDbuf)
OSDbuf = NT_CAM.PackData(&HA0, li.ToArray)
Dim gSendNode As New SendNode(1)
gSendNode.SetSendData(OSDbuf)
G_CommunicationProtocol.AddFlowNode("设置OSD内容", gSendNode)
End Sub
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button7.Click, Button6.Click, Button5.Click, Button4.Click, Button3.Click, Button2.Click
If G_CommunicationProtocol.getIsFlowList Then
MsgBox("正在通信中!")
Return
Else
G_CommunicationProtocol.ClearFlowNode()
G_CommunicationProtocol.setIsFlowList(True)
End If
'获取当前按钮
Dim btn As Button = DirectCast(sender, Button)
'获取当前按钮的+Tag值
Dim ntag As Integer = CInt(btn.Tag)
Dim OSDbuf As Byte() = {ntag}
G_CommunicationProtocol.ClearFlowNode()
OSDbuf = NT_CAM.PackData(&HA1, OSDbuf)
Dim gSendNode As New SendNode(1)
G_CommunicationProtocol.setIsFlowList(True)
gSendNode.SetSendData(OSDbuf)
G_CommunicationProtocol.AddFlowNode("设置报警状态", gSendNode)
End Sub
Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click, Button8.Click
If G_CommunicationProtocol.getIsFlowList Then
MsgBox("正在通信中!")
Return
Else
G_CommunicationProtocol.ClearFlowNode()
G_CommunicationProtocol.setIsFlowList(True)
End If
'获取当前按钮
Dim btn As Button = DirectCast(sender, Button)
'获取当前按钮的+Tag值
Dim ntag As Integer = CInt(btn.Tag)
Dim nComb, mComb As Integer
'获取下拉框数值
If Integer.TryParse(ComboBox1.Text.Trim, nComb) = False Then
MsgBox("请输入正确的音乐序号!")
Return
End If
If Integer.TryParse(ComboBox3.Text.Trim, mComb) = False Then
MsgBox("请输入正确的音乐序号!")
Return
End If
Dim OSDbuf As Byte() = {mComb, nComb, 0, 1} '{ntag, nComb}
G_CommunicationProtocol.ClearFlowNode()
OSDbuf = NT_CAM.PackData(&H21, OSDbuf)
Dim gSendNode As New SendNode(1)
G_CommunicationProtocol.setIsFlowList(True)
gSendNode.SetSendData(OSDbuf)
G_CommunicationProtocol.AddFlowNode("播放语音", gSendNode)
End Sub
Private Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.Click
'获取TextBox2文本
Dim OSDstr As String = TextBox2.Text
'将文本转HEX 数据
If G_CommunicationProtocol.getIsFlowList Then
MsgBox("正在通信中!")
Return
Else
G_CommunicationProtocol.ClearFlowNode()
G_CommunicationProtocol.setIsFlowList(True)
End If
G_CommunicationProtocol.ClearFlowNode()
OSDstr = SharedFunction.StringToHexString(OSDstr)
If IsNothing(OSDstr) OrElse OSDstr.Length = 0 Then
MsgBox("请输入正确的透传数据!")
Return
End If
Dim OSDbuf As Byte() = SharedFunction.HexStringToByte(OSDstr)
OSDbuf = NT_CAM.PackData(&H17, OSDbuf)
Dim gSendNode As New SendNode(1)
gSendNode.SetSendData(OSDbuf)
G_CommunicationProtocol.setIsFlowList(True)
G_CommunicationProtocol.AddFlowNode("透传命令", gSendNode)
'Console.WriteLine(OSDstr)
End Sub
Private Sub TextBox2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox2.KeyPress, TextBox5.KeyPress
e.Handled = Not $"0123456789ABCDEFabcdef{vbBack} ".Contains(e.KeyChar) '如果要只允许输入数字,
End Sub
Private Sub SplitContainer2_Panel2_Click(sender As Object, e As EventArgs)
Dim btn As Button = DirectCast(sender, Button)
If G_CommunicationProtocol.getIsFlowList Then
MsgBox("正在通信中!")
Return
Else
G_CommunicationProtocol.ClearFlowNode()
G_CommunicationProtocol.setIsFlowList(True)
End If
'获取当前按钮的+Tag值
Dim nComb As Byte() = SharedFunction.HexStringToByte(ComboBox1.Text.Trim)
If IsNothing(nComb) OrElse nComb.Length = 0 Then
MsgBox("请输入正确的命令!")
Return
End If
Dim ntag As Integer = CInt(btn.Tag)
Dim OSDbuf As Byte() = {ntag}
G_CommunicationProtocol.ClearFlowNode()
OSDbuf = NT_CAM.PackData(nComb(0), OSDbuf)
Dim gSendNode As New SendNode(1)
gSendNode.SetSendData(OSDbuf)
G_CommunicationProtocol.setIsFlowList(True)
G_CommunicationProtocol.AddFlowNode("IPC请求回复", gSendNode)
End Sub
Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs) Handles ToolStripButton1.Click
'清空富文本
RichTextBox1.Clear()
End Sub
Private Sub ComboBox1_DropDown(sender As Object, e As EventArgs) Handles ComboBox1.DropDown, ComboBox3.DropDown
'将sender 转换为ComboBox
Dim mcomboBox As ComboBox = DirectCast(sender, ComboBox)
mcomboBox.Items.Clear()
'添加1到255
For i As Integer = 1 To 255
mcomboBox.Items.Add(i)
Next
End Sub
Private Sub Button13_Click(sender As Object, e As EventArgs) Handles Button13.Click
Dim OSDstr As String = TextBox3.Text
Dim OSDbuf As Byte() = Encoding.ASCII.GetBytes(OSDstr)
If IsNothing(OSDbuf) OrElse OSDbuf.Length = 0 Then
MsgBox("请输入正确的产品ID")
Return
End If
If G_CommunicationProtocol.getIsFlowList Then
MsgBox("正在通信中!")
Return
Else
G_CommunicationProtocol.ClearFlowNode()
G_CommunicationProtocol.setIsFlowList(True)
End If
OSDbuf = NT_CAM.PackData(&H9, OSDbuf)
Dim gSendNode As New SendNode(1)
G_CommunicationProtocol.setIsFlowList(True)
gSendNode.SetSendData(OSDbuf)
G_CommunicationProtocol.AddFlowNode("设置产品ID", gSendNode)
End Sub
Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click
'获取TextBox2文本
Dim OSDstr As String = TextBox5.Text
'将文本转HEX 数据
If G_CommunicationProtocol.getIsFlowList Then
MsgBox("正在通信中!")
Return
Else
G_CommunicationProtocol.ClearFlowNode()
G_CommunicationProtocol.setIsFlowList(True)
End If
G_CommunicationProtocol.ClearFlowNode()
OSDstr = SharedFunction.StringToHexString(OSDstr)
If IsNothing(OSDstr) OrElse OSDstr.Length = 0 Then
MsgBox("请输入正确的透传数据!")
Return
End If
Dim OSDbuf As Byte() = SharedFunction.HexStringToByte(OSDstr)
OSDbuf = NT_CAM.PackData(&H20, OSDbuf)
Dim gSendNode As New SendNode(1)
gSendNode.SetSendData(OSDbuf)
G_CommunicationProtocol.setIsFlowList(True)
G_CommunicationProtocol.AddFlowNode("透传命令", gSendNode)
End Sub
Private Sub Button14_Click(sender As Object, e As EventArgs) Handles Button14.Click
Dim OSDstr As String = TextBox4.Text
Dim OSDbuf As Byte() = Encoding.ASCII.GetBytes(OSDstr)
If IsNothing(OSDbuf) OrElse OSDbuf.Length = 0 Then
MsgBox("请输入正确的产品ID")
Return
End If
If G_CommunicationProtocol.getIsFlowList Then
MsgBox("正在通信中!")
Return
Else
G_CommunicationProtocol.ClearFlowNode()
G_CommunicationProtocol.setIsFlowList(True)
End If
OSDbuf = NT_CAM.PackData(&H17, OSDbuf)
Dim gSendNode As New SendNode(1)
G_CommunicationProtocol.setIsFlowList(True)
gSendNode.SetSendData(OSDbuf)
G_CommunicationProtocol.AddFlowNode("设置产品ID", gSendNode)
End Sub
Private Sub TextBox7_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox7.KeyPress
e.Handled = Not $"0123456789{vbBack} ".Contains(e.KeyChar) '如果要只允许输入数字,
End Sub
Public SendingInterval As Integer = 0
Public SendingInterval1 As Integer = 0
Public SendingDate As String = ""
Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
If CheckBox1.Checked Then
TextBox7.Enabled = False
TextBox8.Enabled = False
'获取TextBox7 代表的发生间隔
SendingInterval = 30
Integer.TryParse(TextBox7.Text, SendingInterval)
SendingDate = TextBox8.Text
If SendingInterval < 1 AndAlso String.IsNullOrEmpty(SendingDate) Then
MsgBox("请输入正确的发送间隔和发送内容!")
CheckBox1.Checked = False
Return
End If
'开启定时任务
Timer1.Enabled = True
Else
Timer1.Enabled = False
TextBox7.Enabled = True
TextBox8.Enabled = True
End If
End Sub
Public Timer1cnt As Integer = 0
Public Timer2cnt As Integer = 0
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
If Timer1cnt = SendingInterval Then
Timer1cnt = 1
Dim OSDstr As String = SendingDate
'将文本转HEX 数据
If G_CommunicationProtocol.getIsFlowList Then
MsgBox("正在通信中!")
Return
Else
G_CommunicationProtocol.ClearFlowNode()
G_CommunicationProtocol.setIsFlowList(True)
End If
G_CommunicationProtocol.ClearFlowNode()
OSDstr = SharedFunction.StringToHexString(OSDstr)
If IsNothing(OSDstr) OrElse OSDstr.Length = 0 Then
MsgBox("请输入正确的透传数据!")
Return
End If
Dim OSDbuf As Byte() = SharedFunction.HexStringToByte(OSDstr)
OSDbuf = NT_CAM.PackData(&H20, OSDbuf)
Dim gSendNode As New SendNode(1, 1)
gSendNode.SetSendData(OSDbuf)
gSendNode.IsRecvData = False
G_CommunicationProtocol.setIsFlowList(True)
G_CommunicationProtocol.AddFlowNode("透传命令", gSendNode)
Else
Timer1cnt += 1
End If
End Sub
Private Sub TextBox8_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox8.KeyPress
e.Handled = Not $"0123456789ABCDEFabcdef{vbBack} ".Contains(e.KeyChar) '如果要只允许输入数字,
End Sub
Private Sub Button16_Click(sender As Object, e As EventArgs) Handles Button16.Click
'获取TextBox2文本 55 AA 01 0B 00 00 0B
'Dim OSDstr As String = TextBox5.Text
'将文本转HEX 数据
If G_CommunicationProtocol.getIsFlowList Then
MsgBox("正在通信中!")
Return
Else
G_CommunicationProtocol.ClearFlowNode()
G_CommunicationProtocol.setIsFlowList(True)
End If
G_CommunicationProtocol.ClearFlowNode()
'OSDstr = SharedFunction.StringToHexString(OSDstr)
'If IsNothing(OSDstr) OrElse OSDstr.Length = 0 Then
' MsgBox("请输入正确的透传数据!")
' Return
'End If
Dim OSDbuf As Byte() '= SharedFunction.HexStringToByte(OSDstr)
OSDbuf = {&H55, &HAA, &H1, &HB, &H0, &H0, &HB}
Dim gSendNode As New SendNode(1)
gSendNode.SetSendData(OSDbuf)
G_CommunicationProtocol.setIsFlowList(True)
G_CommunicationProtocol.AddFlowNode("透传命令", gSendNode)
End Sub
Private Sub TextBox9_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox9.KeyPress
e.Handled = Not $"0123456789ABCDEFabcdef{vbBack} ".Contains(e.KeyChar) '如果要只允许输入数字,
End Sub
Public OSDbufSN As Integer = 0
Private Sub CheckBox2_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox2.CheckedChanged
If CheckBox2.Checked Then
'判断串口是否打开
TextBox9.Enabled = False
'获取TextBox7 代表的发生间隔
SendingInterval1 = 500
Integer.TryParse(TextBox9.Text, SendingInterval1)
'SendingDate = TextBox8.Text
If SendingInterval1 < 1 Then
MsgBox("请输入正确的发送间隔!")
CheckBox2.Checked = False
Return
End If
'开启定时任务
OSDbufSN = 1
Timer2.Interval = 10
SendingInterval1 = SendingInterval1 / 10
Timer2.Start()
Else
OSDbufSN = 1
'Timer2.Enabled = False
Timer2.Stop()
TextBox9.Enabled = True
End If
End Sub
Public cntSendingInterval1 As Integer = 0
Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
' If Timer2cnt = SendingInterval1 Then
' Timer2cnt = 1
If cntSendingInterval1 < SendingInterval1 Then
cntSendingInterval1 = cntSendingInterval1 + 1
Else
If G_CommunicationProtocol.getIsFlowList1 Then
cntSendingInterval1 = SendingInterval1
Return
'MsgBox("正在通信中!")
Else
G_CommunicationProtocol.ClearFlowNode()
G_CommunicationProtocol.setIsFlowList(True)
End If
Dim li As List(Of Byte) = New List(Of Byte)()
Dim m_snsn As Integer = GetNewSNTimeDate(OSDbufSN)
Dim snbuf As String = GetSnString(m_snsn)
Dim OSDstr As String = $"R:{snbuf} B:{snbuf} D:{snbuf} TD:{snbuf} HD:{snbuf} S:{snbuf} HC:{snbuf} HR:{snbuf}"
Dim OSDbuf As Byte() = Encoding.ASCII.GetBytes(OSDstr)
'If IsNothing(OSDbuf) OrElse OSDbuf.Length = 0 Then
' MsgBox("请输入正确的OSD内容")
' Return
'End If
li.Add(OSDbuf.Length)
li.AddRange(OSDbuf)
OSDbuf = NT_CAM.PackData(&HA0, li.ToArray)
OSDbuf(6) = 14
OSDbuf(21) = 11
OSDbuf(33) = 16
OSDbuf(OSDbuf.Length - 1) = 0
OSDbuf(OSDbuf.Length - 1) = SharedFunction.GetCheckSumMod2(OSDbuf)
Dim gSendNode As New SendNode(1)
gSendNode.SetSendData(OSDbuf, 800)
G_CommunicationProtocol.ClearFlowNode()
'G_CommunicationProtocol.setIsFlowList(True)
G_CommunicationProtocol.AddFlowNode("设置OSD内容", gSendNode)
Console.WriteLine("发送OSD内容")
'Else
' Timer2cnt += 1
'End If
cntSendingInterval1 = 0
End If
End Sub
Public Function GetNewSNTimeDate(ByRef sn As Integer) As Integer
Dim result As Integer = 1
If sn > 9 Then
result = 1
sn = 1
Else
sn = sn + 1
result = sn
End If
Return result
End Function
Public Function GetSnString(sn As Integer) As String
'如果sn只有个位数则前面补0
Dim snbuf As String
'判断sn是否小于10 ,小于则前面补0
If sn < 10 Then
snbuf = $"0{sn}"
Else
snbuf = sn.ToString
End If
Return snbuf
End Function
#End Region
End Class