Files
Desktop_485BurningTool/CommunicationFlow.vb

239 lines
6.9 KiB
VB.net
Raw Permalink Normal View History

2025-12-11 10:09:34 +08:00
Imports System.ComponentModel
Imports System.Reflection
Imports System.Threading
Imports _485_BurningTool.DataProcessing
'通信流程
Public MustInherit Class CommunicationFlow
'通信类型枚举
Public Enum CommunicationType
None = 0
<Description("串口")>
SerialPort = 1
<Description(" UDP")>
Udp
<Description("TCP")>
TCP
maximum
End Enum
'协议类型枚举
Public Enum ProtocolEnum
<Description("BLV_Bootloader")>
BLV_Bootloader
maximum
End Enum
'通信器变量
Public m_CommunicationTypeIndex As CommunicationType = CommunicationType.SerialPort
Public m_ProtocolEnumIndex As ProtocolEnum
'通信发送器对象
Public m_Transmitter As Transmitter
'通信接协议对象
Public m_Receiver As CommunicationProtocol
'运行线程
Public m_RunThread As Thread
'线程控制标志
Public m_RunThreadFlag As Boolean = False
'线程 参数
Public m_Parameterlist As Parameterlist
'更新界面线程
Public m_UpdateUI As Thread
'切换通信器
Public Sub ChangeCommunicationType(portname As String, gControl As Control)
Dim CommunicationStr As String
For i = CommunicationType.SerialPort To CommunicationType.maximum
CommunicationStr = GetEnumDescription(CType(i, CommunicationType))
If CommunicationStr = portname Then
If Not IsNothing(m_Transmitter) AndAlso m_Transmitter.IsTransmitter Then m_Transmitter.CloseTransmitter()
m_CommunicationTypeIndex = i
m_Transmitter = Transmitter.CreateTransmitter(m_CommunicationTypeIndex, gControl)
Return
End If
Next
End Sub
'切换协议
Public Sub ChangeProtocol(Protocolstr As String)
Dim CommunicationStr As String
For i = ProtocolEnum.BLV_Bootloader To ProtocolEnum.maximum - 1
CommunicationStr = GetEnumDescription(CType(i, ProtocolEnum))
If CommunicationStr = Protocolstr Then
m_ProtocolEnumIndex = i
'If m_CommunicationFlow.m_Receiver.IsCreateProtocol Then m_CommunicationFlow.m_Receiver.CloseTransmitter()
'If m_CommunicationTypeIndex = CommunicationType.None Then
' MsgBox("请先选择通信器通信方式!")
' Return
'End If
m_Receiver = CommunicationProtocol.CreateAbstractObject(m_CommunicationTypeIndex, m_ProtocolEnumIndex)
If Not IsNothing(m_Transmitter) Then
m_Receiver.m_Transmitter = m_Transmitter
End If
' m_Receiver.m_Transmitter = m_Transmitter
Return
End If
Next
End Sub
'刷新发送器
Public Sub RefreshTransmitter()
If IsNothing(m_Receiver) Then Return
m_Receiver.m_Transmitter = m_Transmitter
End Sub
'启动线程
Public Sub StartThread()
'判断线程是否启动
If m_RunThread Is Nothing OrElse m_RunThread.ThreadState = ThreadState.Stopped Then
m_RunThread = New Thread(AddressOf Run)
m_RunThread.Start()
If m_UpdateUI Is Nothing OrElse m_UpdateUI.ThreadState = ThreadState.Stopped Then
m_UpdateUI = New Thread(AddressOf RunUpdateUI)
m_UpdateUI.Start()
End If
Else
'm_RunThread.Abort()
'm_RunThread = New Thread(AddressOf Run)
'm_RunThread.Start()
End If
End Sub
'停止线程
Public Sub StopThread()
If Not IsNothing(m_RunThread) Then
m_RunThread.Abort()
m_RunThread = Nothing
m_UpdateUI.Abort()
m_UpdateUI = Nothing
End If
End Sub
'更新UI线程
Private Sub RunUpdateUI()
While True
Thread.Sleep(5)
If IsNothing(m_Receiver) OrElse IsNothing(m_Receiver.UpdateUIqueue) Then Continue While
If m_Receiver.UpdateUIqueue.Count > 0 Then
Dim str As (Control, RuningLogConfig, Integer) = m_Receiver.UpdateUIqueue.Dequeue()
RuningLog.OutputLogsToTheControl(str.Item1, str.Item2, str.Item3)
End If
End While
End Sub
'添加队列
'设置线程参数
Public Sub SetThreadParameter(Parameterlist As Parameterlist)
Parameterlist.CommunicationTypeIndex = m_Transmitter.CommunicationTypeindex
m_Parameterlist = Parameterlist
m_Receiver.m_Transmitter.ClearSendData()
SetThreadFlag(True)
StartThread()
End Sub
'设置线程标志
Public Sub SetThreadFlag(flag As Boolean)
m_RunThreadFlag = flag
End Sub
'判断当前是否运行
Public Function GetRuningNode() As Boolean
If m_Parameterlist.EnableFlag Then
'm_Parameterlist.Action
Return False
End If
End Function
'线程运行
Private Sub Run()
While m_RunThreadFlag
If m_Parameterlist.EnableFlag Then
m_Receiver.Runing(m_Parameterlist, m_RunThreadFlag)
End If
Thread.Sleep(5)
End While
End Sub
Public Function IsCreateProtocol() As Boolean
If IsNothing(m_Receiver) Then Return False
Return True
End Function
End Class
Public Class CommunicationProtocolEntity
Inherits CommunicationFlow
Public Sub New()
StartThread()
End Sub
End Class
Public Class Parameterlist
'启用标记
Public EnableFlag As Boolean
'动作类型
Public Action As UInt32
'下一步动作
Public NextAction As UInt32
'Public Action As
'起始地址
Public StartAddress As UInt32
'接收地址
Public ReceiveAddress As UInt32
'接收地址范围长度
Public ReceiveAddressRangeLength As UInt32
'设备类型
Public DeviceType As UInt32
'bootloader 超时
Public BootloaderTimeout As UInt32
'有效时间
Public ValidTime As UInt32
'boot 波特率
Public BootBaudRate As UInt32
'APP波特率
Public AppBaudRate As UInt32
'升级波特率
Public UpgradeBaudRate As UInt32
'当前步骤
Public CurrentStep As Integer
'成功跳转
Public SuccessJump As Integer
'失败跳转
Public FailureJump As Integer
'按钮
Public btn As Button
'表格
Public DataGrid As DataGridView
'富文本框
Public RText_OutputText As RichTextBox
'流程列表
'通信器类型
Public CommunicationTypeIndex As Integer
Public ProcessList As List(Of (number As Integer, Cmdconfig))
Public addtypeli As List(Of (Integer, Integer))
Public addtypeliindx As Integer
Public DevNumber As Integer
Public NTimeOut As Integer
Public Throughport As Integer '
Public TransnDuion As Integer
Sub New()
DevNumber = 1
BootBaudRate = 2400
NTimeOut = 10
End Sub
End Class