C#操作-LX3600非接触式IC卡读写器
首先的引用RC500_232.dll和zlg500B.dll这两个dll功能是一样,只是zlg500B.dll的功能有多一些!
如果是应用程序,将这两个dll放到bin文件夹中,如果是asp.net 程序 则将dll 放到系统盘中的system32文件夹中
(using System.Runtime.InteropServices; 一定要添加这个命名空间!!!!!!)
添加API申明如下:
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_init(int mport, int mbaud);
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_config();
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_exit();
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_request(byte mmode, ref UInt16 mtagtype);
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_anticoll(byte mbcnt, ref UInt32 msnr);
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_select(UInt32 msnr, ref byte msize);
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_authkey(byte mmode, byte msecnr, byte[] mkey);
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_read(byte maddr, byte[] mdata);
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_write(byte maddr, byte[] mdata);
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_readval(byte maddr, ref Int32 value);
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_writeval(byte maddr, Int32 value);
[DllImport("zlg500B.dll")]
private static extern byte zlg500B_increment(byte maddr, ref Int32 value);
[DllImport("zlg500B.dll")]
private static extern byte zlg500B_decrement(byte maddr, ref Int32 value);
具体功能看代码:(这些函数都有说明的,自己看下吧!)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.Runtime.InteropServices;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
///
/// </summary>
/// <param name="mport">端口</param>
/// <param name="mbaud">平率</param>
/// <returns></returns>
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_init(int mport, int mbaud);
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_config();
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_exit();
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_request(byte mmode, ref UInt16 mtagtype);
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_anticoll(byte mbcnt, ref UInt32 msnr);
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_select(UInt32 msnr, ref byte msize);
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_authkey(byte mmode, byte msecnr, byte[] mkey);
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_read(byte maddr, byte[] mdata);
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_write(byte maddr, byte[] mdata);
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_readval(byte maddr, ref Int32 value);
[DllImport("RC500_232.dll")]
private static extern byte RC500_232_writeval(byte maddr, Int32 value);
[DllImport("zlg500B.dll")]
private static extern byte zlg500B_increment(byte maddr, ref Int32 value);
[DllImport("zlg500B.dll")]
private static extern byte zlg500B_decrement(byte maddr, ref Int32 value);
ushort tagtype;
UInt32 snr;
byte size;
byte[] key = new byte[6] { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
byte[] data = new byte[16];
byte byteDataArea; //选择的数据块
byte byteSQ; //选择扇区
private void Form1_Load(object sender, EventArgs e)
{
}
private void toolStripLabel1_Click(object sender, EventArgs e)
{
}
private void but_connect_m_Click(object sender, EventArgs e)
{
if (RC500_232_init(Convert.ToInt32(box_com.Text.Replace("com","")), Convert.ToInt32(box_hz.Text)) != 0)
MessageBox.Show("端口打开失败!");
else if (RC500_232_config() != 0)
MessageBox.Show("初始化失败!");
else txt_log.Text="端口打开成功,读卡器初始化成功!\r\n";
}
private void but_close_m_Click(object sender, EventArgs e)
{
long i=1;
int j = 0;
while(i!=0){
i = RC500_232_exit();
j++;
if (j > 10)
break;
}
Log("关闭串口成功");
}
public void Log(string mess) {
txt_log.Text += mess+"\r\n";
}
private void but_exti_m_Click(object sender, EventArgs e)
{
but_close_m_Click(null,null);
Application.Exit();
}
Regex rgKey = new Regex(" ");
private void but_readData_Click(object sender, EventArgs e)
{
if (Init())
{
if (RC500_232_read(byteDataArea, data) != 0)// 将0扇区数据读入byte类型数组data中,//data为16字节长
{
MessageBox.Show("数据读取失败");
}
else
{
txt_code.Text = Convert.ToString(snr, 16);
Log("数据读取成功: " + ReadData(data));
}
}
}
public string ReadData(byte[] data)
{
string tempt = "";
foreach (byte r in data)
{
tempt += Convert.ToString(r,16)+ " ";
}
return tempt;
}
private void but_readValue_Click(object sender, EventArgs e)
{
if (Init())
{
Int32 intValue = 0x500;
if (RC500_232_readval(byteDataArea, ref intValue) != 0)// 将0扇区数据读入byte类型数组data中,//data为16字节长
{
MessageBox.Show("数值读取失败");
}
else
{
txt_code.Text = Convert.ToString(snr, 16);
Log("数值读取成功: " +Convert.ToString(intValue,16));
}
}
}
private void box_SQ_SelectedIndexChanged(object sender, EventArgs e)
{
int intSQ = Convert.ToInt32(box_SQ.Text);
int temp = intSQ * 4;
box_dataArea.Items.Clear();
box_dataArea.Items.Add(temp);
box_dataArea.Items.Add(temp+1);
box_dataArea.Items.Add(temp+2);
box_dataArea.Items.Add(temp+3);
box_dataArea.SelectedIndex = 0;
box_dataArea2.Items.Clear();
if (intSQ != 0)
{
box_dataArea2.Items.Add(temp);
}
box_dataArea2.Items.Add(temp + 1);
box_dataArea2.Items.Add(temp + 2);
box_dataArea2.Items.Add(temp + 3);
box_dataArea2.SelectedIndex = 0;
}
private void but_writeDate_Click(object sender, EventArgs e)
{
string value = txt_writeDate.Text.Trim();
if (!string.IsNullOrEmpty(value))
{
int index = 0;
foreach (string pt in rgKey.Split(value))
{
if (string.IsNullOrEmpty(pt))
{
MessageBox.Show("写入数据时有多余的空格!"); return;
}
int intValue = 0;
try
{
intValue = Convert.ToInt32(pt, 16);
}
catch (Exception)
{
MessageBox.Show("写入数据含有非法字符!");
return;
}
if (intValue > 255 || intValue < 0)
{
MessageBox.Show("写入数据范围错误(00-ff)!");
return;
}
byte bt = (byte)intValue;
data[index] = bt;
index++;
}
if (index != 16)
{
MessageBox.Show("写入数据错误,长度不为16个!"); return;
}
if (Init())
{
if (RC500_232_write(byteDataArea, data) != 0)// 将0扇区数据读入byte类型数组data中,//data为16字节长
{
MessageBox.Show("数据写入失败");
}
else
{
txt_code.Text = Convert.ToString(snr, 16);
Log("数据写入成功: " + ReadData(data));
}
}
}
else {
MessageBox.Show("写入数据不能为空!");
}
}
public bool Init()
{
byteDataArea = (byte)Convert.ToInt32(box_dataArea.Text); //选择的数据块
byteSQ = (byte)Convert.ToInt32(box_SQ.Text); //选择扇区
string strKey = txt_key.Text;
if (!string.IsNullOrEmpty(strKey))
{
int index = 0;
foreach (string pt in rgKey.Split(strKey))
{
byte bt = (byte)Convert.ToInt32(pt, 16);
key[index] = bt;
index++;
}
}
else
{
key = new byte[6] { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
}
bool flag = false;
if (RC500_232_request(0, ref tagtype) != 0) //检查有效范围是否有卡
{
if (RC500_232_request(0, ref tagtype) != 0) //检查有效范围是否有卡
{
MessageBox.Show("没有卡!"); return false;
}
else
flag = true;
}
else
flag = true;
if (flag)
{
if (RC500_232_anticoll(0, ref snr) != 0) //防碰撞控制,snr返回卡的序列号
{
MessageBox.Show("防碰撞错误!"); return false;
}
else if (RC500_232_select(snr, ref size) != 0) //选择某一序号的卡,//size返回卡的容量大小
{
MessageBox.Show("选择错误!"); return false;
}
else if (RC500_232_authkey((byte)box_keyMode.SelectedIndex, byteSQ, key) != 0) //密码验证,密码存放在 key数组中
{
MessageBox.Show("密码验证错误!"); return false;
}
}
return true;
}
private void but_writeValue_Click(object sender, EventArgs e)
{
if (Init())
{
string value = txt_writeValue.Text.Trim();
if(string.IsNullOrEmpty(value)){
MessageBox.Show("写入数值不能为空");
return;
}
Int32 intValue = Convert.ToInt32(value,16);
if (RC500_232_writeval(byteDataArea, intValue) != 0)// 将0扇区数据读入byte类型数组data中,//data为16字节长
{
MessageBox.Show("数值写入失败");
}
else
{
txt_code.Text = Convert.ToString(snr, 16);
Log("数值写入成功: " + value);
}
}
}
private void but_add_Click(object sender, EventArgs e)
{
if (Init())
{
string value = txt_addValue.Text.Trim();
if(string.IsNullOrEmpty(value)){
MessageBox.Show("写入数值不能为空");
return;
}
Int32 temp = 1; //Convert.ToInt32(txt_addValue.Text.Trim(),16);
if (zlg500B_increment(byteDataArea, ref temp) != 0)// 将0扇区数据读入byte类型数组data中,//data为16字节长
{
MessageBox.Show("数值写入失败");
}
else
{
txt_code.Text = Convert.ToString(snr, 16);
Log("数值写入成功: " + value);
}
}
}
private void but_decrement_Click(object sender, EventArgs e)
{
if (Init())
{
string value = txt_dec.Text.Trim();
if (string.IsNullOrEmpty(value))
{
MessageBox.Show("写入数值不能为空");
return;
}
Int32 temp = 1; //Convert.ToInt32(txt_addValue.Text.Trim(), 16);
if (zlg500B_decrement(byteDataArea, ref temp) != 0)// 将0扇区数据读入byte类型数组data中,//data为16字节长
{
MessageBox.Show("数值写入失败");
}
else
{
txt_code.Text = Convert.ToString(snr, 16);
Log("数值写入成功: " + value);
}
}
}
}
}
C#操作-LX3600非接触式IC卡读写器相关推荐
- 磁条卡,接触式IC卡,非接触式IC卡的优缺点
磁条卡的特点: 磁条卡由于其结构简单,存储容量小,安全保密性差,读写设备复杂且维护费用高,作为七.八十年代技术水平的产品已风光不再,即将面临淘汰. 智能IC卡与磁条卡相比有哪些优势? 接触式IC卡与磁 ...
- 非接触式IC卡与条码卡磁卡接触式IC卡相比较
一.最新技术-非接触IC卡 非接触IC卡,又名感应卡,诞生于90年代初,由于存在着条码卡.磁卡和接触式IC卡不可比拟的优点,使之一经问世,便立刻引起了广泛的关注,并以惊人的速度得到推广应用. 非接触式 ...
- iso14443 非接触式IC卡协议
转自百度百科 http://baike.baidu.com/link?url=Y1koEW6mX0AgDV5kt37i7M5RaV0g_WwxU163dO-VKUbR5w4qEHv0OMOnbw1BT ...
- S50非接触式IC卡 学习笔记
S50非接触式IC卡性能简介(M1) 一. 主要指标 l 容量为8K位EEPROM(1K 字节) l 分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位 l 每个扇区有独立的一组密码及访问 ...
- 非接触式IC卡性能简介(M1)
卡片的电气部分只由一个天线和ASIC组成. 天线:卡片的天线是只有几组绕线的线圈,很适于封装到IS0卡片中. ASIC:卡片的ASIC由一个高速(106KB波特率)的RF接口,一个控制单元和一个 8K ...
- 非接触式IC卡、条码卡、磁道卡、接触式IC卡、芯片卡
转自 http://blog.csdn.net/lvxiangan/article/details/40953831 非接触式IC卡:门禁卡.工卡 条码卡:较少接触到 磁道卡:带黑色磁条的卡,如可刷的 ...
- 非接触式IC卡存储结构
非接触式IC卡Contactless Smart Card(CSS),也称作感应卡.射频卡,由IC芯片.感应天线组成,并完全密封在一个标准PVC卡片中, 无外露部分,其结构示意图如下. 非接触IC卡工 ...
- Mifare One 非接触式IC卡介绍
贴一篇关于Mifare1的介绍 Mifare l卡特性简介 M1卡为8K位的非接触式IC卡. 电气特性 l 容量为8K位EEPrOM l 分为16个扇区,每个扇区为4块 ...
- 非接触式IC卡中的射频识别技术
非接触式IC卡中的射频识别技术 湖南大学电气与信息工程学院 刘铮 章兢 摘 要:介绍了射频识别技术在非接触式IC卡中的应用,对非接触式IC卡的射频通讯在实现中的问题作了探讨.并对Type At Typ ...
- 全球与中国非接触式IC卡芯片市场现状及未来发展趋势2022
根据QYR(恒州博智)的统计及预测,2021年全球非接触式IC卡芯片市场销售额达到了 亿美元,预计2028年将达到 亿美元,年复合增长率(CAGR)为 %(2022-2028).地区层面来看,中国市场 ...
最新文章
- 自然语言推理和数据集
- 11g废弃的Hint - BYPASS_UJVC
- 织梦(dedecms)当前位置{dede:field name='position' /}修改
- html本地载入缓存文件,Flutter中如何加载并预览本地的html文件的方法
- [转]ClassPath是什么
- kibana使用详解
- Vue结合Echarts
- 【Monkey】Monkey基础概念
- C++的堆与拷贝构造函数
- 日调度5万亿次 腾讯云微服务架构体系TSF深度解读
- 南阳理工ACM111
- SuperMap iDesktop常见问题解答集锦(九)
- 2022年各行业白皮书市场研报合集(共125份)
- Diligent调查发现,董事会成员是安全和公司治理的关键环节
- NRF52832 SPI 资料收集
- Unity3D教程:手游开发常用排序算法 -下
- 清华计算机408考研真题资料经验分享
- docker下启动phpMyAdmin
- how to do research
- CentOS 8.2云服务器定时运行脚本
热门文章
- 一个有趣的二维码生成库Qart
- 转载四代重歼的一片博文 - 漏斗子:“三大战役”完成 人民币国际化就登场
- 怎么学计算机基本步骤,学习计算机知识的基本步骤是什么?
- linux 键盘描述符,USB HID Report Descriptor 报告描述符详解
- iOS SceneDelegate使用总结
- 失败程序员的十年总结
- 同条网线电脑正常上网,手机连接wifi成功,但是无法访问互联网
- 【5G NR】手机身份证号IMEI与IMEISV
- android partition tool apk,分区修复工具 MiniTool Partition Recovery
- 跨境电商必看:amazon账号关联因素