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

📄 frmcardmk.frm

📁 用MSCOMM控件作的刷卡程序
💻 FRM
📖 第 1 页 / 共 3 页
字号:
        GetData = ""
        NewCard = True
        GoTo H123
        Exit Sub
    End If
    Label4.Caption = "RF/64格式"
    Label4.BackColor = &HFF&
    RF32Type = 0
Else
    Label4.Caption = "RF/32格式"
    Label4.BackColor = &H800000
    RF32Type = 1
End If

H123:
Conv2Txt GetData, getText

For j = 0 To 6
    Text1(j).Text = ""
Next j

For j = 0 To Blocknum - 1
    Text1(j).Text = getText(j + 1)
Next j

If Trim(Text1(0).Text) <> mCardID Then
    NewCard = True
    KeyPressed = False
End If

    mCardID = Trim(Text1(0).Text)
    mArea = Mid(Trim(Text1(2).Text), 1, 4)
    mAmount = Mid(Trim(Text1(1).Text), 1, 4)

If Option2(0).Value = True And KeyPressed = False And NewCard Then
    Text2(0).Text = mCardID
    Text2(1).Text = mAmount
    Text2(2).Text = mArea
    NewCard = False
    
End If

End Sub

Private Function ReadCard(RF32 As Integer) As Variant
Dim Sbuf(5) As Byte
Dim Vsend As Variant
Dim Vread As Variant
Dim ReadRF As Variant
Dim Vgot As Variant
Dim ltime As Integer, i As Integer

ReadRF = ""

Sbuf(0) = 126
Sbuf(1) = 242
Sbuf(2) = RF32
Sbuf(3) = 0
Sbuf(4) = 242 + RF32
Sbuf(5) = 13
Vsend = Sbuf

'发送读命令
MSComm1.Output = Vsend

'读出数据
ltime = 0
Do While MSComm1.InBufferCount = 0
    'ltime = ltime + 1
    'If ltime > 30000 Then Exit Do
Loop

For i = 0 To 4
    Vgot = MSComm1.Input
    ReadRF = ReadRF & Vgot
    If InStrB(Vgot, ChrB(13)) Then Exit For
    ltime = 0
    Do While MSComm1.InBufferCount = 0
     '   ltime = ltime + 1
     '   If ltime > 30000 Then Exit Do
    Loop

Next

ReadCard = ReadRF

End Function

Private Sub WriteCard(ByVal Sectn As Integer, ByRef WrData As String)
Dim Sbuf() As Byte
Dim Rbuf As Variant
Dim Vsend As Variant
Dim nBufSiz As Integer
Dim i As Integer, n As Integer
Dim ltime As Integer

Dim mTString As String
Dim mWData(10) As Byte
Dim mWMode As Byte
Dim mDLen As Byte

mTString = WrData & mPassWord
Txt2Array mWData, mTString
If Len(mTString) = 16 Then
    mWMode = &H10 Or Sectn
    mDLen = 8
Else
    mWMode = Sectn
    mDLen = 4
End If

mWData(mDLen + 1) = mWData(mDLen + 1) Xor mWMode Xor 243 Xor mDLen

nBufSiz = 0
For i = 0 To 9
If mWData(i) = 126 Or mWData(i) = 13 Or mWData(i) = 92 Then nBufSiz = nBufSiz + 1
Next i

ReDim Sbuf(nBufSiz + mDLen + 6)

Sbuf(0) = 126
Sbuf(1) = 243
Sbuf(2) = mWMode
Sbuf(3) = mDLen

n = 4

For i = 0 To mDLen + 1

Select Case mWData(i)
Case 13
    Sbuf(n) = &H5C
    n = n + 1
    Sbuf(n) = &H45
    n = n + 1
Case 92
    Sbuf(n) = &H5C
    n = n + 1
    Sbuf(n) = &H2F
    n = n + 1

Case 126
    Sbuf(n) = &H5C
    n = n + 1
    Sbuf(n) = &H53
    n = n + 1

Case Else
    Sbuf(n) = mWData(i)
    n = n + 1
    
End Select

Next i

Sbuf(n) = 13

Vsend = Sbuf

MSComm1.Output = Vsend

ltime = 1
Do While MSComm1.InBufferCount = 0
'ltime = ltime + 1
'If ltime > 10000 Then GoTo ErrCard

Loop
'n = MSComm1.InBufferCount
'ReDim Rbuf(n)

ltime = 1

For i = 0 To 7
    Rbuf = MSComm1.Input
    If InStrB(Rbuf, ChrB(13)) Then Exit For
    ltime = 0
    Do While MSComm1.InBufferCount = 0
  '  ltime = ltime + 1
  '  If ltime > 10000 Then GoTo ErrCard
    Loop
    
Next

ErrCard:

End Sub

Private Sub Buzz(Beep As Integer)

Dim Sbuf(7) As Byte
Dim Vsend As Variant
Dim Vgot As Variant
Dim ltime As Integer, i As Integer

Sbuf(0) = 126
Sbuf(1) = 245
Sbuf(2) = 1
Sbuf(3) = 1
Sbuf(4) = 1
Sbuf(5) = 1
Sbuf(6) = 245
Sbuf(7) = 13
Vsend = Sbuf

MSComm1.Output = Vsend

ltime = 0
Do While MSComm1.InBufferCount = 0
ltime = ltime + 1
If ltime > 1000 Then Exit Do
Loop

For i = 0 To 4
    Vgot = MSComm1.Input
    If InStrB(Vgot, ChrB(13)) Then Exit For
Next i

End Sub

Private Sub Conv2Txt(ByVal ReadStr As Variant, ByRef RdString As Variant)
'ReadStr 为读卡得来的字符串
'RdString 为分解为最多七个区的字符串数组
Dim tmStr1 As String
Dim tmByte As Byte
Dim n As Integer, m As Integer, j As Integer
Dim i As Integer

On Error Resume Next
n = UBound(RdString)

For i = 1 To n
RdString(i) = ""
Next i

If ReadStr = "" Then Exit Sub
n = AscB(MidB(ReadStr, 4, 1)) \ 4
m = 0
For i = 1 To n
    For j = 1 To 4
        tmByte = AscB(MidB(ReadStr, 4 * i + j + m, 1))
        If tmByte = &H5C Then
            m = m + 1
            tmByte = AscB(MidB(ReadStr, 4 * i + j + m, 1))
            Select Case tmByte
            Case 47
                tmByte = &H5C
            Case 69
                tmByte = &HD
            Case 83
                tmByte = &H7E
            End Select
        End If
        
        tmStr1 = Hex(tmByte)
        If Len(tmStr1) = 1 Then tmStr1 = "0" & tmStr1
        RdString(i) = RdString(i) & tmStr1
    Next j
Next i
End Sub

Private Function Keyword(Cardnum As String) As String

Dim mPassWD As String
Dim mPwd As String
Dim mFlag1 As Integer
Dim mFlag2 As Integer
Dim mPass(4) As Byte
Dim n As Integer
Dim k As Integer

mPassWD = Trim(Cardnum)
'mPassWD = "FEDCBA01"
If mPassWD = "" Then Exit Function

For n = 0 To 3
    mPass(3 - n) = CByte("&H" & Mid(mPassWD, 2 * n + 1, 2))
Next n

For n = 0 To CardType + 1
    mFlag1 = (mPass(3) And &H80) \ 128
    For k = 0 To 3
        mFlag2 = (mPass(k) And &H80) \ 128
        mPass(k) = (mPass(k) And &H7F) * 2 + mFlag1
        mFlag1 = mFlag2
    Next k
Next n

mPass(0) = mPass(0) + CardType + 2

mPassWD = ""
For n = 0 To 3
    mPwd = Hex(mPass(n))
    If Len(mPwd) = 1 Then mPwd = "0" & mPwd
    mPassWD = mPwd & mPassWD
Next n

Keyword = mPassWD

End Function

Private Sub Txt2Array(Sdata As Variant, ByVal aText As String)

Dim tmText1 As String
Dim tmText3 As String
Dim sum1 As Integer
Dim sum2 As Byte
Dim i As Integer
Dim mTLen As Integer

tmText1 = Trim(aText)
mTLen = Len(tmText1) / 2

For i = 0 To mTLen - 1

    tmText3 = "&H" & Mid(tmText1, 2 * i + 1, 2)
         
    Sdata(i) = Val(tmText3)
    sum1 = sum1 + Sdata(i)
    
Next i

Do While sum1 > 255
sum1 = sum1 - 256
Loop

Sdata(mTLen) = sum1
For i = 0 To mTLen
sum2 = sum2 Xor Sdata(i)
Next i
Sdata(mTLen + 1) = sum2

End Sub

Private Function enKeyword(ByVal enKey As String) As String
Dim KyTime As String
Dim HourNum As Integer
Dim MinuteNum As Integer
Dim SecondNum As Single
Dim tmRND As Single
Dim tmKeyword As String
Dim tmKey As Long
Dim ekLen As Integer
Dim tmRNDPos As Integer
Dim i As Integer, j As Integer

KyTime = CStr(Time)

HourNum = Hour(KyTime)
MinuteNum = Minute(KyTime)
SecondNum = Second(KyTime)

tmRNDPos = 0
tmRND = Rnd(-CSng(SecondNum))
For i = 1 To HourNum + 1
    For j = 1 To MinuteNum + 1
    tmRND = Rnd(j)
    tmRNDPos = tmRNDPos + 1
    Next j
Next i

tmKeyword = ChrW((SecondNum) Xor AscW("飞")) & ChrW((tmRNDPos) Xor AscW("熊"))

ekLen = Len(enKey)

For i = 1 To ekLen
    tmKey = AscW(Mid(enKey, i, 1)) Xor Int(65536 * tmRND)
    If tmKey < 0 Then tmKey = tmKey + 65536
    tmKeyword = tmKeyword & ChrW(tmKey)
    tmRND = Rnd(i)
Next i

enKeyword = tmKeyword


End Function

Private Function deKeyword(ByVal deKey As String) As String


Dim tmKeyword As String
Dim tmRND As Single
Dim tmKey As Long
Dim ekLen As Integer
Dim tmRNDPos As Integer
Dim nSeed As Single
Dim i As Integer

ekLen = Len(deKey)
nSeed = -CSng(AscW(Mid(deKey, 1, 1)) Xor AscW("飞"))
tmRND = Rnd(nSeed)

tmRNDPos = CInt(AscW(Mid(deKey, 2, 1)) Xor AscW("熊"))
tmKeyword = ""
For i = 1 To tmRNDPos
tmRND = Rnd(i)

Next

For i = 3 To ekLen
    tmKey = AscW(Mid(deKey, i, 1)) Xor Int(65536 * tmRND)
    If tmKey < 0 Then tmKey = tmKey + 65536
    tmKeyword = tmKeyword & ChrW(tmKey)
    tmRND = Rnd(i)
Next i
deKeyword = tmKeyword

End Function

Private Function modiSKey(ByVal orSkey As String, ByVal oldData As Variant, ByVal newData As Variant) As String

Dim tmKeyword As String
Dim tmRND As Single
Dim tmKey As Long
Dim ekLen As Integer
Dim tmRNDPos As Integer
Dim nSeed As Single
Dim i As Integer

ekLen = Len(orSkey)
nSeed = -CSng(AscW(Mid(orSkey, 1, 1)) Xor AscW("飞"))
tmRND = Rnd(nSeed)

tmRNDPos = CInt(AscW(Mid(orSkey, 2, 1)) Xor AscW("熊"))
tmKeyword = ""
For i = 1 To tmRNDPos
tmRND = Rnd(i)

Next

For i = 3 To ekLen
    tmKey = AscW(Mid(orSkey, i, 1)) Xor Int(65536 * tmRND)
    If tmKey < 0 Then tmKey = tmKey + 65536
    tmKeyword = tmKeyword & ChrW(tmKey)
    tmRND = Rnd(i)
Next i
modiSKey = tmKeyword

End Function

Private Sub WriteMode()
Dim Sbuf() As Byte
Dim Rbuf As Variant
Dim Vsend As Variant
Dim nBufSiz As Integer
Dim i As Integer, n As Integer
Dim ltime As Integer

Dim mTString As String
Dim mWData(10) As Byte
Dim mWMode As Byte
Dim mDLen As Byte

mTString = mCardCon & mPassWord
Txt2Array mWData, mTString
mDLen = Len(mTString) / 2
If mDLen = 8 Then
    mWMode = &H10
Else
    mWMode = &H0
End If

mWData(mDLen + 1) = mWData(mDLen + 1) Xor mWMode Xor mDLen Xor 244

nBufSiz = 0
For i = 4 To mDLen + 1
If mWData(i) = 126 Or mWData(i) = 13 Or mWData(i) = 92 Then nBufSiz = nBufSiz + 1
Next i

ReDim Sbuf(nBufSiz + mDLen + 6)

Sbuf(0) = 126
Sbuf(1) = 244
Sbuf(2) = mWMode
Sbuf(3) = mDLen
For i = 0 To 3  '模式字
    Sbuf(4 + i) = mWData(i)
Next i

n = 8
For i = 4 To mDLen + nBufSiz + 1

Select Case mWData(i)
Case 13
    Sbuf(n) = &H5C
    n = n + 1
    Sbuf(n) = &H45
    n = n + 1
Case 92
    Sbuf(n) = &H5C
    n = n + 1
    Sbuf(n) = &H2F
    n = n + 1

Case 126
    Sbuf(n) = &H5C
    n = n + 1
    Sbuf(n) = &H53
    n = n + 1

Case Else
    Sbuf(n) = mWData(i)
    n = n + 1
    
End Select

Next i
Sbuf(n) = 13

Vsend = Sbuf

MSComm1.Output = Vsend

ltime = 1
Do While MSComm1.InBufferCount = 0
'ltime = ltime + 1
'If ltime > 50000 Then GoTo ErrCard

Loop
'n = MSComm1.InBufferCount
'ReDim Rbuf(n)

ltime = 1

For i = 0 To 7
    Rbuf = MSComm1.Input
    If InStrB(Rbuf, ChrB(13)) Then Exit For
    ltime = 0
    Do While MSComm1.InBufferCount = 0
  '  ltime = ltime + 1
  '  If ltime > 10000 Then GoTo ErrCard
    Loop
    
Next

ErrCard:



End Sub

Private Function ReadCd() As Boolean

Dim GetData As Variant
Dim getText(7) As String
Dim Blocknum As Integer


On Error Resume Next
GetData = ReadCard(1)
Blocknum = AscB(MidB(GetData, 4, 1)) \ 4
If Blocknum = 0 Then
    GetData = ReadCard(0)
    Blocknum = AscB(MidB(GetData, 4, 1)) \ 4
    If Blocknum = 0 Then
        GetData = ""
        GoTo RD001
        Exit Function
    End If
    Label4.Caption = "RF/64格式"
    Label4.BackColor = &HFF&
    RF32Type = 0
Else
    Label4.Caption = "RF/32格式"
    Label4.BackColor = &H800000
    RF32Type = 1
End If

RD001:
Conv2Txt GetData, getText

If getText(7) <> "" Then
    ReadCd = True
Else
    ReadCd = False
End If

End Function

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -