📄 frmmain.frm
字号:
'For I = 0 To 3
' Debug.Print ToHex(FlashBuf(I))
'Next I
Msg "文件已读入!长度:" & lFile
'自动打开串口
If ComSelCnt > 2 Then
MsgBox "只有两口,重新选择"
Else
If InitComm(ComSelCnt + 1) Then
Msg ("串口打开!")
Else
Msg ("请重新选择端口")
End If
iWaitChar = 1
iPageByte = 64
End If
End If
theexit: End Sub
Private Sub cmdrest_Click()
Dim temp(8) As String
temp(0) = Chr$(&H1)
temp(1) = Chr$(&H4)
temp(2) = Chr$(&H0)
temp(3) = Chr$(&H64)
temp(4) = Chr$(&H0)
temp(5) = Chr$(&H1)
temp(6) = Chr$(&H70)
temp(7) = Chr$(&H15)
If MSComm1.PortOpen = True Then
MSComm1.Output = temp(0)
MSComm1.Output = temp(1)
MSComm1.Output = temp(2)
MSComm1.Output = temp(3)
MSComm1.Output = temp(4)
MSComm1.Output = temp(5)
MSComm1.Output = temp(6)
MSComm1.Output = temp(7)
Else
MsgBox "先打开串口"
End If
End Sub
Private Sub cmdWrite_Click()
If MSComm1.PortOpen = False Then '防止运行出错
MsgBox "please open the serial comport first"
Else
iPageMax = lFile \ iPageByte
If (lFile Mod iPageByte) = 0 Then iPageMax = iPageMax - 1
MSComm1.Output = "W" '开始DownLoad
iPage = -1
iErr = 0
iWaitChar = 1
dTime = Now
End If
End Sub
Private Sub cmdExit_Click() 'exit 命令按钮的退出处理
If MSComm1.PortOpen = False Then MSComm1.PortOpen = True
MSComm1.PortOpen = False
End
End Sub
Private Sub Combo2_Click()
'利用一个模块级全局变量,返回波特率情况
Select Case Combo2.Text
Case "4800"
BaudRateSelCnt = 0
Case "9600"
BaudRateSelCnt = 1
Case "19200"
BaudRateSelCnt = 2
Case "38400"
BaudRateSelCnt = 3
Case "57600"
BaudRateSelCnt = 4
Case "115200"
BaudRateSelCnt = 5
Case "230400"
BaudRateSelCnt = 6
Case "460800"
BaudRateSelCnt = 7
Case "921600"
BaudRateSelCnt = 8
MsgBox "波特率很高,谨慎使用"
End Select
Msg (" ")
End Sub
'利用一个模块级全局变量,返回波特率情况
Private Sub Combo1_Click()
Select Case Combo1.Text
Case "COM1"
ComSelCnt = 0
Case "COM2"
ComSelCnt = 1
Case "COM3"
'Combo1.Text = "COM1"
MsgBox "该端口无法使用"
Case Else
MsgBox "重新选择"
End Select
Msg (" ") '刷新自定义提示信息输出框的状态
End Sub
Private Sub cmdOpenCom_Click()
If ComSelCnt > 2 Then
MsgBox "只有两口,重新选择"
Else
If InitComm(ComSelCnt + 1) Then
Msg ("串口打开!")
Else
Msg ("请重新选择端口")
End If
iWaitChar = 1
iPageByte = 64
End If
theend: End Sub
Private Sub cmdCloseCom_Click()
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
Msg ("串口已关闭")
End Sub
Private Sub Form_Load()
'lblMsg.Tag = "1"
'Timer1.Interval = 3000 '设置label1的闪烁效果,配合定时器1
Combo1.AddItem "COM1"
Combo1.AddItem "COM2"
Combo1.AddItem "COM3"
Combo1.AddItem "别拉了,应该没有了吧"
Combo1.ListIndex = 0
ComSelCnt = 0 '通信断口选择指示变量
Combo2.AddItem "4800"
Combo2.AddItem "9600"
Combo2.AddItem "19200"
Combo2.AddItem "38400"
Combo2.AddItem "57600"
Combo2.AddItem "115200"
Combo2.AddItem "230400"
Combo2.AddItem "460800"
Combo2.AddItem "921600"
Combo2.ListIndex = 4
BaudRateSelCnt = Combo2.ListIndex '波特率选择指示器,初始与combo2.index一致
Label1.Font = "隶书"
Label1.FontSize = 14
Label1.ForeColor = vbRed
Label1.Caption = "选择com端口 选择baudrate"
End Sub
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive '接收到数据
If (MSComm1.InBufferCount >= iWaitChar) Then '已经有足够数据
RecvCmd (MSComm1.Input) '处理单片机的应答
End If
End Select
End Sub
Private Sub RecvCmd(ByVal sCmd$)
Dim i As Long
Select Case sCmd
Case ">"
MSComm1.Output = "<"
iWaitChar = 3
Msg "开始连接..."
Case "!" '正确
iWaitChar = 1
iPage = iPage + 1
WriteFlash (iPage)
Msg ("成功写到" & iPage & "页,错误次数" & iErr & ",时间" & (Now - dTime))
Case "@" '错误
iWaitChar = 1
iErr = iErr + 1
WriteFlash (iPage) '再写
Msg ("成功写到" & iPage & "页,错误次数" & iErr)
Case "E" '退出boot
Msg "正确退出"
Case Else
If (iWaitChar = 3) Then
ChipInfo (sCmd)
Else
Msg ("错误指令..." & sCmd)
MSComm1.Output = "E"
End If
iWaitChar = 1
End Select
End Sub
Private Sub ChipInfo(ByVal sInfo$)
Dim sTemp$, sMsg$
On Error Resume Next
sTemp = Left(sInfo, 1)
If (sTemp = "0") Then
sMsg = "Mega8,"
iPageByte = 64
ElseIf sTemp = "1" Then
sMsg = "Mega16,"
iPageByte = 128
ElseIf sTemp = "2" Then
sMsg = "Mega32,"
iPageByte = 128
ElseIf sTemp = "3" Then
sMsg = "Mega64,"
iPageByte = 256
ElseIf sTemp = "4" Then
sMsg = "Mega128,"
iPageByte = 256
End If
sTemp = Mid(sInfo, 3, 1)
'sTemp = "版本" & sTemp
sTemp = "版本" & Str((Asc(sTemp) - Asc("f")) / 10 + 1)
sMsg = sMsg + sTemp
lblChip.Caption = sMsg
Msg ("连接成功,可下载...")
End Sub
Private Sub WriteFlash(ByVal iPage%)
Dim Crc%, iTemp As Byte, iStart As Long, i%
Dim DD() As Byte
If iPage < 0 Then Exit Sub
ReDim DD(1)
If (iPage > iPageMax) Then
DD(0) = 255
DD(1) = 255
MSComm1.Output = DD()
Exit Sub
Else
iTemp = iPage \ 256 '先高位
DD(0) = iTemp
iTemp = iPage Mod 256
DD(1) = iTemp
MSComm1.Output = DD() '输出Page编号
Crc = DD(0) + DD(1) '考虑Page的效验
If Crc > 255 Then Crc = Crc - 256
End If
Sleep (5)
ReDim DD(iPageByte)
iStart = iPage * iPageByte
For i = 0 To iPageByte - 1
If (iStart + i) < lFile Then
iTemp = FlashBuf(iStart + i)
Else
iTemp = 255
End If
DD(i) = iTemp
Crc = Crc + iTemp
If Crc > 255 Then Crc = Crc - 256
Next i
DD(i) = Crc
MSComm1.Output = DD()
End Sub
'用于label1的闪烁效果
'Private Sub Timer1_Timer()
'Dim ctl As Control
'For Each ctl In Me
' If TypeOf ctl Is Label And ctl.Tag = "1" Then
' ctl.Visible = Not ctl.Visible
' End If
'Next
'End Sub
Private Sub MSComm2_OnComm()
End Sub
Private Sub Text1_Change()
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -