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

news2024/11/17 22:50:08

        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"); 
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/192307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

maven导入本地jar包

有些jar包是自己封装的或者来源公司私服等. 引入本地jar包方式 另外一种方式 包所在路径 cmd 这样jar包就在你仓库本地仓库里 然后导入

JVM-性能监控与调优-JVM运行时参数

JVM参数选项 官网地址&#xff1a;https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html 类型一&#xff1a;标准参数选项 > java -help 用法: java [-options] class [args...](执行类)或 java [-options] -jar jarfile [args...](执行 jar 文件) 其…

这都能第六?

文章目录&#x1f31f; 专栏介绍&#x1f31f; Vue默认版本&#x1f31f; 拥抱Vue3的UI&#x1f31f; Vue3显著优势&#x1f31f; 专栏介绍 凉哥作为 Vue 的忠诚粉丝输出过大量的 Vue 文章&#xff0c;应粉丝要求开始更新 Vue3 的相关技术文章&#xff0c;Vue 框架目前的地位大…

compooser remove移除包受版本约束导致失败

由于某个项目想移除某个扩展包&#xff0c;但一直报版本不兼容错导致移除不了。报错如下图。后面只要在移除包compooser语句后面加 --ignore-platform-reqs即可&#xff0c;命令&#xff1a;composer remove xxxxxx --ignore-platform-reqs。 移除扩展包后&#xff0c;执行php …

CnOpenData全国兴趣点(POI)数据

一、数据简介 POI&#xff08;Point of Interest&#xff09;&#xff0c;即兴趣点&#xff0c;一个POI可以是餐厅、超市、景点、酒店、车站、停车场等。兴趣点通常包含四方面信息&#xff0c;分别为名称、类别、坐标、分类。其中&#xff0c;分类一般有一级分类和二级分类&…

SpringBoot3x的服务间调用@HttpExchange

首先&#xff0c;我们之前曾经用过很多服务间调用的方式和方法&#xff0c;今天给大家介绍一款SpringBoot3x版本服务间调用&#xff0c;采用HttpExchange注解实现&#xff0c;方便快捷&#xff0c;简单易懂。 创建个SpringBoot3x项目 设置端口号为8081 import org.springframe…

开发日记-sublime3安装插件问题

由于notpad作者本人的一些个人错误观念&#xff0c;我对此软件产生极大恶意&#xff0c;所以又拾起了多年不用的sublime。sublime3其实是个非常好用的编辑器&#xff0c;有强大的插件扩展功能&#xff0c;但由于国内网络限制之前放弃了&#xff0c;这次研究明白了如何使用。 Pa…

谷歌公司再出大招,Chrome 新版本发布

导读您在用什么浏览器呢&#xff1f;Chrome 55 Beta 发布了&#xff0c;是不是很期待让我们一起来看看都有哪些方面的技术改进和变化呢&#xff1f;主要内容如下&#xff1a; 1、输入处理改进 随 着移动网络使用的普及&#xff0c;网站对触摸输入做出良好反应的重要性也日益增…

【内网安全】——meterpreter使用攻略

作者名&#xff1a;白昼安全主页面链接&#xff1a; 主页传送门创作初心&#xff1a; 一切为了她座右铭&#xff1a; 不要让时代的悲哀成为你的悲哀专研方向&#xff1a; web安全&#xff0c;后渗透技术每日emo&#xff1a; 再给我一年&#xff0c;好吗&#xff1f;Metasploit中…

点云的降采样

1. 点云深度学习中的新下采样方法 (CSDN) 现在比较常见的下采样算法有&#xff1a;farthest point sampling(PointNet&#xff0c;ShellNet)、random sampling(RandLA-Net)、grid sampling(KPConv&#xff0c;Grid-GCN)等。它们各有特点&#xff1a; farthest point sampling…

JUC并发编程之LinkedBlockingQueue的底层原理

作者简介&#xff1a;专注于研究Linux内核、Hotspot虚拟机、汇编语言、JDK源码、各大中间件源码等等喜欢的话&#xff0c;可以三连关注~LinkedBlockingQueue介绍在JUC包下关于线程安全的队列实现有很多&#xff0c;那么此篇文章讲解LinkedBlockingQueue的实现原理&#xff0c;相…

LeetCode 刷题系列 -- 1026. 节点与其祖先之间的最大差值

给定二叉树的根节点 root&#xff0c;找出存在于 不同 节点 A 和 B 之间的最大值 V&#xff0c;其中 V |A.val - B.val|&#xff0c;且 A 是 B 的祖先。&#xff08;如果 A 的任何子节点之一为 B&#xff0c;或者 A 的任何子节点是 B 的祖先&#xff0c;那么我们认为 A 是 B 的…

The Social Life of Autonomous Cars-自动驾驶汽车与日常生活

目录 自动驾驶汽车与日常生活 Abstract REPURPOSING ONLINE VIDEOS THE SOCIAL ROAD SEEING A GAP AS JUST A GAP SOMETIMES IT’S GOOD TO BE A CREEP THE UNCANNY VALLEY OF AUTONOMOUS CARS References 自动驾驶汽车与日常生活 作者Barry Brown时间06 February 201…

【智慧电力巡检】基于EasyCVR视频技术构建远程监控综合管理平台

一、方案背景电力行业和人民的生活、生产息息相关&#xff0c;一旦电力设施遭遇破坏或工作失误&#xff0c;就会造成大面积停电&#xff0c;其后果不堪设想&#xff0c;尤其是2003年美加“8.14”和2005年莫斯科“5.25”这两起大面积停电事故给我们敲响了警钟。随着电力行业的发…

zookeeper源码分享六 ---- 事物日志

二进制格式设计思想 在二进制格式设计中&#xff0c;其实和json的格式设计类似&#xff0c;也是有套路的。 设计要存储的内容(内容尽可能少&#xff0c;能用数字表示&#xff0c;不用字符串表示)。这些内容的前后顺序&#xff0c;读写都是按照这个顺序来的。 比如&#xff1…

来看看这几个办公技巧吧

技巧一&#xff1a;重复运行命令 当我们需要将一段中的不同单词加粗时&#xff0c;使用替换功能可能不是特别方便。这时可以使用万能的【F4】键进行重复操作。首先选中一个需要加粗的字&#xff0c;点击【加粗】设置完成字体的加粗&#xff1b;然后&#xff0c;选择另一个文本&…

1、python框架selenium

分层的自动化测试 什么样的产品适合做自动化测试&#xff1f; 功能成熟&#xff08;需求变动较小&#xff09; 产品更新维护周期长 项目进度不太大 比较频繁的回归测试 软件开发比较规范&#xff0c;具有可测试性 可以脚本具有可复用性 selenium 技术&#xff1a; 元素定位的…

[基础语法] python语法之列表、判断、循环例子

文章目录购物车案例已发布&#xff1a;整体框架打印商品列表将商品加入购物车打印购物车、计算总金额完整代码另外说明购物车案例 已发布&#xff1a; python判断语句python循环语句python之列表list购物车案例后续暂时不更新&#xff0c;有想要的部分&#xff0c;可以后台留…

11、Servlet——综合案例(Servlet+JDBC):管理员登录

目录 1、在MySQL中新建一个servletdatabase数据库&#xff0c;创建表admin 2、在web中创建登录页面login.html 3、在web中创建CSS文件夹&#xff0c;在CSS文件夹中创建login.css 4、在web下新建注册页面register.html 5、在CSS文件夹中新建register.css 6、在CSS文件夹下新…

文件包含漏洞

数据来源 本文仅用于信息安全的学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 01 文件包含漏洞概述 简单例子 PHP中的文件包含函数 02 文件包含漏洞类型及利用 本地文…