(学习分享)串口通讯:低频卡&门禁功能

        在物联网领域,常用的RFID芯片,根据频率高低分为低频芯片和高频芯片。今天给大家分享一个,根据C#写的串口通讯:检测低频卡信息的应用窗口。

添加控件所需控件:

1个SerialPort;1个Timer;8个Label;5个comboBox;9个button;3个textBox;2个groupBox;

自行设计界面

在接收端口的comboBox1的Items集合里添加一个COM1端口

波特率comBox2添加:2400;9600;19200;115200;

奇偶校验comBox3添加:None;Odd;Even;Mark;Space;

数据位comBox4添加:6;7;8;9;

停止位comBox添加:1;1.5;2;None;

textBox设置把外观里的ScrollBars的None换成Both,行为里的Multiline的False换成True,就可以实现变化大小和换行。

 添加SerialPort串口控件,要定义一个加载串口的命名空间

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.IO.Ports;        //←——加载串口命名空间


再创建一个串口对象,并初始化

public partial class Form1 : Form
    {
        SerialPort com1 = new SerialPort("COM100", 115200, Parity.None, 8, StopBits.One);
        //↑创建的串口对象
        public Form1()
        {
            InitializeComponent();

        }

 在窗口代码中,设置应用系统的方法,获取当前用户客户端的端口数,再添加一个comboBox控件,创建循环添加端口号,用SelectedIndex选择comboBox的Items集合的选项,设定初值。

string[] port = SerialPort.GetPortNames();
//↑加载窗口时,获取本机所有的串口号,并返回到字符串中

for (int i = 0;i < port.Length; i++)
            {
                comboBox1.Items.Add(port[i]);                       
                //↑遍历数组,并把值添加到下位列表框中
            }
            comboBox1.SelectedIndex = 0;//自动选择接收端口
            comboBox2.SelectedIndex = 3;//自动选择波特率
            comboBox3.SelectedIndex = 0;//自动选择奇偶校验
            comboBox4.SelectedIndex = 2;//自动选择数据位
            comboBox5.SelectedIndex = 0;//自动选择停止位

设置打开端口按钮,以comboBox选定值作为串口初始化值,

private void button1_Click(object sender, EventArgs e)          //打开串口
        {
            //应该先判断串口是否已经打开
            if (!com1.IsOpen)
            {
                com1.PortName = comboBox1.Text; //端口
                com1.BaudRate = int.Parse(comboBox2.Text);//波特率
                com1.Parity = Parity.None;//奇偶校验
                com1.DataBits = 8;//数据位
                com1.StopBits = StopBits.One;//停止位
                com1.Open();//打开串口
                com1.DataReceived += new SerialDataReceivedEventHandler(button2_Click);
                //↑串口按钮设置
                button1.Text = "关闭端口";
                button1.BackColor = Color.Red;//←——设置按钮颜色

            }

            else if(com1.IsOpen)
            {
                com1.Close();//关闭串口
                button1.Text = "打开端口";
                button1.BackColor = Color.Green;
            }
            

        }

设置发送按钮

private void button3_Click(object sender, EventArgs e)//发送功能
        {

            if (button1.Text == "关闭端口")
            {
                byte[] send = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x01,
                                           0x01, 0x00, 0x50, 0x74 };
                                           //↑读取低频卡信息
                com1.Write(send, 0, send.Length);
                
            }
            else
            {
                MessageBox.Show("未打开端口");
            }
        }

设置接收按钮

private void button2_Click(object sender, EventArgs e)//接收功能
        {
            int z = com1.BytesToRead;
            byte[] buffer = new byte[z];
            com1.Read(buffer, 0, z);
            //↑手动接收的数据转换成字符串
            for(int i = 0; i < z; i++)
            {
                textBox2.Text += buffer[i].ToString("X").PadLeft(2, '0') + " "; 
                //↑循环接收的数据转成字符串
            }

            }
        }

添加时钟接收,添加一个门禁引用

public partial class Form1 : Form
    {
        SerialPort com1 = new SerialPort("COM100", 115200, Parity.None, 8, StopBits.One);
        //↑创建的串口对象

        Timer t = new Timer();
        //↑设定时钟接收
        //如果有异常报错,引用添加using Timer = System.Windows.Forms.Timer;
        int flag = 0;
        //↑门禁检测引用
        public Form1()
        {
            InitializeComponent();

        }

在窗口代码中添加时钟事件

    t.Interval = 1000;
    t.Stop();
    t.Tick += new EventHandler(button2_Click)

 添加门禁查询功能

private void button7_Click(object sender, EventArgs e)//门禁查询功能
        {
            if (button1.Text == "关闭端口")
            {
                byte[] send = new byte[] { 0xFF, 0x55, 0x00, 0x00, 0x03, 0x03,
                                           0x01, 0x02, 0x0E, 0x70 };//查询块2数据
                com1.Write(send, 0, send.Length);
                flag = 1;//打开门禁检测
            }
            else
            {
                MessageBox.Show("未打开端口");
            }
        }

添加重置门禁卡功能

private void button9_Click(object sender, EventArgs e)//重置门禁卡功能
        {
            if (button1.Text == "关闭端口")
            {
                byte[] send = new byte[] { 0xFF, 0x55, 0x00, 0x00, 0x03, 0x04, 0x05,
                                           0x02, 0x00, 0x00, 0x00, 0x00, 0x47, 0x0C };
                com1.Write(send, 0, send.Length);
                flag = 0;//关闭门禁检测
            }
            else
            {
                MessageBox.Show("未打开端口");
            }
            
        }

在接收按钮添加一个门禁判断的循环

if(flag == 1)//判断门禁密码
            {
                if(buffer[9] == 0x77 && buffer[10] == 0x77)
                {
                    textBox3.Text = "密码正确,已开门";
                }
                else
                {
                    textBox3.Text = "密码错误,开门失败";
                }
            }

添加查询卡号功能

private void button4_Click(object sender, EventArgs e)//卡号查询功能
        {
            if (button1.Text == "关闭端口")
            {
                byte[] send = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x01,
                                           0x01, 0x00, 0x50, 0x74 };//读取块1
                com1.Write(send, 0, send.Length);
                
            }
            else
            {
                MessageBox.Show("未打开端口");
            }
        }

添加读取卡号功能

private void button5_Click(object sender, EventArgs e)//读取卡号功能
        {
            if (button1.Text == "关闭端口")
            {
                byte[] send = new byte[] { 0xFF, 0x55, 0x00, 0x00, 0x03, 0x03,
                                           0x01, 0x02, 0x0E, 0x70 };//读取块2
                com1.Write(send, 0, send.Length);
                flag = 0;//关闭门禁检测
            }
            else
            {
                MessageBox.Show("未打开端口");
            }
        }

添加写入低频卡密码功能

private void button6_Click(object sender, EventArgs e)//写入密码功能
        {
            if (button1.Text == "关闭端口")
            {
                byte[] send = new byte[] { 0xFF, 0x55, 0x00, 0x00, 0x03,
                   0x04, 0x05, 0x02, 0x00, 0x00, 0x77, 0x77, 0x91, 0x6B };//写入块2 密码为00 00 77 77
                com1.Write(send, 0, send.Length);
                flag = 0;//关闭门禁检测
            }
            else
            {
                MessageBox.Show("未打开端口");
            }
        }

把时钟开启和关闭放入打开串口的循环里

private void button1_Click(object sender, EventArgs e)          //打开串口
        {
            //应该先判断串口是否已经打开
            if (!com1.IsOpen)
            {
                com1.PortName = comboBox1.Text; //端口
                com1.BaudRate = int.Parse(comboBox2.Text);//波特率
                com1.Parity = Parity.None;//奇偶校验
                com1.DataBits = 8;//数据位
                com1.StopBits = StopBits.One;//停止位
                com1.Open();//打开串口

                Timer1.Enabled = true;//←——时钟设置

                com1.DataReceived += new SerialDataReceivedEventHandler(button2_Click);
                //↑串口按钮设置
                button1.Text = "关闭端口";
                button1.BackColor = Color.Red;//←——设置打开后按钮颜色

            }

            else if(com1.IsOpen)
            {
                com1.Close();//关闭串口
                button1.Text = "打开端口";
                button1.BackColor = Color.Green;//←——设置关闭后按钮颜色

                Timer1.Enabled = false;//←——时钟设置
            }
            

        }

添加清空接收发送文本框按钮

private void button8_Click(object sender, EventArgs e) ///清除文本功能
        {
            textBox1.Text = "";//清空
            textBox2.Text = "";//清空
            textBox1.Focus();//焦点文本
        }

添加完成后启动

 使用NewLab实验台,并放上M3模块,把实验台调整到“通讯模式”

 完成后可以安装好LF天线模块,就可以尝试检测低频卡信息和尝试门禁卡功能了。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值