在物联网领域,常用的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天线模块,就可以尝试检测低频卡信息和尝试门禁卡功能了。