C#读写T5557芯片卡复制ID门禁卡源码

2023-10-07 04:50

本文主要是介绍C#读写T5557芯片卡复制ID门禁卡源码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        T5557卡是美国Atmel公司生产的多功能非接触式射频芯片卡,属于125KHz的低频卡,在国内有广大的应用市场,如很多酒店的门禁卡都是使用T5557卡。该芯片共有330bit(比特)的EPROM(分布为10个区块, 每个区块33bit)。0页的块0是被保留用于设置T5557操作模式的参数配置块。第0页第7块可以作用户数据块使用,也可以作为保护全部数据的密码(假如在配置块中启用密码功能的话),防止非法改写数据。 第1页的1、2块保存了出厂商信息及唯一出厂ID,只能读取不可更改。T5567、T5577是T5557的升级版。

        通过修改T5557卡的参数配置块,可以将t5557卡模拟成ID卡及HID卡,所以被广泛地用于门禁卡的复制行业。

本示例使用的发卡器介绍:T5557 T5567 T5577低频RFID读写器 EM4100 HID卡复制器 酒店门卡-淘宝网 (taobao.com)

  一、函数声明

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;  //调用动态库一定要加入这个引用namespace idcardreader
{public partial class Form1 : Form{CheckBox[] myCheckBox = new CheckBox[14];TextBox[] myTextBox = new TextBox[14]; //------------------------------------------------------------------------------------------------------------------------------------------------------//外部函数声明:让设备发出声响[DllImport("OUR_IDR.dll", EntryPoint = "idr_beep", CallingConvention = CallingConvention.StdCall)]static extern byte idr_beep(UInt32 xms);//xms单位为毫秒 //------------------------------------------------------------------------------------------------------------------------------------------------------    //读取设备编号,可做为软件加密狗用,也可以根据此编号在公司网站上查询保修期限[DllImport("OUR_IDR.dll", EntryPoint = "pcdgetdevicenumber", CallingConvention = CallingConvention.StdCall)]static extern byte pcdgetdevicenumber(byte[] devicenumber);//devicenumber用于返回编号 //------------------------------------------------------------------------------------------------------------------------------------------------------    //只读EM4100卡号[DllImport("OUR_IDR.dll", EntryPoint = "idr_read", CallingConvention = CallingConvention.StdCall)]public static extern byte idr_read(byte[] serial);//serial返回卡号        //------------------------------------------------------------------------------------------------------------------------------------------------------    //只读卡号,只读一次EM4100卡,必须拿开卡才能再读到[DllImport("OUR_IDR.dll", EntryPoint = "idr_read_once", CallingConvention = CallingConvention.StdCall)]public static extern byte idr_read_once(byte[] serial);//serial返回卡号//------------------------------------------------------------------------------------------------------------------------------------------------------//T5557卡写配置块[DllImport("OUR_IDR.dll", EntryPoint = "t5557_init", CallingConvention = CallingConvention.StdCall)]public static extern byte  t5557_init(byte ctrlword,byte[] seria,byte[] key,byte[] configdata,byte[] newkey);//------------------------------------------------------------------------------------------------------------------------------------------------------//T5557卡读卡[DllImport("OUR_IDR.dll", EntryPoint = "t5557_read", CallingConvention = CallingConvention.StdCall)]public static extern byte  t5557_read(byte ctrlword,byte[] seria,byte[] key,byte[] blockflag,byte[] readdata);//------------------------------------------------------------------------------------------------------------------------------------------------------//T5557卡写卡[DllImport("OUR_IDR.dll", EntryPoint = "t5557_write", CallingConvention = CallingConvention.StdCall)]public static extern byte  t5557_write(byte ctrlword,byte[] seria,byte[] key,byte[] blockflag,byte[] writedata);//------------------------------------------------------------------------------------------------------------------------------------------------------//T5557卡改密码[DllImport("OUR_IDR.dll", EntryPoint = "t5557_changekey", CallingConvention = CallingConvention.StdCall)]public static extern byte  t5557_changekey(byte ctrlword,byte[] seria,byte[] oldkey,byte[] newkey);//------------------------------------------------------------------------------------------------------------------------------------------------------//用T5557卡制作ID卡(也就是EM4100及兼容卡)[DllImport("OUR_IDR.dll", EntryPoint = "t5557_to4100", CallingConvention = CallingConvention.StdCall)]public static extern byte  t5557_to4100(byte ctrlword,byte[] seria,byte[] oldkey,byte[] newkey,byte[] myuidbuf);//-----------------------------------------------------------------------------------------------------------------------------------------------------        //只读HID卡号[DllImport("OUR_IDR.dll", EntryPoint = "hid_read", CallingConvention = CallingConvention.StdCall)]public static extern byte hid_read(byte[] serial);//serial返回卡号 //------------------------------------------------------------------------------------------------------------------------------------------------------//用T5557卡制作HID卡[DllImport("OUR_IDR.dll", EntryPoint = "t5557_tohid", CallingConvention = CallingConvention.StdCall)]public static extern byte t5557_tohid(byte ctrlword, byte[] seria, byte[] oldkey, byte[] newkey, byte[] myuidbuf);byte NEEDSERIAL = 0x01;   //需要只对指定系列号的卡操作byte NEEDKEY = 0x02;      //需要用密码认证byte LOCKBIT = 0x04;      //锁定配置块或数据块,仅对   t5557_init,t5557_write ,t5557_changekey函数有效byte KEYENABLE = 0x08;    //启用本卡的密码功能byte RESETCARD = 0x10;    //操作成功后重启卡片

二、读取T5557卡块内数据 

        private void button1_Click(object sender, EventArgs e){byte status;     //存放返回值int j;byte myctrlword = 0x00;  //控制字byte[] oldpicckey = new byte[4];  //密码byte[] mypiccserial = new byte[6];  //卡序列号byte[] mypiccdata = new byte[50];  //读卡数据缓冲:卡无线转输分频比、卡内容长度(字节数),及最多返回12个块的数据byte[] mypiccblockflag = new byte[2]; //指定读哪一块string PasswStr = textBox14.Text.Trim();string seriaStr = textBox15.Text.Trim();if (checkBox1.Checked)  //本次操作需要密码验证{myctrlword =(byte)(myctrlword+ NEEDKEY);try{oldpicckey[0] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(0, 2), 16));oldpicckey[1] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(2, 2), 16));oldpicckey[2] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(4, 2), 16));oldpicckey[3] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(6, 2), 16));}catch {MessageBox.Show("认证密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);textBox14.Select();return;}}if (checkBox2.Checked)  //仅操作指定卡号的卡{try{myctrlword = (byte)(myctrlword + NEEDSERIAL);mypiccserial[0] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(0, 2), 16));mypiccserial[1] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(2, 2), 16));mypiccserial[2] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(4, 2), 16));mypiccserial[3] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(6, 2), 16));mypiccserial[4] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(8, 2), 16));mypiccserial[5] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(10, 2), 16));}catch{MessageBox.Show("卡号输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);textBox15.Select();return;}}j = 0;mypiccblockflag[0] = 0x00;for (int i = 0; i < 8; i++){if (myCheckBox[i].Checked){mypiccblockflag[0] = (byte)(mypiccblockflag[0] + Math.Pow(2, i));j++;}}mypiccblockflag[1] = 0x00;for (int i = 0; i < 4; i++){if (myCheckBox[8+i].Checked){mypiccblockflag[1] = (byte)(mypiccblockflag[1] + Math.Pow(2, i+1));j++;}}status = t5557_read(myctrlword,mypiccserial,oldpicckey,mypiccblockflag,mypiccdata);if (status == 0){string blockdata = "";for (int i = 0; i < mypiccdata[1]; i++){blockdata = blockdata + mypiccdata[2+i].ToString("X2");}j = 0;for (int i = 0; i < 12; i++){if (myCheckBox[i].Checked){myTextBox[i].Text = blockdata.Substring(j, 8);j = j + 8;}}seriaStr = "";for(int i=0 ;i<6;i++){seriaStr = seriaStr + mypiccserial[i].ToString("X2"); }idr_beep(30);MessageBox.Show("读卡成功,卡无线转输分频比:" + mypiccdata[0].ToString("D") + ",卡号:" + seriaStr, "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information);}else { MessageErrInf(status); }}

三、改写T5557卡块内数据

private void button3_Click(object sender, EventArgs e){byte status;     //存放返回值int j;byte myctrlword = 0x00;               //控制字byte[] oldpicckey = new byte[4];      //密码byte[] mypiccserial = new byte[6];    //卡序列号byte[] mypiccdata = new byte[50];     //写卡数据缓冲byte[] mypiccblockflag = new byte[2]; //指定读哪一块string PasswStr = textBox14.Text.Trim();string seriaStr = textBox15.Text.Trim();int chtxt=Form1_chedkdata();if (chtxt != 100){MessageBox.Show("写卡数据输入错误,请重新输入!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);myTextBox[chtxt].Select(); return;}if (checkBox1.Checked)  //本次操作需要密码验证{myctrlword = (byte)(myctrlword + NEEDKEY);try{oldpicckey[0] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(0, 2), 16));oldpicckey[1] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(2, 2), 16));oldpicckey[2] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(4, 2), 16));oldpicckey[3] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(6, 2), 16));}catch{MessageBox.Show("认证密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);textBox14.Select();return;}}if (checkBox2.Checked)  //仅操作指定卡号的卡{try{myctrlword = (byte)(myctrlword + NEEDSERIAL);mypiccserial[0] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(0, 2), 16));mypiccserial[1] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(2, 2), 16));mypiccserial[2] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(4, 2), 16));mypiccserial[3] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(6, 2), 16));mypiccserial[4] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(8, 2), 16));mypiccserial[5] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(10, 2), 16));}catch{MessageBox.Show("卡号输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);textBox15.Select();return;}}j = 0;mypiccblockflag[0] = 0x00;for (int i = 0; i < 8; i++){if (myCheckBox[i].Checked){mypiccblockflag[0] = (byte)(mypiccblockflag[0] + Math.Pow(2, i));j++;}}mypiccblockflag[1] = 0x00;for (int i = 0; i < 4; i++){if (myCheckBox[8 + i].Checked){mypiccblockflag[1] = (byte)(mypiccblockflag[1] + Math.Pow(2, i+1));j++;}}string WriteStr = "";for (int i = 0; i < 12; i++){               if (myCheckBox[i].Checked){WriteStr = WriteStr+myTextBox[i].Text;                    }}for (int i = 0; i < WriteStr.Length/2;i++ ){mypiccdata[i] = Convert.ToByte(Convert.ToInt32(WriteStr.Substring(i * 2, 2), 16));}status = t5557_write(myctrlword, mypiccserial, oldpicckey, mypiccblockflag, mypiccdata);if (status == 0){                seriaStr = "";for (int i = 0; i < 6; i++){seriaStr = seriaStr + mypiccserial[i].ToString("X2");}idr_beep(30);MessageBox.Show("卡号:" + seriaStr+"写卡成功!", "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information);}else { MessageErrInf(status); }}

 四、将T5557卡配置成ID卡、HID卡

private void button8_Click(object sender, EventArgs e){byte status;     //存放返回值byte myctrlword = 0x00;  //控制字byte[] oldpicckey = new byte[4];  //密码byte[] newpicckey = new byte[4];  //新密码byte[] mypiccserial = new byte[6];  //卡序列号byte[] mypiccblockflag = new byte[2]; //指定读哪一块string PasswStr = textBox14.Text.Trim();string seriaStr = textBox15.Text.Trim();string newpassw = textBox20.Text.Trim();string newuidstr = textBox17.Text.Trim();if (checkBox1.Checked)  //本次操作需要密码验证{myctrlword = (byte)(myctrlword + NEEDKEY);try{oldpicckey[0] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(0, 2), 16));oldpicckey[1] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(2, 2), 16));oldpicckey[2] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(4, 2), 16));oldpicckey[3] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(6, 2), 16));}catch{MessageBox.Show("认证密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);textBox14.Select();return;}}if (checkBox2.Checked)  //仅操作指定卡号的卡{try{myctrlword = (byte)(myctrlword + NEEDSERIAL);mypiccserial[0] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(0, 2), 16));mypiccserial[1] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(2, 2), 16));mypiccserial[2] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(4, 2), 16));mypiccserial[3] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(6, 2), 16));mypiccserial[4] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(8, 2), 16));mypiccserial[5] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(10, 2), 16));}catch{MessageBox.Show("卡号输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);textBox15.Select();return;}}if (checkBox11.Checked)  //修改卡片密码{try{myctrlword = (byte)(myctrlword + KEYENABLE);newpicckey[0] = Convert.ToByte(Convert.ToInt32(newpassw.Substring(0, 2), 16));newpicckey[1] = Convert.ToByte(Convert.ToInt32(newpassw.Substring(2, 2), 16));newpicckey[2] = Convert.ToByte(Convert.ToInt32(newpassw.Substring(4, 2), 16));newpicckey[3] = Convert.ToByte(Convert.ToInt32(newpassw.Substring(6, 2), 16));}catch{MessageBox.Show("密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);textBox20.Select();return;}}myctrlword = (byte)(myctrlword + RESETCARD); //操作后重启卡片,否则在制卡后,需要拿开卡片重放才能成功读ID卡if (radioButton3.Checked){byte[] myuid = new byte[5];        //写入的新卡号try{myuid[0] = Convert.ToByte(Convert.ToInt32(textBox16.Text.Substring(0, 2), 16));}catch{MessageBox.Show("产家标识输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);textBox16.Select();return;}try{myuid[1] = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(0, 2), 16));myuid[2] = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(2, 2), 16));myuid[3] = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(4, 2), 16));myuid[4] = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(6, 2), 16));}catch{MessageBox.Show("新卡号输入错误,请输入8位16进制数的卡号!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);textBox17.Select();return;}status = t5557_to4100(myctrlword, mypiccserial, oldpicckey, newpicckey, myuid);if (status == 0){idr_beep(50);MessageBox.Show("卡号:" + System.Convert.ToString(myuid[1] * 256 * 256 * 256 + myuid[2] * 256 * 256 + myuid[3] * 256 + myuid[4]) + " 写卡成功变成ID卡!不能再用t5557的指令读写此卡,可重新设置配置块恢复t5557卡功能。", "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information);}else { MessageErrInf(status); }}else{byte[] myuid = new byte[7];        //写入的新卡号try{myuid[0] = Convert.ToByte(Convert.ToInt32(textBox16.Text.Substring(0, 2), 16));}catch{MessageBox.Show("HID卡号位数错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);textBox16.Select();return;}try{myuid[1] = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(0, 2), 16));myuid[2] = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(2, 2), 16));myuid[3] = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(4, 2), 16));myuid[4] = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(6, 2), 16));myuid[5] = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(8, 2), 16));myuid[6] = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(10, 2), 16));}catch{MessageBox.Show("新卡号输入错误,请输入12位16进制数的卡号!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);textBox17.Select();return;}status = t5557_tohid(myctrlword, mypiccserial, oldpicckey, newpicckey, myuid);if (status == 0){idr_beep(50);MessageBox.Show("卡号:" + System.Convert.ToString(myuid[3] * 256 * 256 * 256 + myuid[4] * 256 * 256 + myuid[5] * 256 + myuid[6]) + " 写卡成功变成HID卡!不能再用t5557的指令读写此卡,可重新设置配置块恢复t5557卡功能。", "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information);}else { MessageErrInf(status); }}}

五、T5557卡初始化

private void button9_Click(object sender, EventArgs e)
        {
            byte status;     //存放返回值
            byte[] oldpicckey = new byte[4];  //旧密码
            byte[] newpicckey = new byte[4];  //启用的新密码
            byte[] mypiccserial = new byte[6];  //卡序列号
            byte[] mypiccdata = new byte[4];  //配置值
            string PasswStr = textBox14.Text.Trim();
            string NewPass = textBox21.Text.Trim();
            string ConfStr = textBox18.Text.Trim();

            byte myctrlword = 0x00;  //控制字

            if (checkBox1.Checked)  //本次操作需要密码验证
            {
                myctrlword = (byte)(myctrlword + NEEDKEY);
                try
                {
                    oldpicckey[0] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(0, 2), 16));
                    oldpicckey[1] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(2, 2), 16));
                    oldpicckey[2] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(4, 2), 16));
                    oldpicckey[3] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(6, 2), 16));
                }
                catch
                {
                    MessageBox.Show("认证密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    textBox14.Select();
                    return;
                }
            }

            if (checkBox13.Checked)  //卡片启用新密码
            {
                myctrlword = (byte)(myctrlword + KEYENABLE);
                try
                {
                    newpicckey[0] = Convert.ToByte(Convert.ToInt32(NewPass.Substring(0, 2), 16));
                    newpicckey[1] = Convert.ToByte(Convert.ToInt32(NewPass.Substring(2, 2), 16));
                    newpicckey[2] = Convert.ToByte(Convert.ToInt32(NewPass.Substring(4, 2), 16));
                    newpicckey[3] = Convert.ToByte(Convert.ToInt32(NewPass.Substring(6, 2), 16));
                }
                catch
                {
                    MessageBox.Show("认证密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    textBox21.Select();
                    return;
                }
            }

            try
            {
                mypiccdata[0] = Convert.ToByte(Convert.ToInt32(ConfStr.Substring(0, 2), 16));
                mypiccdata[1] = Convert.ToByte(Convert.ToInt32(ConfStr.Substring(2, 2), 16));
                mypiccdata[2] = Convert.ToByte(Convert.ToInt32(ConfStr.Substring(4, 2), 16));
                mypiccdata[3] = Convert.ToByte(Convert.ToInt32(ConfStr.Substring(6, 2), 16));
            }
            catch
            {
                MessageBox.Show("配置值输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                textBox18.Select();
                return;
            }

            status = t5557_init(myctrlword,mypiccserial,oldpicckey,mypiccdata,newpicckey);
            if (status == 0)
            {
                string seriaStr = "";
                for (int i = 0; i < 6; i++)
                {
                    seriaStr = seriaStr + mypiccserial[i].ToString("X2");
                }
                idr_beep(30);
                MessageBox.Show("卡号:" + seriaStr + "配置成功!", "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else { MessageErrInf(status); }
        }

        private void GetConfigNUm()
        {
            byte byte_i;
            byte[] Configdata = new byte[4];

            if (radioButton1.Checked)  //e5550兼容模式(X-Mode位:bit15)为0
            {
                if (comboBox1.SelectedIndex == 0) //主控键
                {
                    Configdata[0] = 0x00;
                }
                else { Configdata[0] = 0x60; }


                if (comboBox2.SelectedIndex < 9) //调制方式
                {
                    byte_i = (byte)comboBox2.SelectedIndex;
                }
                else
                {
                    if (comboBox2.SelectedIndex == 9)
                    {
                        byte_i = 0x10;
                    }
                    else { byte_i = 0x18; }
                }

                Configdata[1] = (byte)((2 * 4) | ((byte_i / 16) & 0x01));  //波特率
                Configdata[2] = (byte)((byte_i % 16) * 16);
                Configdata[2] = (byte)(Configdata[2] | ((comboBox3.SelectedIndex % 4) * 4));  //相位键控调制

                if (checkBox12.Checked) //AOR请求应答模式
                {
                    Configdata[2] = (byte)(Configdata[2] | 0x02);
                }

                Configdata[3] = (byte)((comboBox4.SelectedIndex % 8) * 32);  //最大块

                if (checkBox13.Checked) //启用加密功能
                {
                    if (Configdata[3] > (6 * 32))  //启用密码功能后,最大块不能为7
                    {
                        Configdata[3] = 6 * 32;
                    }
                    Configdata[3] = (byte)(Configdata[3] | 0x10);
                }
                else { Configdata[2] = (byte)(Configdata[2] & 0xfd); } //取消AOR请求应答模式

                if (checkBox14.Checked) //帧终结符有效
                {
                    Configdata[3] = (byte)(Configdata[3] | 0x08);
                }

                if (checkBox19.Checked) //卡片复位延时67ms
                {
                    Configdata[3] = (byte)(Configdata[3] | 0x01);
                }
            }
            else //扩展模式(X-Mode位:bit15)为1
            {
                Configdata[1] = 0x02;

                if (comboBox1.SelectedIndex == 0) //主控键
                {
                    Configdata[0] = 0x60;
                }
                else { Configdata[0] = 0x90; }

                byte_i = (byte)((int)(btlnum.Value) % 64); //波特率BIT9-14
                Configdata[1] = (byte)(Configdata[1] | (byte_i * 4));

                if (comboBox2.SelectedIndex < 6) //调制方式
                {
                    byte_i = (byte)comboBox2.SelectedIndex;
                }
                else
                {
                    if (comboBox2.SelectedIndex == 7)
                    {
                        byte_i = 0x10;
                    }
                    else
                    {
                        if (comboBox2.SelectedIndex == 8)
                        {
                            byte_i = 0x18;
                        }
                        else { byte_i = 0x08; }
                    }
                }

                Configdata[1] = (byte)(Configdata[1] | ((byte_i/16) & 0x01));  //波特率
                Configdata[2] = (byte)((byte_i % 16) * 16);
                Configdata[2] = (byte)(Configdata[2] | ((comboBox3.SelectedIndex % 4) * 4));  //相位键控调制

                if (checkBox12.Checked) //AOR请求应答模式
                {
                    Configdata[2] = (byte)(Configdata[2] | 0x02);
                }

                if (checkBox23.Checked) //OTP
                {
                    Configdata[2] = (byte)(Configdata[2] | 0x01);
                }

                Configdata[3] = (byte)((comboBox4.SelectedIndex % 8) * 32);  //最大块

                if (checkBox13.Checked) //启用加密功能
                {
                    if (Configdata[3] > (6 * 32))  //启用密码功能后,最大块不能为7
                    {
                        Configdata[3] = 6 * 32;
                    }
                    Configdata[3] = (byte)(Configdata[3] | 0x10);
                }
                else { Configdata[2] = (byte)(Configdata[2] & 0xfd); } //取消AOR请求应答模式

                if (checkBox22.Checked) //帧起始符有效
                {
                    Configdata[3] = (byte)(Configdata[3] | 0x08);
                }

                if (checkBox24.Checked) //快速写:0为12TC,1为27TC
                {
                    Configdata[3] = (byte)(Configdata[3] | 0x04);
                }

                if (checkBox25.Checked) //数据取反输出
                {
                    Configdata[3] = (byte)(Configdata[3] | 0x02);
                }

                if (checkBox19.Checked) //卡片复位延时67ms
                {
                    Configdata[3] = (byte)(Configdata[3] | 0x01);
                }
            }

            textBox18.Text = Configdata[0].ToString("X2") + Configdata[1].ToString("X2") + Configdata[2].ToString("X2") + Configdata[3].ToString("X2"); 
        }

这篇关于C#读写T5557芯片卡复制ID门禁卡源码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/156125

相关文章

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MySQL主从复制与读写分离的用法解读

《MySQL主从复制与读写分离的用法解读》:本文主要介绍MySQL主从复制与读写分离的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、主从复制mysql主从复制原理实验案例二、读写分离实验案例安装并配置mycat 软件设置mycat读写分离验证mycat读

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

Conda虚拟环境的复制和迁移的四种方法实现

《Conda虚拟环境的复制和迁移的四种方法实现》本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,... 目录在本机复制Conda虚拟环境相同操作系统之间复制环境方法一:requirements.txt方法

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET