C如何读取IC卡,IC卡的操作代码

合集下载

IC卡读写

IC卡读写

IC卡应用IC(Integrated Circuit)卡,也被称作智能卡(Smart Card),具有写入数据和存储数据的功能,IC卡内存储器的内容可以根据需要有条件地供外部读取,完成信息处理和判定。

由于其内部具有集成电路,不但可以存储大量信息,具有极强的保密性能,并且还具有抗干扰、无磨损、寿命长等特性。

因此在各个领域中得到广泛应用。

下面通过两个实例介绍IC 卡的简单应用。

实例422 向IC卡中写入数据实例说明IC卡是携带应用信息和数据的媒体,空白IC卡是不能立即使用的,必须对IC卡应用系统进行初始化,写入系统IC卡和个人密码,个人专用信息和应用数据。

下面介绍如何向IC卡中写入数据。

运行本例,在“数据”文本框中输入要存入IC卡中的数据,单击“写数据”按钮,即可将输入的数据写入IC卡中。

如图所示。

技术要点本例使用的是深圳明华生产的明华IC卡读写器,用户在使用时将驱动程序安装完毕后,即可正常使用本系统。

本例通过调用链接库,进行IC卡的读写工作。

下面介绍与IC卡写操作相关的几个函数。

(1)auto_init函数该函数用于初始化IC卡读卡器。

语法如下:public static extern int auto_init(int port, int baud);参数说明如下。

l port:标识端口号,Com1对应的端口号为0;Com2对应的端口号为1,依此类推。

l baud:标识波特率。

l 返回值:如果初始化成功,返回值是IC卡设备句柄;如果初始化失败,返回值小于零。

(2)setsc_md函数该函数用于设置设备密码模式。

语法如下:public static extern int setsc_md(int icdev, int mode);参数说明如下。

l icdev:标识设备句柄,通常是auto_init函数的返回值。

l mode:标识设备密码模式,如果为0,设备密码有效,设备在加电时必须验证设备密码才能对设备进行操作。

第29章单片机实现IC卡读卡器参考程序

第29章单片机实现IC卡读卡器参考程序

第29章单片机实现IC卡读卡器参考程序#include //51单片机头文件typedef unsigned char uchar;//类型定义typedef unsigned int uint; //类型定义sbit SCL=P1^3;//定义串行时钟引脚sbit SDA=P1^2; //定义串行数据引脚sbit AlarmCon=P1^0; //定义报警控制引脚uchar DB[4]; //定义显示缓冲区uchar RecePosi; //定义串口接收缓冲区索引变量//定义共阳极显示段码uchar code SEGCODE[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80, 0X90};#define CHARSTART 0X60//定义起始字符#define CHAREND 0X03//定义结束字符#define SEARCHCARD 15//定义寻卡延时时间,5ms为单位#define READCARD 50//定义读卡延时时间,5ms为单位#define WRITECARD 51//定义写卡延时时间,5ms为单位#define STOPCARD 10//定义停卡延时时间,5ms为单位#define SEARCHNUM 6//定义寻卡命令字节数#define READNUM 14//定义读卡命令字节数#define WRITENUM 30//定义写卡命令字节数#define STOPNUM 6//定义停卡命令字节数uchar COMMB[30];//串口接收缓冲区uchar code keytype=0;//采用密码Auchar code blockno=13;//使用第13块数据区uchar code cardkey[6]={0xff,0Xff,0Xff,0Xff,0Xff,0Xff};//定义IC 卡密码/*入口参数:num:待显示的字符出口参数:无*/void Disp_One_Led(uchar num){uchar i;SCL=0;//控制SCL输出低电平for(i=0;i<8;i++)//需要发送8位二进制数{SDA=num&0x80;//将数据最高位通过SDA引脚发送出SCL=1; 控制SCL输出高电平SCL=0; 控制SCL输出低电平num<<=1;//生成下次发送的最高位585}}void Disp_All_Led(){uchar i;for(i=0;i<4;i++)//4位LED数码管{Disp_One_Led(SEGCODE[DB[i]]); //将显示缓冲区的某个字符显示}}void Create_Comm_Search(){COMMB[0] = CHARSTART;COMMB[1] = 0x02;COMMB[2] = 0x0B;COMMB[3] = 0x61;COMMB[4] = xorcheck(4);COMMB[5] = CHAREND;}/*入口参数:无出口参数:是否有IC卡。

基于单片机的IC卡读写

基于单片机的IC卡读写

基于单片机的IC卡读写系统实验目的:1.学会并掌握可keil软件的使用;2.学会并掌握protues软件的使用;3.实现基于单片机的IC卡读写;4.通过实验巩固单片机相关知识和检验自身动手能力实验要求:掌握单片机相关知识,利用单片机控制和射频模块组合来读写IC卡,并实现软硬件的仿真模拟。

lC卡读卡器以MCS-51系列单片机作为核心构成,主要用于家庭和机构门锁的开关,具有安全稳定的特点,在识别,删除,添加,自动开锁时,用于对IC卡进行读写操作。

实验设备和仪器:1.89c51单片机最小系统2.射频模块RC522,智能IC卡以及其他附加电路实验内容:本次实验设计是由小组五个成员共同完成基于单片机的IC卡读写系统并完成实物搭建和撰写实验报告。

方案一:实验步骤:1.利用protues画电路图,电路图如图1所示:图1:方案一电路图2.模拟刷卡后显示,如图二:图2:方案一实现图3.根据电路图编写C语言代码:代码如下:#include "reg52.h"#include "main.h"#include "mfrc522.h"#include <string.h>#include "LCD1602.h"#include "DS1302.h"#define uchar unsigned char#define uint unsigned intsbit Speak = P2^7;//蜂鸣器sbit RED = P3^4; //红色指示灯sbit GREEN = P3^3;//绿色指示灯sbit Relay = P3^2; //继电器sbit KEY1 = P1^3;//小时加按键sbit KEY2 = P1^4; //小时减按键sbit KEY3 = P1^5; //分钟加按键sbit KEY4 = P1^6; //分钟减按键sbit KEY5 = P1^7; //添加删除卡sbit KEY = P2^6; //开门unsigned char idata RevBuffer[30];unsigned char Card_Num;void iccardcode();//系统初始化void InitializeSystem()//IC卡初始化{PcdReset(); //IC卡初始化PcdAntennaOff(); //IC卡初始化PcdAntennaOn(); //IC卡初始化M500PcdConfigISOType( 'A' );//IC卡初始化}unsigned char idata UID[4],Temp[4];//读取卡号数组unsigned char Table[3];//显示数组unsigned char Num;unsigned char Count,Countf,Count1,Count2,Count3,Count4,Count5,C_flag;//卡序号void Auto_Reader(void) //自动寻卡{if(PcdRequest(0x52,Temp)==0) //找到卡{if(PcdAnticoll(UID)==0){Speak=0;delay_10ms(20);Speak=1;//蜂鸣器提示Table[0]=UID[0]/100+0x30; //卡号显示Table[1]=UID[0]/10%10+0x30; //卡号显示Table[2]=UID[0]%10+0x30; //卡号显示LCD1602_Disp_ZF(0x80+0x40,"Num: ",16); //卡号显示LCD1602_Disp_ZF(0x84+0x40,Table,3); //卡号显示Count = UID[0]; //判断卡是不是有效if((Count==Count1)||(Count==Count2)||(Count==Count3)||(Count==Cou nt4)||(Count==Count5)){LCD1602_Disp_ZF(0x88+0x40,"Welcome",7); //卡有效GREEN = 0;Relay=0;delay_10ms(200);Relay=1;GREEN = 1; //绿灯亮,打开继电器C_flag=1;}else{LCD1602_Disp_ZF(0x88+0x40,"Error ",7);//卡无效RED = 0;delay_10ms(500);RED = 1; //红灯亮C_flag=2;}delay_10ms(200);LCD1602_Disp_ZF(0x80+0x40,"Please Swipecard",16);//显示初始界面}}}uchar DS1302_Table[7]={0}; //读取时间值void Display_LCD2(uchar Dis_Hour,uchar Dis_Min,uchar Dis_Sec)//显示时间值{uchar Dis_Table[8]="11:22:33";Dis_Table[0] = Dis_Hour/10+0x30;Dis_Table[1] = Dis_Hour%10+0x30;Dis_Table[3] = Dis_Min/10+0x30;Dis_Table[4] = Dis_Min%10+0x30;Dis_Table[6] = Dis_Sec/10+0x30;Dis_Table[7] = Dis_Sec%10+0x30;LCD1602_Disp_ZF(0x85,Dis_Table,8);//显示时间值}void Run_DS1302(void){uchar sec, min, hour, day, month, week, year;v_W1302(0x8f, 0);sec = bcdtodec(uc_R1302(0x81)); //读出DS1302中的秒v_W1302(0x8f, 0);min = bcdtodec(uc_R1302(0x83)); //读出DS1302中的分v_W1302(0x8f, 0);hour = bcdtodec(uc_R1302(0x85)); //读出DS1302中的小时v_W1302(0x8f, 0);day = bcdtodec(uc_R1302(0x87)); //读出DS1302中的日v_W1302(0x8f, 0);month = bcdtodec(uc_R1302(0x89)); //读出DS1302中的月v_W1302(0x8f, 0);week = bcdtodec(uc_R1302(0x8b)); //读出DS1302中的星期v_W1302(0x8f, 0);year = bcdtodec(uc_R1302(0x8d)); //读出DS1302中的年DS1302_Table[0]=year;DS1302_Table[1]=month;DS1302_Table[2]=day;DS1302_Table[3]=week;DS1302_Table[4]=hour;DS1302_Table[5]=min;DS1302_Table[6]=sec;Display_LCD2(DS1302_Table[4],DS1302_Table[5],DS1302_Table[6]);//显示时间值}void main(void){InitializeSystem();LCD1602_init();//Money_1=x24c02_read(0X01);//x24c02_write(0X03,Money_3);LCD1602_Disp_ZF(0x80,"Time:",5);//0123456789abcdefLCD1602_Disp_ZF(0x80+0x40,"Please Swipecard",16);//LCD1602_Disp_ZF(0x80+0x40,"Num:",4);//ISP_ERASE(0x2c00); //注意:字节编程时必须要先要擦除整个扇区//for(i=0;i<255;i++)// ISP_PROGRAM(0x2c00+i, 0x00);while (1){//////////////////////////if(!KEY){Speak=0;delay_10ms(20);Speak=1;//蜂鸣器提示LCD1602_Disp_ZF(0x88+0x40,"Welcome",7); //卡有效GREEN = 0;Relay=0;delay_10ms(200);Relay=1;GREEN = 1; //绿灯亮,打开继电器delay_10ms(200);LCD1602_Disp_ZF(0x80+0x40,"Please Swipecard",16);//显示初始界面}Run_DS1302(); //时间显示//delay_10ms(200);if(!KEY1) //调节小时加{delay_10ms(50);if(!KEY1) //调节小时加{DS1302_Table[4]++; //调节小时加Write_DS1302Init(0,0,0,0,DS1302_Table[4],DS1302_Table[5],0); //调节小时加}}if(!KEY2) //调节小时减{delay_10ms(50);if(!KEY2) //调节小时减{ //调节小时减DS1302_Table[4]--; //调节小时减Write_DS1302Init(0,0,0,0,DS1302_Table[4],DS1302_Table[5],0);//调节小时减}}//////////////////////////////////if(!KEY3) //调节分钟加{delay_10ms(50); //调节分钟加if(!KEY3){DS1302_Table[5]++; //调节分钟加Write_DS1302Init(0,0,0,0,DS1302_Table[4],DS1302_Table[5],0); //调节分钟加}}if(!KEY4) //调节分钟减{delay_10ms(50); //调节分钟减if(!KEY4) //调节分钟减{DS1302_Table[5]--; //调节分钟减Write_DS1302Init(0,0,0,0,DS1302_Table[4],DS1302_Table[5],0); //调节分钟减}}if(!KEY5) //添加删除卡{delay_10ms(50);if(!KEY5) //添加删除卡{if(C_flag==2) //添加卡{//0123456789abcdefLCD1602_Disp_ZF(0x80+0x40," Register Card! ",16);Countf++;if(Countf==6)Countf=1;if(Countf==1) Count1 = Count;//记忆卡号if(Countf==2) Count2 = Count; //记忆卡号if(Countf==3) Count3 = Count; //记忆卡号if(Countf==4) Count4 = Count; //记忆卡号if(Countf==5) Count5 = Count;//记忆卡号}if(C_flag==1)//删除卡{//0123456789abcdefLCD1602_Disp_ZF(0x80+0x40," Clean Card! ",16);if(Count==Count1)Count1=0;//删除卡号if(Count==Count2)Count2=0; //删除卡号if(Count==Count3)Count3=0; //删除卡号if(Count==Count4)Count4=0; //删除卡号if(Count==Count5)Count5=0; //删除卡号}Speak=0;delay_10ms(200);Speak=1;LCD1602_Disp_ZF(0x80+0x40,"Please Swipecard",16);C_flag =0;while(!KEY5);}}//////////////////////}}void iccardcode(){unsigned char cmd;unsigned char status;cmd = RevBuffer[0];switch(cmd){case 1: // Halt the card //终止卡的操作status= PcdHalt();;RevBuffer[0]=1;RevBuffer[1]=status;break;case 2: // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)// 寻卡,防冲突,选择卡返回卡类型(2 bytes)+ 卡系列号(4 bytes)status= PcdRequest(RevBuffer[1],&RevBuffer[2]);if(status!=0){status= PcdRequest(RevBuffer[1],&RevBuffer[2]);if(status!=0){RevBuffer[0]=1;RevBuffer[1]=status;break;}}RevBuffer[0]=3;RevBuffer[1]=status;break;case 3: // 防冲突读卡的系列号MLastSelectedSnrstatus = PcdAnticoll(&RevBuffer[2]);if(status!=0){RevBuffer[0]=1;RevBuffer[1]=status;break;}//memcpy(MLastSelectedSnr,&RevBuffer[2],4);RevBuffer[0]=5;RevBuffer[1]=status;break;case 4: // 选择卡 Select Card//status=PcdSelect(MLastSelectedSnr);if(status!=MI_OK){RevBuffer[0]=1;RevBuffer[1]=status;break;}RevBuffer[0]=3;RevBuffer[1]=status;break;case 5: // Key loading into the MF RC500's EEPROM//status = PcdAuthState(RevBuffer[1], RevBuffer[3], DefaultKey, MLastSelectedSnr);// 校验卡密码RevBuffer[0]=1;RevBuffer[1]=status;break;case 6:RevBuffer[0]=1;RevBuffer[1]=status;break;case 7:RevBuffer[0]=1;RevBuffer[1]=status;break;case 8: // Read the mifare card// 读卡status=PcdRead(RevBuffer[1],&RevBuffer[2]);if(status==0){RevBuffer[0]=17;}else{RevBuffer[0]=1;}RevBuffer[1]=status;break;case 9: // Write the mifare card// 写卡下载密码status=PcdWrite(RevBuffer[1],&RevBuffer[2]);RevBuffer[0]=1;RevBuffer[1]=status;break;case 10:PcdValue(RevBuffer[1],RevBuffer[2],&RevBuffer[3]);RevBuffer[0]=1;RevBuffer[1]=status;break;case 12: // 参数设置PcdBakValue(RevBuffer[1], RevBuffer[2]);RevBuffer[0]=1; //contactRevBuffer[1]=0;break;}}4.实物验证结果如图4所示:图4:实物验证结果实物验证可以实现IC卡的读写,由于每个开发板不同,相比仿真程序,对实物验证程序进行了略微的修改,最小系统的LCD1602口不能使用使用外接杜邦线,为了稳定最终选择重新字节焊接板子,最终能达到要求。

采用89C2051单片机并基于C语言编程的IC卡读写器

采用89C2051单片机并基于C语言编程的IC卡读写器
通过采用8 C 0 1 9 2 5单片机并基于c 言编程的技术手段 , 语 使得设计周 期大大减少 , I 卡读写器的可靠性提高 了 c 很多 ,并且在 电 系统得到很 力
好 的应 用 。
3 单 片机C 语言 的编程及 应 用
目前在单片机里领域有很多处理器支 ̄ c编译器 ,这就是说对新 的 t r 处理器 , 我们也能很快上手 , 而不必知道处理器的内部结构, 这使得用c 语言写的程序 比汇编程序有更好 的可移植性 。但并不是说汇编语言 已不 在使用了,很多系统特别是实时时钟系统都是用C语 言和汇编语言联合 编写的。另外 ,硬件接 口的操作都应该用汇编语言来编写。 由于提供许 多标准子程序 ,所以具有较强的数据处理能力 , 能将 已 编好程序容易地植入新程序 ,因为它具有方便的模块化编程技术。 单片机C语言作为一种非常方便 的语言而得到广泛 的支持 ,C语言 程序本身并不依赖于机器硬件系统 , 基本上不做修改就可根据单片机的 不同较快地移植过来。 用单片机c语言进行程序 设计 ,已成为单 片机软件开发 的一个 主 流,作为一个技术全面并涉足较大规模的软件 系统开发的单片机开发人 员最好能够掌握基本的C 语言编程。 所以, 在单 片机 的开发应 用中 ,我们逐渐引入了高级语言 , C语 言就是其 中的一种 。c 语言作为一种高级 的编程语言 ,越来越受 到人们 的关注。它有着传统汇编语言无可 比拟的优点 ,它创造 了一种全新 的程 序开发模式 ,打破了传统汇编语言的限制,采用 了 先进 的结构化 和模块 化 ,大大提高了程序开发效率 ,使单片机 系统开发上 了一个新 台阶。结 合单片机 的系统资源,用c语言开发符合实际工程需要的单片机 系统 , 对于编程者来说具有重要的意义。 c语 言在单 片机系统开发 中的特点包括 :1 c语言 ,作为一种结 )

C#如何读取IC卡,IC卡的操作代码

C#如何读取IC卡,IC卡的操作代码

C#程序开发范例_IC卡读写C#程序开发范例宝典 13.3 IC卡应用/ 2007-9-7 16:37:00图书导读当前章节:13.3 IC卡应用·1.14 其他技术·13.1 串口控制·13.2 加密狗·13.4监控·13.5 语音卡控制·13.6 手机程序开发加拿大·达内专注高端it培训名企定向委培为纳斯达克上市公司定向委培高级软件工程师国内最强大专家团队组合授课,确保高薪就业管理不可能管理的项目!要减少失败的风险组织必须转向 IT 开发的治理模型如何开发智能客户端应用离线应用模块的合理利用/cd/ids...13.3 IC卡应用IC(Integrated Circuit)卡,也被称作智能卡(Smart Card),具有写入数据和存储数据的功能,IC卡内存储器的内容可以根据需要有条件地供外部读取,完成信息处理和判定。

由于其内部具有集成电路,不但可以存储大量信息,具有极强的保密性能,并且还具有抗干扰、无磨损、寿命长等特性。

因此在各个领域中得到广泛应用。

下面通过两个实例介绍IC卡的简单应用。

实例422 向IC卡中写入数据实例说明IC卡是携带应用信息和数据的媒体,空白IC卡是不能立即使用的,必须对IC卡应用系统进行初始化,写入系统IC卡和个人密码,个人专用信息和应用数据。

下面介绍如何向IC卡中写入数据。

运行本例,在“数据”文本框中输入要存入IC卡中的数据,单击“写数据”按钮,即可将输入的数据写入IC卡中。

如图13.6所示。

技术要点本例使用的是深圳明华生产的明华IC卡读写器,用户在使用时将驱动程序安装完毕后,即可正常使用本系统。

本例通过调用Mwic_32.dll链接库,进行IC卡的读写工作。

下面介绍与IC卡写操作相关的几个函数。

(1)auto_init函数该函数用于初始化IC卡读卡器。

语法如下:public static extern int auto_init(int port, int baud);参数说明如下。

用单片机实现通用存储器IC卡的读写

用单片机实现通用存储器IC卡的读写
用 ,99 2 ( ) l 19 ,5 3 :4~l 6
4 结 论
在 本 文 单 片 机 数 据 采 集 卡 的 研 制 中 , 于 选 用 了 由 A C集 成 芯 片 A 7 1 单 片 机 A 9 5 , 而 保 证 了 D D 70和 C 1从
收 稿 日期 :0 1 0 —0 。 2 0 — 6 l
de e r0
; 改 访 问计 数 器值 修
3 张尧 学 , 美林 . 算 机操作 系统 教程 . 京 : 华大 学 出版社 , 史 计 北 清
19 99
mo v
@ r . 0b
rt 中断 返 回 e; i
4 余 进 , 继 武 . 任 务 机 制 在 单 片 机 系 统 中 的 应 用 . 子 技 术 应 黄 多 电
传送数据 。

端 。 在 Ar4 0 / 2中 , 引 脚 被 硬 连 接 。 C 10 2 该

V G D,E T V 端 一 般 输 入 +5 ,N T S : V工 作 电 压 。
A 2 C系 列 用 于 I 14 C卡 时 的 引 脚 配 置 如 图 1所 示 。 图 1为 符 合 I(7 1 Sy8 6—2标 准 的 I C卡 触 点 。对 于

S L 串 行 时 钟 。 其 上 升 沿 时 数 据 输 入 每 个 C:
E P O 器件 , 降沿输 出。 ER M 下

S A 串行 数 据 。 该 引 脚 为 开 漏 极 驱 动 , 双 向 D : 可 A , lA : 件/ 面 寻 址 。 为 器 件 地 址 输 入 0A , 2器 页
进 行读写 。
2 硬 件 特 性及 基 本 电路 连接
21 A 2 . T 4系列 芯 片 特 性 A 2 列 芯片采用 C O T4系 M S工 艺 制 造 , 部 有 高 压 内 泵 , 在 单 电 压 供 电条 件 下 工 作 。标 准封 装 为 8 DP 可 脚 I 封装 , 脚功 能如下 : 引

迈瑞超敏 C 反应蛋白检测试剂盒(免疫比浊法)说明书

迈瑞超敏 C 反应蛋白检测试剂盒(免疫比浊法)说明书

【产品名称】通用名称:超敏C反应蛋白检测试剂盒(免疫比浊法)【包装规格】规格1300人份/盒,600人份/盒规格2100人份/盒规格3R1:1×1000ml R2:1×500ml规格4200人份/盒规格5R1:2×32ml R2:2×16ml(300人份/盒)质控品(选配):3×500μl水平1:1×500μl,水平2:1×500μl,水平3:1×500μl【预期用途】本试剂用于体外定量检测人全血中C反应蛋白(CRP)的含量。

CRP是机体的一种重要急性期蛋白,其具体的病理作用目前还不完全明确。

在各种急、慢性感染以及组织损伤时,CRP在数小时内迅速升高,病变消退时又迅速降到正常水平,与其他已知的急性相蛋白相比,CRP含量最高,在发病时变化最明显。

定量检测人全血中的C反应蛋白,适用于感染、炎性疾病、组织损伤、手术创伤及组织坏死等病变情况的辅助诊断;低浓度C反应蛋白的变化还是区分低水平炎症状态的灵敏指标,其水平与动脉粥样硬化及急性脑梗死等心脑血管疾病的发生、炎症程度及预后密切相关。

免疫比浊法灵敏度高,特异性好,测定速度快,适用于各类型生化自动分析仪或特定蛋白仪,现已在临床上普遍采用。

[3]【检验原理】本试剂采用羊抗人C反应蛋白多克隆抗体,定向偶联在胶乳表面,样本中的C反应蛋白与试剂中的抗体特异性结合,形成抗原抗体免疫复合物,使乳胶微球的交联度发生改变,从而使反应体系的浊度发生变化,胶乳试剂可以特异的增大该浊度变化,增大试剂的灵敏度,该浊度变化的高低与样本中C反应蛋白的含量成正比,通过测定特定波长处的吸光度值,按照多点定标校准曲线即可得出样本中C反应蛋白的含量。

【主要组成成分】试剂盒组成R1试剂组分包括:3-双(2-羟乙基)氨基-2-羟基丙磺酸(DIPSO)缓冲液,pH7.50.05mol/L氯化钠0.15mol/L曲拉通X-100(Triton X-100)0.1%聚乙二醇6000(PEG6000)1%R2:羊抗人C反应蛋白多克隆抗体致敏胶乳0.1%定标IC卡:溯源至ERM-DA4701说明书1质控品(选配):3×500μl 水平1:PBS缓冲液,pH7.5,小牛血清20%,C反应蛋白标准品1.0mg/L1水平2:PBS缓冲液,pH7.5,小牛血清20%,C反应蛋白标准品8.2mg/L1水平3:PBS缓冲液,pH7.5,小牛血清20%,C反应蛋白标准品24.1mg/L1不同批号试剂盒中各组分请勿互换使用。

IC卡的编程和使用

IC卡的编程和使用

C卡与其它卡片的区别主要是:IC 卡能在卡上存储器中安全可靠地存储大量有用信息,并且可以对数据提供多级安全保密措施.因此,为设计一个好的IC 卡应用系统,必须了解IC卡的数据结构特点.掌握IC卡的编程和读写方法.从使用角度来看,不管是普通存储卡,逻辑加密卡,或智能CPU卡,卡上必定有:用于与其它应用系统相区别的发行商代码, 用于与本系统中其他用户相区别的个人代码,用于控制对卡上数据修改的擦除密码,以及用于存放数据的存储区.由于IC 卡平时不与电源相接,要保证卡上存储的数据不会丢失,只能使用只读存储器即ROM 型存储器.因此卡上数据可以长期保存,一般数据可存放100年.又由于IC卡上数据在使用中要经常修改,故一般应该使用电可擦除可编程只读存储器,即EEPROM.一般IC 卡数据改写次数大于100000次.目前的各种IC卡应用系统中使用的IC卡主要是逻辑加密型卡. 这种卡带有多级密码保护,比普通存储卡安全性能强得多;同时又比智能CPU卡结构简单,不需要复杂的密码计算过程,而且结构简单,编程使用方便.本讲中以美国ATMEL公司的逻辑加密卡A T88SC1604为例,来说明对IC卡应用系统中的IC 卡发行软件和用户应用软件的编程方法,以及IC卡写入过程.一.逻辑存储卡的数据结构和编程特性A T88SC1604卡具有一个公用区和四个应用数据区.其数据结构如附表所示.公用区内有厂商代码,发行商代码,总密码,密码计数器等等.我们可以规划和利用这些数据区对全卡基本特性进行控制.应用区共四个,第个分区有自己的分区密码, 擦除密码,密码计数器和读写控制位,用于对本区内数据的写入,读出和修改进行控制.应用区其余部分是存储数据的存储单元.1604卡的第一分区存储容量为9K位,其它三个分区数据存储容量为2K位.连同公用区总存储量为16K位.厂商代码又叫制造商代码,是由IC卡制造商在卡出厂时写入.一般对某一发行商提供的一批卡提供同一代码,以便与其它厂商的卡相区别. 写入时将相应保护熔丝1熔断,此时IC卡开发者可以读出厂商代码,判断其生产厂商,但不能修改它.发行商代码:用于IC卡个人化,发卡时由系统软件写入, 用来表明此卡属于哪一应用系统.例如:工商行发行的金融IC卡写入的发行商代码,表明了所属的金融系统.此卡使用时,ATM机会自动核实这一代码.如果不正确,说明这不是本系统的卡,不能使用.发行商代码受熔丝2控制,熔断前,此密码可修改,熔断熔丝后.此密码可读出, 可核实,但不能修改.IC卡上的熔丝是IC卡个人化标记.除控制发行商代码外,也控制整个卡上数据的读写.熔丝熔断前,卡上数据读写受总密码SC和读写控制位控制, 各分区密码不起作用,此时可用IC 卡读写器对卡进行初始数据的规划和写入.熔丝熔断后, 卡发给用户个人,此时各分区数据操作不但受总密码SC控制,而且受各分区密码和擦除密码和控制.总密码SC一般用作用户密码,应通过IC卡发行软件中提供的用户环境,由用户自己设置并且写到卡上.此密码一旦写入,不可读出也不保留在系统中,只能核对.用户在以后使用IC卡时,可能通过由应用程序提供的密码核对功能界面,由用户本人键入加以核对.密码输入正确,说明是合法用户,可以对卡上数据进行读写.密码输入错误时,密码计数器SCAC减1.此外,在熔丝熔断之前,总密码还控制各分区密码的读写.密码计数器SCAC用于统计用户密码核对次数.输入正确密码时,计数器清零( 即8位全置-1-).每输错一次,计数器一位变为-0-,若八次输入错误,计数器各位全变为-0-时,则此卡已作废.擦除密码控制对存储器中已写数据的擦除.由于EEPROM 在写入数据时只能写入到空白区(即各位为-1-),对已写有数据的存储区只能先探险,后写入.每次要擦除一行信息.擦除密码在卡发行时写入,由应用系统控制,只能核实,不能读出以防止非法破坏卡上已有的数据.各分区有自己的分区密码,以便实现一卡多用.分区密码和分区擦除密码控制本区数据的读,写,擦操作.例如用一个1604卡兼工作证,医疗证,工资卡和就餐卡.在不同场合使用此卡时读写器分别核实各分区密码,仅操作本区数据,而不影响其它分区.存储分区位地址位数字节地址字节数FZ 厂方代码区0-15 16 0-1 2IZ 发行商代码16-79 64 2-9 8SC 总密码80-95 16 10-11 2SCAC 总密码错误计数器96-103 8 12 1CPZ 代码保护区104-167 64 13-20 8SC1 一区密码168-183 16 21-22 2S1AC 一区密码错误计数器184-191 8 23 1EZ1 一区擦除密码192-207 16 24-25 2E1AC 一区擦除密码错误计数器208-215 8 26 1AZ1 应用区一216-9775 9650 27-1221 1195SC2 二区密码9776-9791 16 1222-1223 2EZ2 二区擦除密码9792-9807 16 1224-1225 2E2AC 二区擦除密码错误计数器9808-9815 8 1226 1AZ2 应用区二9816-11863 2048 1227-1482 256SC3 三区密码11864-11879 16 1483-1484 2EZ3 三区擦除密码11880-11895 16 1485-1486 2E3AC 三区擦除密码错误计数器11896-11903 8 1487 1AZ3 应用区三11904-13951 2048 1488-1743 256SC4 四区密码13952-13967 16 1744-1745 2EZ4 四区擦除密码13968-13983 16 1746-1747 2E4AC 四区擦除密码错误计数器13984-13991 8 1748 1AZ4 应用区四13992-16039 2048 1749-2004 256测试区16040-16055 16 2005-2006 2合计16056 2007二.IC卡编程和使用流程对IC卡的读写操作主要在发卡时和用户持卡交费及持卡消费时时行. 发卡是卡片发行者根据用户要求对空白卡的个人化过程. 这一过程由发卡单位的微机上运行的发卡程序执行,如银行,工厂,机关等部.这一发卡程序也需IC卡开发人员根据上述经构特点进行开发设计.用户持卡消费则在商店POS机或银行A TM机上进行,持卡交费也需要在银行或交费处进行.这一过程是读出或修改卡上数据的过程,由IC卡用户应用程序在用户终端上完成.此时用户需与终端进行交互式处理.这种用户应用程序也是IC卡开发人员进行设计的.下面,综合上一节讨论的IC卡存储结构特点, 说明在这两种软件中的操作过程.1.IC卡个人化操作流程如前所述,此流程嵌在IC卡发卡软件中执行,可完成IC卡的人人化即初始数据录入过程.首先系统核对IC卡的厂商代码和卡型,正确时,在空白卡上写入发行商代码,确定此卡为本系统有效卡.然后软件应提供交互式用户界面, 让用户从键盘输入自己的用户密码(SC).此密码不应由发行者保留和处理,而应该通过调用密码写入函数而直接写入卡上. 多分区中的分区密码也可以通过给用户提供的界面由用户直接输入.为了简化密码记忆要求,也可以采用根据统一用户密码经一定算法来分别产生分区密码并写入卡上. 擦除密码则是在个人化时由发行商也就是系统来产生并且入卡上的,供系统使用.在上述密码写入后, 软件还应提供用户对密码核实和再次修改的机会.在确认无误后,软件发出熔断命令,熔断熔丝2,完成IC卡的个人化进程.随后系统可对IC卡数据区需写入的数据作初始写入.2.IC卡用户应用软件流程如前所述,此流程嵌于各IC卡读写终端的用户软件中.每次涉及对IC卡操作时执行此流程.一旦IC卡插入读写器,用户软件首先应核对厂商代码,发行商代码,以确认此卡的合法性.在确定是本系统中的有效卡后,进入用户密码核对流程, 如果是无效卡,应报警.接着在用户密码核对界面中对持卡人的合法性进行鉴别. 要求持卡人键入用户密码,与卡上密码核对,无误后可开始对卡读写. 如有分区密码也要求用户键入核实.如果需对卡上已有数据进行修改,则应与系统中保留的探险密码进行核对. 正确时可先读出卡上数据进行修改运算,再擦除相应存储区,最后将修改后数据写回该存储区.根据以上叙述,我们知道IC卡的合法性, 持卡人合法性和系统的合法性要相互确认.这些确认和对IC卡的读写操作均需调用随IC 卡读写器提供的函数库中的函数来完成.三.IC卡应用程序编程中使用的函数如上所述:开发IC卡应用系统的要点就是在一个数据库管理软件中,合理地嵌入和调用IC卡操作函数,来完成诸如合法性验证和IC卡读出,擦除和写入等操作.为此,我们需要了解由读写器驱动程序包中提供的IC止操作函数库.这些函数可分为两大类:在WINDOWS应用环境中,提供了一组动态链接库函数(.DLL文件)供各种程序调用. 在DOS 环境中, 则针对不同语言提供了各自的函数库. 这时限于篇幅仅举FOXPROFOR DOS中使用的部分函数加以说明.详细资料可查看相应手册.在FOXPRO程序执行前,执行命令:.SET LIBRARY TO MWIC.LIB则FOXPRO会自动登录-MWIC.LIB-中的IC卡函数,以后可以像使用FOXPRO 内部函数一样在程序使用中使用其中的接口函数.而在编译用户程序为.EXE文件时,又要将-MWIC.LIB-链入即可执行.MWIC.LIB中的接口函数可分两类:通用函数:用于各种卡型的基本操作.1.MW-INITCOM() 初始化串行通迅口.2.MW-SETTYPE() 设置卡型.3.MW-READ() 读卡上的数据.4.MW-WRITE() 向卡上写入数据.5.MW-ERASE() 擦除指定区域.AT88SC1604卡专用函数:仅用于这种卡型,因为不同卡型中密码的结构和位置不同.1.MW-PASS16() 检验总密码和擦除密码2.MW-CPASS16() 改变总密码和擦除密码3.MW-RDECU16() 读错误计数值4.MW-FUSE16() 烧断熔丝。

单片机教程-单片机读写IC卡

单片机教程-单片机读写IC卡

37.1 智能IC卡概述
• 从本质上说,智能IC卡是部分集成电路的组合。 IC卡制作成标准大小的卡片形式,是为了方便携 带以及便于读写操作。智能IC卡目前已经深入到 我们生活的方方面面。这里主要介绍IC卡的分类, 以及常见的接触式IC卡和非接触式IC卡。
37.1.1 智能IC卡分类
• 智能IC卡按照用途来分,可以分为如下几类: • 身份识别,例如门禁卡、居民身份证等。 • 支付工具,例如ATM取款机、公交卡、学校的饭卡 等。 • 加密/解密,例如数据备份卡、加密IC卡等 • 信息,例如手机的SIM卡等。 • 智能IC卡按照使用的方式来分,可以分为接触式 IC卡和非接触式IC卡: • 接触式IC卡通过机械触点从IC卡读写设备获取能 量和交换数据; • 非接触式IC卡通过射频感应从读写设备获取能量 和交换数据。非接触式IC卡又称为射频卡。
37.2.3 AT45DB041D的指令
• 对IC卡芯片AT45DB041D的读写操作由主控制器发 送指令来实现。由于AT45DB041D采用串行接口, 指令执行时,首先CS为低电平,然后启动SCK时钟 控制SI输入脚,并装载指令代码和操作对象的地 址,完成一条指令的输入。 • 其中,操作对象的寻址主要包括4M的主内存寻址 和BUFFER寻址。BUFFER寻址通过BFA8~BFA0共9位 地址来实现,可以定位BUFFER内具体字节的地址。 AT45DB041D的4M主内存区寻址通过PA10~PA0和 BA8~BA0来实现的。其中,PA10~PA0共11位地址, 用于确定页面的位置;BA8~BA0共9位地址,用于 确定页面内具体字节的位置。
37.1.3 非接触式IC卡
• 非接触式IC卡没有明显的触点,其内部除了存储单元、控 制逻辑外,还集成有感应线圈。非接触式IC卡通过线圈射 频感应从读写设备获取能量和交换数据。在使用时,将非 接触式IC卡放在读写器附近一定的距离之内,读写器通过 射频为IC卡内部的电路提供能量,并通过一定的协议完成 数据的交换。 • 非接触式IC卡由于不存在机械触点,因此使用方便快捷、 不易损坏。非接触式IC卡制作比较复杂,成本也比较高, 其常用于使用频繁、可靠性要求高的场合。目前,很多应 用领域的智能IC卡都开始使用非接触式IC卡。 • Philips公司的Mifare技术是当今非接触式智能IC射频卡的 主流技术,目前已经被指定为非接触式IC卡的国际标准 (ISO/IEC 14443A标准)。现在一些大型的IC卡制造商、 IC卡读写器制造商以及相关软件设计公司等都以Philips公 司的Mifare技术作为标准。

IC卡读写器使用说明

IC卡读写器使用说明

IC 读写器使用说明一、读写器连接1.1 把通讯线串口232交叉线‚DB9‛端插到PC 机的串口1/2 上1.2 把USB线的T型端插到读写器的T型USB座子上,另一头接电脑的USB口,从电脑取电.1.3 读写器上电以后可以听到”嘀,嘀”两声蜂鸣器的响声,说明FM1702复位初始化正常.如果没有听到蜂鸣器声,表明读写器没有正常上电或射频模块没有接好.二、启动Demo 软件2.1 双击启动测试软件2.2 然后进入‚IC卡操作‛软件2.3 进入功能选项‚参数设臵‛里面,可以设臵串口通讯参数:串口号、波特率、校验位、数据位、停止位等等,设置好了以后点击“修改串口”,如果出现“串口参数设置成功”,表明串口设置成功,如果出现异常,请按照提示做出改动。

2.4 设臵完毕以后可以点击‚测试读卡器‛,如果出现‚读卡器连接成功‛,并且听到读卡器的蜂鸣器响声,证明串口设臵正确!如果出现‚读卡器连接失败‛,表明串口设臵有问题;或者没有任何提示时,表明波特率设臵错误,请重新设臵。

2.5 读写器默认参数:Com1、9600bps、N、8、1三、M1卡片读写测试3.1 把一张Mifare One 卡片放在天线区域范围内3.2 进入功能选项‚低级操作‛里面点击‚寻卡‛,如果出现‚寻卡成功!‛表明寻卡正常,如果出现‚执行失败!‛表明出现异常,请检查卡片是否在寻卡范围内,如果确认卡片没有问题,那读写器有异常3.3 点击‚防冲突‛,如果出现‚执行成功‛表明防冲突正常,如果出现‚执行失败‛表明读写器出现异常或者卡片没有在天线区域范围内3.4 点击‚选择‛,如果出现‚执行成功‛表明选择正常,如果出现‚执行失败‛表明读写器出现异常或者卡片没有在天线区域范围内3.5 进入功能选项‚密码下载‛里面下载卡片密码,比如需要测试卡片扇区1 数据的读写,那么就在扇区1 后面填上密码A/B(注:卡片的初始密码A/B 均为全‘F’),然后选择‚A 组密码‛或者‚B 组密码‛,最后点击‚下载‛,如果出现‚密码下载成功‛表明密码下载成功,如果出现异常请按照错误提示更改后再下载一次,直至‚下载成功‛为止3.6 进入功能选项‚数据读写‛里面,‚请选择扇区号‛下面的可拉选项里面选择第5步下载密码的扇区号(比如扇区1),然后点击‚读出‛,如果提示‚第*扇区数据读出成功‛表明读数据正确。

IC卡读写

IC卡读写

13.3 IC卡应用IC(Integrated Circuit)卡,也被称作智能卡(Smart Card),具有写入数据和存储数据的功能,IC卡内存储器的内容可以根据需要有条件地供外部读取,完成信息处理和判定。

由于其内部具有集成电路,不但可以存储大量信息,具有极强的保密性能,并且还具有抗干扰、无磨损、寿命长等特性。

因此在各个领域中得到广泛应用。

下面通过两个实例介绍IC卡的简单应用。

实例422向IC卡中写入数据实例说明IC卡是携带应用信息和数据的媒体,空白IC卡是不能立即使用的,必须对IC卡应用系统进行初始化,写入系统IC卡和个人密码,个人专用信息和应用数据。

下面介绍如何向IC卡中写入数据。

运行本例,在“数据”文本框中输入要存入IC卡中的数据,单击“写数据”按钮,即可将输入的数据写入IC卡中。

如图13.6所示。

技术要点本例使用的是深圳明华生产的明华IC卡读写器,用户在使用时将驱动程序安装完毕后,即可正常使用本系统。

本例通过调用Mwic_32.dll链接库,进行IC卡的读写工作。

下面介绍与IC卡写操作相关的几个函数。

(1)auto_init函数该函数用于初始化IC卡读卡器。

语法如下:public static extern int auto_init(int port, int baud);参数说明如下。

l port:标识端口号,Com1对应的端口号为0;Com2对应的端口号为1,依此类推。

l baud:标识波特率。

l 返回值:如果初始化成功,返回值是IC卡设备句柄;如果初始化失败,返回值小于零。

(2)setsc_md函数该函数用于设置设备密码模式。

语法如下:public static extern int setsc_md(int icdev, int mode);参数说明如下。

l icdev:标识设备句柄,通常是auto_init函数的返回值。

l mode:标识设备密码模式,如果为0,设备密码有效,设备在加电时必须验证设备密码才能对设备进行操作。

公交IC卡管理系统-C代码

公交IC卡管理系统-C代码
}
if(order==2)
{
do{
printf("input your card number\n");
scanf("%s",x);
i=Linsearch(inf,x,n);
}while(i==-1);
int Linsearch(INFORMATION inf[N],char x[],int n)
{
int i;
for(i=0;i<n;i++)
{
if(strcmp(x,inf[i].cardnumber)==0)
return i;
else;
}
if(order==1)
{
n=InputInformation(inf);
printf("There are %d cards\n",n);
}
else if(order==2||order==3||order==4)
{
do{
printf("Please choose 1 and input the basic information\n");
scanf("%d",&order);
}while(order!=1);
n=InputInformation(inf);
printf("There are %d cards\n",n);
printf("Enter 1 to input the basic information\n");
printf("Enter 2 to enter to processing service\n");

老版890C(CT)设置为读IC卡原始序列号的步骤

老版890C(CT)设置为读IC卡原始序列号的步骤

890或981的IC机具设置读IC卡原始序列号的步骤
一.现在890C通用接口程序里登记设备
设置好超级管理卡卡号:
在红框内输入一张IC卡卡号点设置即可.机器的读卡扇区要与卡号所在扇区一致(出厂设置是0扇区第2块)。

二.完成第1步后,找到设置好的的超级管理卡在需要更改的机器上刷一下,并且输入密码:333333,一共6个3.按ENT确定.(如果是981机型,密码则为空,直接按ENT键)三.选择”使用配置”项(从上数起第3个选项).然后更改2个选项的内容.
1.外接读头控制:改为EM4001 读头. 按ENT确定.
2、使用卡片类型:改为IC卡序列号.按ENT确定
完成以上三个步骤,890C即可改成读IC卡原始序列.如果要设置回来需要把超级管理卡设置成某张IC卡原始序列号;
设置读序列菜单说明:1)参数设置---外接读头(选择EM方式)
2)IC卡类型---(IC卡序列号)。

C#如何读取IC卡,IC卡的操作代码

C#如何读取IC卡,IC卡的操作代码

C#程序开发X例_IC卡读写C#程序开发X例宝典13.3 IC卡应用/ 2007-9-7 16:37:00图书导读当前章节:13.3 IC卡应用·1.14 其他技术·13.1 串口控制·13.2 加密狗·13.4 监控·13.5 语音卡控制·13.6 手机程序开发加拿大·达内专注高端it培训名企定向委培为纳斯达克上市公司定向委培高级软件工程师国内最强大专家团队组合授课,确保高薪就业.tarena..管理不可能管理的项目!要减少失败的风险组织必须转向IT 开发的治理模型如何开发智能客户端应用离线应用模块的合理利用.intel./cd/ids...13.3IC卡应用IC(Integrated Circuit)卡,也被称作智能卡(Smart Card),具有写入数据和存储数据的功能,IC 卡内存储器的内容可以根据需要有条件地供外部读取,完成信息处理和判定。

由于其内部具有集成电路,不但可以存储大量信息,具有极强的XX性能,并且还具有抗干扰、无磨损、寿命长等特性。

因此在各个领域中得到广泛应用。

下面通过两个实例介绍IC卡的简单应用。

实例422 向IC卡中写入数据实例说明IC卡是携带应用信息和数据的媒体,空白IC卡是不能立即使用的,必须对IC卡应用系统进行初始化,写入系统IC卡和个人密码,个人专用信息和应用数据。

下面介绍如何向IC卡中写入数据。

运行本例,在“数据”文本框中输入要存入IC卡中的数据,单击“写数据”按钮,即可将输入的数据写入IC卡中。

如图13.6所示。

技术要点本例使用的是XX明华生产的明华IC卡读写器,用户在使用时将驱动程序安装完毕后,即可正常使用本系统。

本例通过调用Mwic_32.dll库,进行IC卡的读写工作。

下面介绍与IC卡写操作相关的几个函数。

(1)auto_init函数该函数用于初始化IC卡读卡器。

语法如下:public static extern int auto_init(int port, int baud);参数说明如下。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C#程序开发范例宝典13.3IC卡应用2007-9-7 16:37:00图书导读当前章节:13.3IC卡应用·1.14其他技术·13.1串口控制·13.2加密狗·13.4监控·13.5语音卡控制·13.6手机程序开发加拿大·达内专注高端it培训名企定向委培为纳斯达克上市公司定向委培高级软件工程师国内最强大专家团队组合授课,确保高薪就业管理不可能管理的项目!要减少失败的风险组织必须转向IT 开发的治理模型如何开发智能客户端应用离线应用模块的合理利用13.3 IC卡应用IC(Integrated Circuit)卡,也被称作智能卡(Smart Card),具有写入数据和存储数据的功能,IC卡内存储器的内容可以根据需要有条件地供外部读取,完成信息处理和判定。

由于其内部具有集成电路,不但可以存储大量信息,具有极强的保密性能,并且还具有抗干扰、无磨损、寿命长等特性。

因此在各个领域中得到广泛应用。

下面通过两个实例介绍IC卡的简单应用。

实例422向IC卡中写入数据实例说明IC卡是携带应用信息和数据的媒体,空白IC卡是不能立即使用的,必须对IC卡应用系统进行初始化,写入系统IC卡和个人密码,个人专用信息和应用数据。

下面介绍如何向IC卡中写入数据。

运行本例,在“数据”文本框中输入要存入IC卡中的数据,单击“写数据”按钮,即可将输入的数据写入IC卡中。

如图13.6所示。

技术要点本例使用的是深圳明华生产的明华IC卡读写器,用户在使用时将驱动程序安装完毕后,即可正常使用本系统。

本例通过调用Mwic_32.dll链接库,进行IC卡的读写工作。

下面介绍与IC卡写操作相关的几个函数。

(1)auto_init函数该函数用于初始化IC卡读卡器。

语法如下:public static extern int auto_init(int port, int baud);参数说明如下。

l port:标识端口号,Com1对应的端口号为0;Com2对应的端口号为1,依此类推。

l baud:标识波特率。

l 返回值:如果初始化成功,返回值是IC卡设备句柄;如果初始化失败,返回值小于零。

(2)setsc_md函数该函数用于设置设备密码模式。

语法如下:public static extern int setsc_md(int icdev, int mode);参数说明如下。

l icdev:标识设备句柄,通常是auto_init函数的返回值。

l mode:标识设备密码模式,如果为0,设备密码有效,设备在加电时必须验证设备密码才能对设备进行操作。

如果为1,设备密码无效。

l 返回值:如果函数执行成功返回值为零,否则小于零。

(3)get_status函数该函数用于获取设备的当前状态。

语法如下:public static extern Int16 get_status(int icdev, Int16* state);参数说明如下。

l icdev:标识设备句柄,通常是auto_init函数的返回值。

l state:用于接收函数返回的结果。

如果为0表示读卡器中无卡,为1表示读卡器中有卡。

l 返回值:如果函数执行成功返回值为零,否则小于零。

(4)csc_4442函数该函数用于核对IC卡密码。

语法如下:public static extern Int16 Csc_4442(int icdev, int len,[MarshalAs(UnmanagedType.LPArray)] byte[] p_string);参数说明如下。

l icdev:标识设备句柄,通常是auto_init函数的返回值。

l len:标识密码长度,其值为3。

l p_string:标识设置的密码。

l 返回值:如果函数执行成功返回值为零,否则小于零。

(5)swr_4442函数该函数用于向IC卡中写入数据。

语法如下:public static extern int swr_4442(int icdev, int offset, int len, char* w_string); 参数说明如下。

l icdev:标识设备句柄,通常是auto_init函数的返回值。

l offset:标识地址的偏移量,范围是0~255。

l len:标识字符串长度。

l w_string:标识写入的数据。

(6)ic_exit函数该函数用于关闭设备端口。

语法如下:public static extern int ic_exit(int icdev);参数说明如下。

l icdev:标识设备句柄,通常是auto_init函数的返回值。

(7)dv_beep函数该函数使读卡器嗡鸣。

语法如下:public static extern int dv_beep(int icdev, int time);参数说明如下。

l icdev:标识设备句柄,通常是auto_init函数的返回值。

l time:标识嗡鸣持续的时间,单位是10毫秒。

实现过程(1)新建一个项目,命名为Ex13_05,默认窗体为Form1。

(2)在Form1窗体中,主要添加两个Button控件,用于执行向卡中写入数据和退出程序的操作,添加一个TextBox控件,将TextBox中数据写入IC卡中。

(3)主要程序代码。

将程序所使用的操作IC卡的函数,封装在类IC中。

代码如下:[StructLayout(LayoutKind.Sequential)]public unsafe class IC{//对设备进行初始化[DllImport("Mwic_32.dll", EntryPoint = "auto_init", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]public static extern int auto_init(int port, int baud);//设备密码格式[DllImport("Mwic_32.dll", EntryPoint = "setsc_md", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]public static extern int setsc_md(int icdev, int mode);//获取设备当前状态[DllImport("Mwic_32.dll", EntryPoint = "get_status", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]public static extern Int16 get_status(int icdev, Int16* state);//关闭设备通讯接口[DllImport("Mwic_32.dll", EntryPoint = "ic_exit", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention =CallingConvention.StdCall)]public static extern int ic_exit(int icdev);//使设备发出蜂鸣声[DllImport("Mwic_32.dll", EntryPoint = "dv_beep", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]public static extern int dv_beep(int icdev, int time);//向IC卡中写数据[DllImport("Mwic_32.dll", EntryPoint = "swr_4442", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]public static extern int swr_4442(int icdev, int offset, int len, char* w_string);//核对卡密码[DllImport("Mwic_32.dll", EntryPoint = "csc_4442", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]public static extern Int16 Csc_4442(int icdev, int len,[MarshalAs(UnmanagedType.LPArray)] byte[] p_string);}下面代码主要用于将TextBox中数据写入到IC卡中。

代码如下:private void button1_Click(object sender, EventArgs e){//初始化int icdev = IC.auto_init(0, 9600);if (icdev < 0)MessageBox.Show("端口初始化失败,请检查接口线是否连接正确。

","错误提示",MessageBoxButtons.OK,rmation);int md = IC.setsc_md(icdev, 1); //设备密码格式unsafeInt16 status = 0;Int16 result = 0;result = IC.get_status(icdev, &status);if (result != 0){MessageBox.Show("设备当前状态错误!");int d1 = IC.ic_exit(icdev); //关闭设备return;}if (status != 1){MessageBox.Show("请插入IC卡");int d2 = IC.ic_exit(icdev); //关闭设备return;}}unsafe{//卡的密码默认为6个f(密码为:ffffff),1个f的16进制是15,两个f的16进制是255byte[] pwd = new byte[3] { 255, 255, 255 };//byte[] pwd = new byte[3] { 0xff, 0xff, 0xff };//char[] pass=new ch{0xff,0xff,0xff};Int16 checkIC_pwd = IC.Csc_4442(icdev, 3, pwd);if (checkIC_pwd < 0)MessageBox.Show("IC卡密码错误!");return;}char str = 'a';int write=-1;for (int j = 0; j < ; j++){str = Convert.ToChar(, 1));write = IC.swr_4442(icdev, 33 + j, , &str);}if (write == 0){int beep = IC.dv_beep(icdev, 20); //发出蜂鸣声MessageBox.Show("数据已成功写入IC卡中!");}elseMessageBox.Show("数据写入IC卡失败!");}int d = IC.ic_exit(icdev); //关闭设备}举一反三根据本实例,读者可以实现以下功能。

相关文档
最新文档