📄 form1.vb
字号:
Imports System.IO
Public Class Form1
Dim i, j As Integer
Dim ECode As String
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
SerialPort1.PortName = ComboBox1.Text.Trim
If SerialPort1.IsOpen Then SerialPort1.Close()
Try
SerialPort1.Open()
MsgBox("端口打开成功!", MsgBoxStyle.Information, "成功")
Catch ex As ArgumentException
MsgBox("该端口的文件类型无效!")
Catch ex As InvalidOperationException
MsgBox("指定的端口已经被打开,请先关闭后重试!")
Catch ex As IOException
MsgBox("端口号无效")
Catch ex As Exception
MsgBox("未知错误!")
End Try
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If SerialPort1.PortName <> "" Then
Try
If SerialPort1.IsOpen Then SerialPort1.Close() : MsgBox("关闭端口成功")
Catch ex As InvalidOperationException
MsgBox("指定的端口已经被关闭")
Catch ex As Exception
End Try
End If
End Sub
''' <summary>
''' 开阀
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
If TextBox1.Text.Trim = "" Then Exit Sub
If Len(TextBox1.Text.Trim) <> 10 Then Exit Sub
If Not ChargeData(1, TextBox1.Text.Trim) Then Exit Sub
'0067305985
End Sub
Private Function ChargeData(ByVal OperateMode As Integer, ByVal cData As String) As Boolean
Dim MyOrderText As String
Dim t As Byte
Dim k, l As Integer
Dim SendDataByte(12) As Byte
Select Case OperateMode
'开阀
Case 1
ECode = cData
MyOrderText = cData
MyOrderText = Long.Parse(MyOrderText).ToString("x")
MyOrderText = Reverse(FormatString(MyOrderText, 8, True))
t = VerifySum(MyOrderText)
SendDataByte(0) = Long.Parse("A5", Globalization.NumberStyles.HexNumber)
SendDataByte(1) = Long.Parse("03", Globalization.NumberStyles.HexNumber)
l = 2
For k = 2 To 20 Step 2
If k <= 8 Then
SendDataByte(l) = Long.Parse(MyOrderText.Substring(k - 2, 2), Globalization.NumberStyles.HexNumber)
Else
SendDataByte(l) = "00"
End If
l = l + 1
Next
SendDataByte(12) = t
End Select
SerialPort1.Write(SendDataByte, 0, 13)
Label2.Text = ""
For y As Integer = 0 To SendDataByte.Length - 1
Label2.Text = Label2.Text & FormatString(Long.Parse(SendDataByte(y)).ToString("x"), 2, True) & " "
Next
End Function
'计算校验和
'参数cData只接收十六进制的字符串形式
Public Function VerifySum(ByVal cData As String) As Byte
Dim HexData As String, bytHexData() As Byte
HexData = cData
If Len(HexData) Mod 2 <> 0 Then HexData = FormatString(HexData, Len(HexData) + 1, True)
ReDim bytHexData(0 To Len(HexData) \ 2 - 1)
For j = 0 To UBound(bytHexData)
bytHexData(j) = CInt("&H" & Mid(HexData, (j + 1) * 2 - 1, 2))
Next j
HexData = ""
For i = 0 To UBound(bytHexData)
If HexData = "" Then
HexData = CInt(bytHexData(i))
Else
HexData = HexData + bytHexData(i)
End If
Next i
VerifySum = "&H" & Strings.Right(Hex(HexData), 2)
End Function
''' <summary>
''' 格式化字符串,根据要求在前面自动补零
''' </summary>
''' <param name="SourceString"></param>
''' <param name="FormatLen"></param>
''' <param name="Head"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function FormatString(ByVal SourceString As String, ByVal FormatLen As Integer, Optional ByVal Head As Boolean = False) As String
For i = 1 To FormatLen - Len(SourceString)
SourceString = IIf(Head, "0" & SourceString, SourceString & "0")
Next i
FormatString = SourceString
End Function
''' <summary>
'''将十六进制字符串转换为低字节在前高字节在后
'''参数:cData只接收十六进制的字符串形式
'''返回值为十六进制的字符串形式
''' </summary>
''' <param name="cData"></param>
''' <returns></returns>
''' <remarks></remarks>
Private Function Reverse(ByVal cData As String) As String
Dim HexData As String, bytHexData() As Byte
Dim t As Byte
If Len(cData) Mod 2 <> 0 Then
HexData = FormatString(cData, Len(cData) + 1, True)
Else
HexData = Trim(cData)
End If
ReDim bytHexData(0 To Len(cData) \ 2 - 1)
For i = 0 To UBound(bytHexData)
bytHexData(i) = CInt("&H" & Mid(HexData, (i + 1) * 2 - 1, 2))
Next i
For i = 0 To UBound(bytHexData)
If i < (UBound(bytHexData) + 1) \ 2 Then
t = bytHexData(i)
bytHexData(i) = bytHexData(UBound(bytHexData) - i)
bytHexData(UBound(bytHexData) - i) = t
Else
Exit For
End If
Next i
For j = 0 To UBound(bytHexData)
Reverse = Reverse & FormatString(Hex(bytHexData(j)), 2, True)
Next j
End Function
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
End Class
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -