none
VB6.0 編譯錯誤 RRS feed

  • 一般討論

  • 最近再利用RFID寫學生專題

    於是到學校圖書館借了[RFID實踐非接觸式智慧卡系統開發-邱瑩青著]這本書

    這本書的第11章是有關於讀取卡號的章節

    按照它的步驟一步一步做

    程式碼如下

    -------------------------------------------------------------------------

    Dim Ans As Boolean
    Dim tmpStr As String

    Private Function SendComm(SStr) As Boolean
    Dim SendData() As Byte
    Dim I As Integer
    ReDim SendData((Len(SStr) / 2) - 1)
    SendComm(I) = Val("&H" + Mid$(SStr, I * 2 + 1, 2))
    Next I
    MSComm1.Output = SendData
    SendComm = True
    End Function

    Public Function CMD485(ByVal SAdd, ByVal SCmd, ByVal sData) As String

            Dim SSDATA As String
            Dim II, CHKS As Integer
            SSDATA = ""
            SSDATA = SSDATA + Mid$(Hex(SAdd + 256), 2, 2)
            SSDATA = SSDATA + Mid$(Hex(Len(SCmd) + (Len(sData) / 2) + 256), 2, 2)
            SSDATA = SSDATA = Mid$(Hex(Asc(SCmd) + 256), 2, 2)
            SSDATA = SSDATA + sData
            CHKS = 0
            For II = 1 To Len(SSDATA) Step 2
                CHKS = CHKS Xor Val("&H" + Mid$(SSDATA, II, 2, 2))
            Next
            CMD485 = "02" + SSDATA + Mid$(Hex(CHKS + 256), 2, 2) + "03"
            
        End Function

    Private Sub Timer1_Timer()
    Dim TmpCnt1, TmpCnt2 As Double
    Dim RcvData() As Byte
    Dim I As Integer
    Timer1.Enabled = False
    If MSComm1.InBufferCount <> 0 Then
       TmpCnt1 = 0
       tmpStr = ""
       Do While TmpCnt1 < 1000
          DoEvents
          If MSComm1.InBufferCount <> 0 Then
          TmpCnt1 = 0
          TmpCnt2 = MSComm1.InBufferCount
          ReDim RcvData(TmpCnt2)
          RcvData = MSComm1.Input
          DoEvents
          For I = 0 To TmpCnt2 - 1
              tmpStr = tmpStr + Mid(Hex(RcvData(I) + 256), 2, 2)
          Next
          Ans = SendComm("06")
          Else
             TmpCnt1 = TmpCnt1 + 1
          End If
          Loop
          If tmpStr <> "" Then
              Call ShowData
              End If
              End If
              Timer1.Enabled = True
              
              End Sub

    Private Sub ShowData()
         If Mid(tmpStr, 7, 2) = "02" Then
             txtCardID.Text = Mid(tmpStr, 9, 8)
             End If
    End Sub

    Private Sub cmdConnect_Click()

    On Error Resume Next
    If MSComm1.PortOpen = False Then
       MSComm1.CommPort = 3
       MSComm1.Settings = "9600,n,8,1"
       MSComm1.PortOpen = True
       Timer1.Enabled = True
       cmdConnect = "關閉連線"
       Check1.Value = 1
     Else
       MSComm1.PortOpen = False
       Timer1.Enabled = True
       cmdConnect.Caption = "建立連線"
       Check1.Value = 0
     End If
     
    End Sub

    Private Sub cmdSelect_Click()
        Ans = SendComm(CMD485("1", "s", ""))
        If Ans = Turn Then
            Check2.Value = 1
            End If
    End Sub

    -------------------------------------------------------------------------

    在執行的時候卻發生錯誤

    Mid$這邊他顯示

    [編譯錯誤 引數的個數錯誤或指定了不正確的屬性]

    請問是哪裡出了問題呢?

    2012年11月13日 下午 01:05

所有回覆

  • 從不知道VB6 有個 Mid$方法???

    http://msdn.microsoft.com/zh-tw/library/05e63829(v=vs.80).aspx


    理直氣和,切記。

    http://blog.kkbruce.net

    2012年11月13日 下午 01:09
  • 2012年11月13日 下午 01:17
  • 你這行錯了吧   CHKS = CHKS Xor Val("&H" + Mid$(SSDATA, II, 2, 2)) 

    Mid$ 要不是兩個參數就是三個參數, 你傳了四個, 書上明明是三個, 簡單說就是你抄錯了, 所以不要光抄, 也要理解一下才行.

    Visual Basic 6 String Functions


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年11月13日 下午 01:24
    版主
  • Bill Chuag ... 我書讀太少了,真不知VB6有Mid$ … 筆記中。

    補上一篇 mid 與 mid$ 的差異:http://stackoverflow.com/questions/519579/mid-vs-mid


    理直氣和,切記。

    http://blog.kkbruce.net


    • 已編輯 KKBruceMVP 2012年11月13日 下午 02:02 補充差異資料
    2012年11月13日 下午 01:59
  • 摁摁 果然是我的錯
    那我想請問一下 
    我修改了之後 Run完 能開啟Com port 3
    但是按下讀取卡號的時候卻無反應
    這樣是不是這段程式跟我的Reader不合呢?
    2012年11月13日 下午 02:02
  • 不同的卡機通常協定格式都不一樣. 請洽你的廠商取得通訊協定文件.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年11月13日 下午 04:00
    版主
  • 翻了很多書

    也看了廠商給的通訊協定文件知道Sector 0 的Block 0是儲存卡號

    卡號是4個Byte

    通訊協定文件有些地方摸不太懂 也不懂得如何應用到程式裡面

    2012年11月14日 下午 02:42
  • 2012年11月14日 下午 03:04
  • 你借來的那本書應該有講原理吧, 至少你傳的照片上就講到 "組合通訊協定".

    所以, 好好把那本書的內容讀通. 而不是只急著把程式寫出來, 因為這樣你永遠寫不出來的.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年11月14日 下午 06:05
    版主