IC卡就麻烦多了,因为每种IC卡的基本原理相同,单具体到接口函数时差别较大,所以需要为每种卡专门做功能函数。另外,IC卡一般都是需要主动读取的,因为他们一般都是通过COM口发送数据的,接触式的一般是主动读取方式,射频卡一般是事件触发(射频卡刷卡事件)。以上只是我知道的,可能还有别的方式我不知道,请专家指教。

解决方案 »

  1.   

    不是的,基本上IC卡读写器都有接口函数,关键在于了解他们的读取方法。其实IC卡是次要的,主要的在读写器,一般一个读写器能够读写很多种IC卡,但接口函数是一样的。
      

  2.   

    给你两个例程,分别是读卡号和减金额的
    * ** ICReadCardID.PRGDECLARE INTEGER InitPort IN CardReader.DLL INTEGER nPort
    DECLARE INTEGER ReadCardID IN CardReader.DLL
    DECLARE INTEGER GetErrorCode IN CardReader.DLL
    DECLARE INTEGER ClosePort IN CardReader.DLLnCOM_Port = INT(VAL(READICCARDINI("ICCARD.INI", "COM_PORT")))IF NOT BETWEEN(nCOM_Port, 1, 2)
       nCOM_Port = 1
    ENDIFWAIT "初始化 IC 卡串行口(" + STR(nCOM_Port, 1) + ") ..." WINDOW NOWAITIF InitPort(nCOM_Port) = 0
       WAIT CLEAR
       =MessageBox("初始化 IC 卡串行口(1)错误!", 48, "IC 卡操作失败")
       RETURN ""
    ELSE
       WAIT "读取 IC 卡号 ..." WINDOW NOWAIT
       nCardID = ReadCardID()
       IF nCardID > 0
          =ClosePort()
          WAIT CLEAR
          RETURN ALLTRIM(STR(nCardID))
       ENDIF
    ENDIF
    nError = GetErrorCode()
    =ClosePort()
    cErrorMessage = "出现未知错误!"
    DO CASE
    CASE nError = -1
       cErrorMessage = "IC 卡没有插入!"
    CASE nError = -2
       cErrorMessage = "读卡器检测失败!"
    CASE nError = -3
       cErrorMessage = "读数据失败!"
    CASE nError = -4
       cErrorMessage = "此 IC 卡不适合此操作!"
    CASE nError = -5
       cErrorMessage = "IC 卡数据已损坏!"
    CASE nError = -6
       cErrorMessage = "当前的卡不是学生卡!"
    CASE nError = -7
       cErrorMessage = "卡号不正确!"
    CASE nError = -8
       cErrorMessage = "IC 卡密码出错!"
    CASE nError = -9
       cErrorMessage = "写数据过程失败!"
    CASE nError = -10
       cErrorMessage = "没有足够的金额扣除!"
    CASE nError = -11
       cErrorMessage = "参数不正确!"
    ENDCASE
    WAIT CLEAR
    =MessageBox(cErrorMessage, 48, "IC 卡操作失败")
    CLEAR DLLS
    RETURN ""
    * ** ICDecrease.PRGLPARAMETERS cCardNo, nDecreaseMoney
    DECLARE INTEGER InitPort IN CardReader.DLL INTEGER nPort
    DECLARE INTEGER ReadCardID IN CardReader.DLL
    DECLARE INTEGER GetErrorCode IN CardReader.DLL
    DECLARE INTEGER ClosePort IN CardReader.DLL
    DECLARE INTEGER Decrease IN CardReader.DLL INTEGER nCardID, INTEGER nMoney, INTEGER @ Ballance, INTEGER @ SerialID nCOM_Port = INT(VAL(READICCARDINI("ICCARD.INI", "COM_PORT")))IF NOT BETWEEN(nCOM_Port, 1, 2)
       nCOM_Port = 1
    ENDIF
    WAIT "初始化 IC 卡串行口(" + STR(nCOM_Port, 1) + ") ..." WINDOW NOWAIT
    IF InitPort(nCOM_Port) = 0
       WAIT CLEAR
       =MessageBox("初始化 IC 卡串行口(" + STR(nCOM_Port, 1) + ")错误!", 48, "IC 卡操作失败")
       RETURN .F.
    ENDIFnCardID = INT(VAL(cCardNo))
    nMoney = INT(nDecreaseMoney * 100)    && 元转化为分
    nBallance = 0
    nSerialID = 0WAIT "扣除罚款金额(" + ALLTRIM(STR(nMoney/100, 10,2)) + ") ... " WINDOW NOWAITnResult = Decrease(nCardID, nMoney, @nBallance, @nSerialID)IF nResult # 0
       =ClosePort()
       IF NOT FILE("ICConsume.DBF")
          CREATE TABLE ICConsume (卡号 C(14), 扣款金额 N(10,2), 余额 N(10,2), 操作序号 I)
       ENDIF   
       INSERT INTO ICConsume (卡号, 扣款金额, 余额, 操作序号) VALUES (ALLTRIM(STR(nCardID)), nMoney/100, nBallance/100, nSerialID)
       =MessageBox("IC卡款额扣除成功!" + CHR(13) + CHR(10) + CHR(13) + CHR(10) + "操作序号:" + ALLTRIM(STR(nSerialID)) + CHR(13) + CHR(10) + "卡上余额:" + ALLTRIM(STR(nBallance/100, 10,2)), 64, "扣除成功")
       RETURN .T.
    ENDIF
    nError = GetErrorCode()
    =ClosePort()
    cErrorMessage = "出现未知错误!"
    DO CASE
    CASE nError = -1
       cErrorMessage = "IC 卡没有插入!"
    CASE nError = -2
       cErrorMessage = "读卡器检测失败!"
    CASE nError = -3
       cErrorMessage = "读数据失败!"
    CASE nError = -4
       cErrorMessage = "此 IC 卡不适合此操作!"
    CASE nError = -5
       cErrorMessage = "IC 卡数据已损坏!"
    CASE nError = -6
       cErrorMessage = "当前的卡不是学生卡!"
    CASE nError = -7
       cErrorMessage = "卡号不正确!"
    CASE nError = -8
       cErrorMessage = "IC 卡密码出错!"
    CASE nError = -9
       cErrorMessage = "写数据过程失败!"
    CASE nError = -10
       cErrorMessage = "没有足够的金额扣除!"
    CASE nError = -11
       cErrorMessage = "参数不正确!"
    ENDCASE
    WAIT CLEAR
    =MessageBox(cErrorMessage, 48, "IC 卡操作失败")
    RETURN .F.* ** ReadICCardINI.PRG
    LPARAMETERS lIniFile, lcParaStr
    PRIVATE ALL
    nFp = FOPEN(lIniFile)
    IF nFp <= 0
       RETURN ""
    ENDIF
    lcParaStr = ALLTRIM(UPPER(lcParaStr))
    cReturn = ""
    DO WHILE NOT FEOF(nFp)
       nParaLine = FGETS(nFp)
       nParaLine1 = CHRTRAN(nParaLine, " ", "")
       IF UPPER(LEFT(nParaLine1, LEN(lcParaStr) + 1 )) == lcParaStr + "="
          cReturn = ALLTRIM(SUBSTR(nParaLine, AT("=", nParaLine) + 1))
          EXIT
       ENDIF
    ENDDO
    =FCLOSE(nFp)
    RETURN cReturn
    * *** ICCard.INI
    COM_PORT=1
    PASSWORD = "AAA"
    XX = Dalian Perfect
      

  3.   

    Foxer兄说得对,扫描条码和用键盘输入是一样的,只不过扫描完后一般条码枪会自动给你加个回车.在程序中处理一下这个回车就可以了.如果条码枪和驱动都正确安装了,程序不需要做其它的改动就可以支持的.
      

  4.   

    to Foxer(狐狸) :实现我的话,请到些帖领分,再次感谢!http://www.csdn.net/expert/topic/1013/1013162.xml?temp=3.820437E-02
      

  5.   

    那扫描进去后。在VFP中用什么函数来进行处理。谢谢各位!
      

  6.   

    什么函数都不用,直接输入到TexBox里就行了
      

  7.   

    再加一句,如果条形码号中都是数字,如果想获得数字的,就给TextBox.Value赋初始值0,如果想获得字符串,就给它赋初始值""