VC封装USB接口的智能卡读写(应用层)
VC封装USB接口的智能卡读写(应用层)
编译时需要包含头文件“Winscard.h”和库文件winscard.1ib。
第一步要通过初始化连接函数获得设备的连接句柄:
SCARDCONTEXT hSC = NULL;
LONG IReturn = 0:
IReturn=SCardEstablishContext(SCARDCOPE SER.NULL.NULL.& hSC):
第一个参数指定资源管理连接的范围,另一个可选值为SCARD_SCOPE_ SYSTEM。
第二步要取得读写器列表:
char szReaderNameList[MAX_RESPONSE]:
DWORD dwLength = O:
IReturn= SCardListReaders(hSC,NULL, szReaderNameList,&dwLength):
如果调用成功,则szReaderNameList中存放的是读写器的名字,如果有多个则中间用‘\O’分割,dwLength的值为返回的有效字符的长度,包括所有的‘\O’。得到读写器的名字后就可以取得某个读写器中智能卡的句柄.
第三步要取得指定读写器中卡片的句柄(与卡片建立连接):
要取得读写器列表中第一个读写器中卡片的句柄:
SCARDHANDLE hCardHandIe = NULL;
DW0RD dwActiveProtocol= O:
IReturn=SCardConnect{hSC,szReaderNameList,SCARD_SHARE_EXCLUSIVE,SCARD_ PROTOCOL_T0,
SCARD_PR0T0C0L_T1,& hCardHandle,&dwActiveProtoco1);
第三个参数表示连接的共享模式, 另外两个模式是SCARD_SHARE SHARED和SCARD_SHARE_DIRECT。第四个参数指定首选的通信协议类型包括T:0和T=1,dwActiveProtocol返回最终确定的通信协议类型。注意:调用此函数时读写器中如果没有智能卡则会返回相应错误。
以上两个函数可以实现卡片的检测??
第四步与卡片进行交互:
1、获得智能卡的句柄后就可以对卡片进行操作了,如读取ATR:
char szReaderName[300]:
DWORD dwATRLength = 40;
BYTE pbyATR[40];
DW 0RD dwCardState = 0:
IReturn = SCardStatus(hCardHandle,szReaderName, &dwLength, &dwCardState,
&dwActiveProtoco1, pbyATR.&dwATRLength):
调用成功后dwATRLength的值就是实际读出的ATR的长度。
2、向卡片发送命令并获得结果:
SCARD_IO_REQUEST ScardlORequest;
Scardl0Request.dwProtocol=dwActiveProtocol;
ScardlORequest.cbPciLength =sizeof(SCARD_IO_REQUEST);
BYTE pbyCommand[20];
//此处加入设置要发送的命令的代码...
BYTE pbyReceived[100];
DW0RD dwRecLength = sizeof(pbyReceived);
IReturn = SCardTransmit(hCardHandle, &Scard10Request,pbyCommand,5,NULL,pbyReceived,& dwRecLength):
ScardlORequest.dwProtocol的值应该设置为最终确定的通信协议类型,第四个参数指定要发送的命令的长度,如果调用成功,则dwRecLength的值就是收到的应答的长度。
注:在开始事务处理前要调用SCardBeginTransaction(hCardHandle)。该函数启动一个事务,启动前等待对hCardHandle操作的所以事务结束。启动后阻塞所有对该卡片存取的应用程序。
结束事务处理时要调用SCardBeginTransaction(hCardHandle,SCARD_LEAVE_CARD)。该函数对应于之前声明的事务,使得其他应用程序对卡片的访问激活。
第五步断开与卡片的连接:
当对卡片的操作完成后应该断开与卡片的连接:
IReturn=SCardDisconnect{hCardHandle,SCARD_UNPOWER_ CARD);
第二个参数指定断开连接时读写器要执行的操作,其他的可选值包括SCARD_LEAVE CARD、SCARD_RESET CARD 和SCARD_EJECT_CARD。
第六步释放读卡器设备句柄:
在对所有的读写器的操作都完成以后,需要释放设备的连接句柄:SCardReleaseContext(hSC);
VC封装USB接口的智能卡读写(应用层)相关推荐
- VC++编写USB接口通讯程序
用VC++编写USB接口通讯程序 摘要:详细介绍Visual C++ 6.0环境下利用Windows API(Application Program Interface)函数来实现与符合HID设备类的 ...
- USB接口 在单片机读写U盘 项目中的应用
2019独角兽企业重金招聘Python工程师标准>>> 一. USB接口是什么? 通俗地说法: USB是一个外部总线标准,用于规范电脑与外部设备的连接和通讯.USB接口即插即用 ...
- 用VC++实现USB接口读写数据的程序
使用一个GUIDguidHID_1查找并打开一个USB设备 extern "C" int PASCAL SearchUSBDevice() {HANDLE hUsb;int nCo ...
- 用c语言编写rfid读卡系统,USB免驱RFID读写器编程解析之一:智能卡篇
随着RFID应用的普及,越来越多的软件工程师需要使用RFID读写器编程来实现自己的需求.为了使软件工程师更快的了解RFID读写器的使 用,本文选择一款市面上常用的USB免驱RFID读写器SDT-HA来 ...
- A40I工控主板(SBC-X40I)USB接口读写测试
SBC-X40I产品特性 采用Allwinner公司Cortex-A7四核A40i处理器,运行最高速度为1.2GHZ: 支持Mali-400MP2 GPU,支持OpenGL ES 2.0 / Open ...
- USB接口Altium designer原理图PCB封装
(1)USB接口Altium designer原理图&PCB封装 放假了,花了点时间整理一下设计PCB需要的库,这里先分享最最最最常用一些类,后面会继续补充 2022-01-16 大家要是觉得 ...
- USB HID读卡器 M1卡读卡器 Mifare 读写器 NFC方案 NFC读写器方案 usb 接口NFC读写器 ISO14444 TypeA 协议读写器 S50/S70 usb读写器 提供Demo
[产品简介] USB Mifare卡系列读写设备是一款简单.实用的13.56MHz非接触式IC卡读写器 可读写银行卡.公交卡.校园卡.燃气卡.MifareS50卡,S70卡(ISO14443A ...
- USB接口Ntag 213/215/216系列读卡器发卡器 Ntag标签读写器发卡器 NFC标签读卡器 ISO14443读卡器 TypeA标签发卡器
产品简介] USB Ntag标签读写设备是一款简单.实用的13.56MHz非接触式IC卡读写器 可读写Ntag213/215/216系列标签.银行卡.公交卡.校园卡.燃气卡.Mifare ...
- STM32 通过USB接口读写挂载的SD卡(支持fatfs文件系统)
通过USB接口读写挂载的SD卡 HAL库 标准库 本文以STM32F407为例分别用HAL库(STM32CubeMX)和标准库实现SD卡对fatfs支持,以及通过USB接口读写SD卡.首先看电路连接: ...
最新文章
- Linux grep 命令
- ios点击大头针气泡不弹出_地图大头针气泡点击事件
- 数学建模matlab imread,《matlab数学建模方法与实践》第三章 数据的处理
- matlab读取txt数据绘图(python命令行传参)
- input.get_shape()的用法
- zookeeper集群部署监控与选举同步流程等工作原理
- 第七章 进程环境 | 001 命令形参、gcc与g++的使用
- #并行优化# 容错算法 (Fault Tolerant)
- java获取运行时对象,java 面向对象(四十一):反射(五)反射应用二:获取运行时类的完整结构...
- centos8共享文件夹挂载_linux挂载群辉的NFS共享文件夹
- Android Studio(五):修改Android Studio项目包名
- Ubuntu中使用freeradius配置RADIUS,并在RADIUS中配置LDAP 并实现AP认证
- python线程池原理_Django异步任务线程池实现原理
- SSH框架微服务改进实战
- 【图像分割】基于matlab人工鱼群算法图像分割【含Matlab源码 1488期】
- 使用pytorch中预训练模型VGG19获取图像特征,得到图像embedding
- java解析md文件_md格式详解
- 5.13 广东移动 笔试题
- hadoop基础【Shuffle全部流程、OutputFormat输出、ReduceJoin案例实操】
- 一个蚂蚁森林能量自动收获脚本