parsehex.bas
来自「VB6, paralell port, I2C, parse intel HEX」· BAS 代码 · 共 175 行
BAS
175 行
Attribute VB_Name = "ParseHEX"
Option Explicit
Public MY As Long
Public BufArr() As Byte
Public MCUlen As Long
Type parsedDataAndAddr
error As String
data As String
addr As Integer
len As Integer
End Type
Public ParsedData() As parsedDataAndAddr
Public HexF As Boolean
Public Function ParseHexString(ByVal HexStr As String) As parsedDataAndAddr
Dim DataBinLen As Integer
Dim DataBin As String
Dim DataHex As String
Dim DataBinAdr As Long
Dim i As Integer
Dim chks As Integer
Dim blenTp As Long
' 1 byte intel hex marking 0x3A , ":"
If Left(HexStr, 1) <> ":" Then
ParseHexString.error = "badHex"
Exit Function
End If
' 2 bytes lenght of data
DataBinLen = Bitwise.HexStrToIntVal(Mid(HexStr, 2, 2))
MY = MY + DataBinLen
' 4 bytes data address
DataBinAdr = Bitwise.HexStrToIntVal(Mid(HexStr, 4, 4))
blenTp = DataBinAdr + DataBinLen
If (blenTp - 1) > Blen Then
Blen = blenTp - 1
End If
' record type "00" normal data, "01" end of file, "02" extended addressing
If Mid(HexStr, 8, 2) = "01" Then
ParseHexString.error = "end"
Exit Function
End If
If Mid(HexStr, 8, 2) = "02" Then
ParseHexString.error = "extended"
Exit Function
End If
If Mid(HexStr, 8, 2) <> "00" Then
ParseHexString.error = "notbindata"
Exit Function
End If
' data from 10 to -- every data byte as 2 bytes hex
DataBin = ""
DataHex = (Mid(HexStr, 10, DataBinLen * 2))
For i = 1 To DataBinLen * 2 Step 2
DataBin = DataBin & Chr(Bitwise.HexStrToIntVal(Mid(DataHex, i, 2)))
Next i
' last two checksum, sum data bytes ++ then 2's complement
chks = 0
For i = 1 To DataBinLen + 4
chks = chks + Bitwise.HexStrToIntVal(Mid(HexStr, i * 2, 2))
Next i
chks = chks And &HFF
chks = &H100 - chks
chks = chks And &HFF
If chks <> Bitwise.HexStrToIntVal(Right(HexStr, 2)) Then
ParseHexString.error = "bcc"
Exit Function
End If
ParseHexString.data = DataBin
ParseHexString.addr = DataBinAdr
ParseHexString.len = DataBinLen
ParseHexString.error = "ok"
End Function
Public Function ParseIntelHexFile() As Boolean
Dim i As Integer
Dim j As Integer
ReDim ParsedData(bufStrPos)
ParseIntelHexFile = False
Blen = 0
For i = 0 To bufStrPos
ParsedData(i) = ParseHexString(stringArr(i))
If ParsedData(i).error = "end" Then
ParseIntelHexFile = True
Exit Function
End If
If ParsedData(i).error <> "ok" Then
MsgError (ParsedData(i).error)
ParseIntelHexFile = False
Exit Function
End If
Next i
End Function
Public Function CreateBinData() As Boolean
Dim i As Integer
Dim j As Integer
Dim bt As Byte
CreateBinData = False
ReDim bytesArr(Blen)
For i = 0 To bufStrPos
For j = 0 To (ParsedData(i).len - 1)
bytesArr(ParsedData(i).addr + j) = Asc(Mid(ParsedData(i).data, j + 1, 1))
Next j
Next i
CreateBinData = True
End Function
Public Sub CopyBinFileToBuf()
Dim i As Long
Blen = fLen
ReDim BufArr(Blen)
For i = 0 To Blen
BufArr(i) = bytesArr(i)
Next i
End Sub
Public Sub DisplayLoadData()
Dim i As Long
Dim j As Long
Dim str As String
frmMAIN.LoadData = ""
For i = 0 To Blen Step 8
str = ""
str = str & Bitwise.IntValToHexStr(i, 4) & ": "
For j = 0 To 7
If (i + j) > (Blen) Then
str = str & " "
Else
str = str & Bitwise.IntValToHexStr(bytesArr(i + j), 2) & " "
End If
Next j
str = str & Chr(13) & Chr(10)
frmMAIN.LoadData = frmMAIN.LoadData & str
Next i
End Sub
Public Sub MsgError(ByVal errStr As String)
Select Case errStr
Case "badHex"
MsgBox "Not a valid intel HEX file", vbCritical, "ccc"
Case "extended"
MsgBox "Not a valid intel HEX file", vbCritical, "ccc"
Case "notbindata"
MsgBox "Not a valid intel HEX file", vbCritical, "ccc"
Case "bcc"
MsgBox "Bad checksum in intel HEX file", vbCritical, "ccc"
End Select
End Sub
Public Sub ClearGlobals()
Blen = 0
fLen = 0
ReDim bytesArr(0)
ReDim ParsedData(0)
frmMAIN.LoadData = ""
End Sub
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?