C# 读写器类--调用mwic_32.dll
4442芯片 IC卡
传输速率使用9600
测试环境
读卡器:HCE-201。外接电源型及使用键盘口取电型
IC卡芯片:西门子4442
操作系统:xpsp3;windows2003;vista;win7
平台:vs2005 c#
基本代码来源于网络,经测试完全正常。
正式使用时注意串口号问题,特别是使用USB转串口线的情况。
- 折叠+ 展开C# Code
/// <summary>
/// HCE-201读卡器 4442芯片
/// <para>调用Mwic_32.dll</para>
/// </summary>
public class IC4442
{
public IC4442()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
/// <summary>
/// 说明:对设备进行初始化 返回: 小于0 错误; 大于0 通讯设备标识符
/// </summary>
/// <param name="port">通讯口号0、1、2、3分别代表串口1、2、3、4;</param>
/// <param name="baud">速率 1200~115200</param>
[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);
/// <summary>
/// 关闭设备通讯接口
/// </summary>
/// <param name="icdev">通讯设备标识符</param>
/// <returns></returns>
[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 = "turn_off", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int turn_off(int icdev);
[DllImport("Mwic_32.dll", EntryPoint = "turn_on", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int turn_on(int icdev);
[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 = "dv_beep", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int dv_beep(int icdev, int time);
//获取设备当前状态
[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, ref Int16 state);
/// <summary>
/// 说明:向指定地址写数据。返回0正确;非0错误
/// </summary>
/// <param name="icdev">通讯设备标识符</param>
/// <param name="offset">偏移地址,其值范围0~255</param>
/// <param name="len">字符串长度,其值范围1~256</param>
/// <param name="w_string">写入数据</param>
[DllImport("Mwic_32.dll", EntryPoint = "swr_4442", SetLastError = true,CharSet = CharSet.Auto, ExactSpelling = false,CallingConvention = CallingConvention.StdCall)]
public static extern int Swr_4442(int icdev, int offset, int len, [MarshalAs(UnmanagedType.LPArray)] byte[] w_string);
/// <summary>
/// 说明:从指定地址读数据。返回0正确;非0错误
/// </summary>
/// <param name="icdev">通讯设备标识符</param>
/// <param name="offset">偏移地址,其值范围0~255</param>
/// <param name="len">字符串长度,其值范围1~256</param>
/// <param name="r_string">读出数据所存放地址指针</param>
[DllImport("Mwic_32.dll", EntryPoint = "srd_4442", SetLastError = true,CharSet = CharSet.Auto, ExactSpelling = false,CallingConvention = CallingConvention.StdCall)]
public static extern int Srd_4442(int icdev, int offset, int len, [MarshalAs(UnmanagedType.LPArray)] byte[] r_string);
[DllImport("Mwic_32.dll", EntryPoint = "chk_4442", SetLastError = true,CharSet = CharSet.Auto, ExactSpelling = false,CallingConvention = CallingConvention.StdCall)]
//说明: 检查卡型是否正确
//调用: icdev: 通讯设备标识符
//返回: <0 错误 =0 正确
public static extern int Chk_4442(int icdev);
[DllImport("Mwic_32.dll", EntryPoint = "csc_4442", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
//说明: 核对卡密码
//调用: icdev: 通讯设备标识符 len: 密码个数,其值为3 p_string: 密码字符串指针
//返回: <0 错误 =0 密码正确
public static extern Int16 Csc_4442(int icdev, int len, [MarshalAs(UnmanagedType.LPArray)] byte[] p_string);
/// <summary>
/// 说明:改写卡密码 等于0正确 小于0错误
/// </summary>
/// <param name="icdev">通讯设备标识符</param>
/// <param name="len">密码个数,其值为3</param>
/// <param name="p_string">新密码地址指针</param>
[DllImport("Mwic_32.dll", EntryPoint = "wsc_4442", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
public static extern Int16 Wsc_4442(int icdev, int len, [MarshalAs(UnmanagedType.LPArray)] byte[] p_string);
[DllImport("Mwic_32.dll", EntryPoint = "rsc_4442", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
//说明: 读出卡密码
//调用: icdev: 通讯设备标识符 len: 密码个数,其值为3 p_string: 存放密码地址指针
// 返回: <>0 错误 =0 正确
public static extern int Rsc_4442(int icdev, int len, [MarshalAs(UnmanagedType.LPArray)] byte[] p_string);
/// <summary>
/// 说明:读出密码错误计数器值 大于等于0正确 小于0错误
/// </summary>
/// <param name="icdev">通讯设备标识符</param>
/// <param name="counter">密码错误记数值存放指针</param>
[DllImport("Mwic_32.dll", EntryPoint = "rsct_4442", SetLastError = true,CharSet = CharSet.Auto, ExactSpelling = true,CallingConvention = CallingConvention.StdCall)]
public static extern int Rsct_4442(int icdev, int counter);
}
本文介绍如何使用C#读写器类与4442芯片IC卡进行交互,包括初始化、关闭设备、读写数据等功能,并提供了关键代码示例。

897

被折叠的 条评论
为什么被折叠?



