⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frmmain.frm

📁 mega128的bootloader程序,上位机采用vb,下位机采用gcc编译
💻 FRM
📖 第 1 页 / 共 2 页
字号:
    
    '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 + -