这个简单的测试项目,界面上有个timer控件,设计的是3秒执行一下读取身份证的动作,目前想到的是这种循环方式,德卡T10这个机子,身份证放上去,不会自动去执行读取的操作。
1.界面
2.界面的代码 Form1.cs 如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Text; 7 using System.Windows.Forms; 8 using System.IO; 9 using System.Threading; 10 11 namespace IDCard 12 { 13 public partial class Form1 : Form 14 { 15 public static string StrCardNo = "1"; //记录下的 上次有效的身份证号 16 public Form1() 17 { 18 InitializeComponent(); 19 } 20 21 private void timer1_Tick(object sender, EventArgs e) 22 { 23 textBox8.Focus(); 24 PersonInfo person = new PersonInfo(); 25 int result = IDCard.GetCardInfo.getCardInfo(ref person); 26 if (result < 0)//未读取到身份证 27 { 28 return; 29 } 30 string strCardNoThis=""; //本次读取到的身份证号 31 if (person.IdNumber == null) 32 { 33 strCardNoThis = ""; 34 } 35 else 36 { 37 strCardNoThis = person.IdNumber; 38 //如果记录的上次的有效号和 本次的号 一样,处理掉 不用 39 if (StrCardNo.Equals(strCardNoThis)) 40 { 41 return; 42 } 43 else //如果和之前的不一样,赋值为最新 44 { 45 StrCardNo = strCardNoThis; 46 textBox8.Text = strCardNoThis; 47 } 48 } 49 50 //显示读取到的身份证UID 51 if (person.UID == null || person.UID.Equals("")) 52 { 53 textBox1.Text = "未读取到身份证UID"; 54 } 55 else 56 { 57 textBox1.Text = person.UID; 58 } 59 } 60 } 61 }
3.读取身份证逻辑代码 GetCardInfo.cs 如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; //using System.Linq; using System.Text; using System.Runtime.InteropServices; using System.IO; using System.Drawing; namespace IDCard { public class GetCardInfo { #region 调用dll dcrf32.dll放在bin/Debug文件夹下 [DllImport("dcrf32.dll")] private static extern int dc_init(Int16 port, int baud); //初始化OK [DllImport("dcrf32.dll")] private static extern short dc_find_i_d(int icdev);// 查询身份证卡 [DllImport("dcrf32.dll")] private static extern IntPtr dc_i_d_query_name(int idhandle);//身份证姓名 dc_i_d_query_sex [DllImport("dcrf32.dll")] private static extern IntPtr dc_i_d_query_sex(int idhandle);//性别 [DllImport("dcrf32.dll")] private static extern IntPtr dc_i_d_query_nation(int idhandle);//民族 [DllImport("dcrf32.dll")] private static extern IntPtr dc_i_d_query_birth(int idhandle);//出生年月 [DllImport("dcrf32.dll")] private static extern IntPtr dc_i_d_query_address(int idhandle);//户籍地址 [DllImport("dcrf32.dll")] private static extern IntPtr dc_i_d_query_id_number(int idhandle);//身份证号 [DllImport("dcrf32.dll")] private static extern short dc_get_idsnr_hex(int idhandle, [Out]byte[] data); //身份证的UID [DllImport("dcrf32.dll")] private static extern IntPtr dc_i_d_query_department(int idhandle);//签发机关 [DllImport("dcrf32.dll")] private static extern IntPtr dc_i_d_query_expire_day(int idhandle);//有效期限 [DllImport("dcrf32.dll")] private static extern short dc_i_d_query_photo_bmp_buffer(int idhandle, byte[] BmpBuffer, ref ulong BmpLength);//照片 //unsigned char * BmpBuffer [DllImport("dcrf32.dll")] private static extern int dc_start_i_d(int icdev);//开始读身份证卡操作 如果=-1表示失败,否则为身份证卡信息标识符。 [DllImport("dcrf32.dll")] private static extern void dc_end_i_d(int idhandle);//结束读取身份证 [DllImport("dcrf32.dll")] private static extern short dc_reset(int idhandle, short msec);//射频复位 [DllImport("dcrf32.dll")] private static extern short dc_beep(int icdev, short msec);//设备蜂鸣 [DllImport("dcrf32.dll")] private static extern short dc_exit(int idhandle);//关闭设备的通讯和释放资源 #endregion /// <summary>读取身份信息</summary> /// <param name="person"></param> /// <param name="ImgPath">图片存储路径</param> /// <returns></returns> public static int getCardInfo(ref PersonInfo person) { try { int IcDev;//HANDLE icdev:通讯设备标识符 IntPtr Mydev; int m_hId;//HANDLE idhandle:身份证卡信息标识符 IcDev = dc_init(100, 9600);//①打开设备dc_init if (IcDev < 0) { return -1; } dc_reset(IcDev, 10);//射频复位 dayu 0 int st = dc_find_i_d(IcDev);//②寻身份证 dc_find_i_d 若成功则为0; m_hId = dc_start_i_d(IcDev);//③读身份证 dc_start_i_d if ((long)m_hId < 0) { dc_exit(180); //⑦关闭设备dc_exit return -1; } #region 获取身份证信息 //Mydev = dc_i_d_query_name(m_hId);//姓名 //person.Name = Marshal.PtrToStringAnsi(Mydev); //Mydev = dc_i_d_query_sex(m_hId);//性别 //person.Sex = Marshal.PtrToStringAnsi(Mydev); //Mydev = dc_i_d_query_nation(m_hId);//民族 //person.Nation = Marshal.PtrToStringAnsi(Mydev); //Mydev = dc_i_d_query_birth(m_hId);//出生日期 //person.Birth = Marshal.PtrToStringAnsi(Mydev); //Mydev = dc_i_d_query_address(m_hId);//户籍地址 //person.Address = Marshal.PtrToStringAnsi(Mydev); //Mydev = dc_i_d_query_department(m_hId);//签发机关 //person.IdDepartment = Marshal.PtrToStringAnsi(Mydev); //Mydev = dc_i_d_query_expire_day(m_hId);//有效期限 //person.ExpireDay = Marshal.PtrToStringAnsi(Mydev); #endregion byte[] rbuff = new byte[16]; short sT = dc_get_idsnr_hex(m_hId, rbuff); //获取身份证UID person.UID = System.Text.Encoding.Default.GetString(rbuff); Mydev = dc_i_d_query_id_number(m_hId);//④获取身份证相应的信息 身份证号 person.IdNumber = Marshal.PtrToStringAnsi(Mydev); dc_beep(IcDev,10); //蜂鸣声 提示声音 dc_end_i_d(m_hId); //⑥关闭身份证标识 dc_end_i_d dc_exit(IcDev); //⑦关闭设备dc_exit } catch (Exception ex) { //throw ex; return -1; } return 1; } } }
4.身份证信息类 PersonInfo.cs 如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; //using System.Linq; using System.Text; using System.Drawing; namespace IDCard { public class PersonInfo { private string idNumber; /// <summary>身份证号</summary> public string IdNumber { get { return idNumber; } set { idNumber = value; } } private string uid; //身份证UID public string UID { get { return uid; } set { uid = value; } } #region 身份证其他信息 //private string name; ///// <summary>姓名</summary> //public string Name //{ // get { return name; } // set { name = value; } //} //private string sex; ///// <summary>性别</summary> //public string Sex //{ // get { return sex; } // set { sex = value; } //} //private string nation; ///// <summary>民族</summary> //public string Nation //{ // get { return nation; } // set { nation = value; } //} //private string birth; ///// <summary>出生年月日</summary> //public string Birth //{ // get { return birth; } // set { birth = value; } //} //private string address; ///// <summary>户籍地址</summary> //public string Address //{ // get { return address; } // set { address = value; } //} //private string idDepartment; ///// <summary>签发机关</summary> //public string IdDepartment //{ // get { return idDepartment; } // set { idDepartment = value; } //} //private string expireDay; ///// <summary>有效期限</summary> //public string ExpireDay //{ // get { return expireDay; } // set { expireDay = value; } //} //private Image photo; ///// <summary>照片</summary> //public Image Photo //{ // get { return photo; } // set { photo = value; } //} #endregion } }