首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

一个使用USB读卡器的程序,当程序错误中断时,读卡器的USB接口需要重新插拔一下方可再次使用,可不可以直接在程序中编写代码 代替 重新挺拔USB接口 这一动作

2013-07-08 
一个使用USB读卡器的程序,当程序异常中断时,读卡器的USB接口需要重新插拔一下方可再次使用,可不可以直接在

一个使用USB读卡器的程序,当程序异常中断时,读卡器的USB接口需要重新插拔一下方可再次使用,可不可以直接在程序中编写代码 代替 重新挺拔USB接口 这一动作
一个使用USB读卡器的程序,在调试程序的过程中,当程序异常中止时,读卡器的USB接口需要重新插拔一下方可再次使用,可不可以直接在程序中编写代码 代替 重新挺拔USB接口 这一动作。

还有,为什么重新插拔一下USB接口就可以用了,在这一动作中,拔出之后操作系统释放了什么,插入之后操作系统又生成了什么?

期望高手们能给予一个清晰有解答。
[解决办法]
看看硬件驱动接口是否提供了Reset之类的借口函数,如果有,按照要求发送一个Reset命令给读卡器

拔了了再插,相当于一次复位操作,使其内部状态恢复到原始值
[解决办法]
我的读卡器应用中 Reset 按钮代码。核心是 SCardDisconnect 和 SCardConnectA,相当于向读卡器发送了 PowerOff 和 PowerOn 请求。

有一些控件设置的语句,你可以跳过不看。

Private Sub cmdReset_Click()
Dim RecvLen As Long
Dim lngStatus As Long
Dim n As Integer

cmdDownload.Enabled = False
cmdAddress.Enabled = False
cmdSend.Enabled = False
cmdErase.Enabled = False

If hCntxt Then SCardReleaseContext hCntxt

RetVal = SCardEstablishContext(SCARD_SCOPE_SYSTEM, lngNull, lngNull, hCntxt)
If RetVal Then RetErr

txtRet = ""
txtInf = ""
txtSW1 = ""
txtSW2 = ""
txtInf = ""
Me.Refresh
curReader = Combo1.Text


myReaderState(0).szReader = curReader & vbNullChar
myReaderState(0).dwCurrentState = 0
RecvLen = 1

RetVal = SCardGetStatusChangeA(hCntxt, &HFFFFFFFF, myReaderState(0), RecvLen)
If RetVal Then RetErr: Exit Sub

lngStatus = myReaderState(0).dwEventState
strATR = ""
For i = 0 To myReaderState(0).cbAtr - 1
strATR = strATR & B2H(myReaderState(0).rgbAtr(i))
Next i
SpacePadding strATR, txtInf

If hCard <> 0 Then SCardDisconnect hCard, SCARD_UNPOWER_CARD
RetVal = SCardConnectA(hCntxt, curReader, SCARD_SHARE_EXCLUSIVE, SCARD_PROTOCOL_T0 Or SCARD_PROTOCOL_T1, hCard, Protocol)
If RetVal Then
RetErr
Exit Sub


End If

RetVal = SCardGetStatusChangeA(hCntxt, &HFFFFFFFF, myReaderState(0), RecvLen)
If RetVal Then RetErr: Exit Sub

lngStatus = myReaderState(0).dwEventState
strATR = ""
For i = 0 To myReaderState(0).cbAtr - 1
strATR = strATR & B2H(myReaderState(0).rgbAtr(i))
Next i

If lngStatus And 32 Then
RetState "Reset OK"
cmdDownload.Enabled = True
cmdAddress.Enabled = True
cmdSend.Enabled = True
cmdErase.Enabled = True
cmdExec.Enabled = True
txtCLA.SetFocus
pcb = 0
Else
RetState CardState(lngStatus)
End If
End Sub

热点排行