设计界面要具备开关串口的功能,串口协议默认(19200,8位数据宽度,1位停止位,无校验);要具备读取卡号(卡信息)的功能;可以对新卡进行注册;可以对已经注册的卡进行注销;手动读取卡数据(每个小组设定的读卡块位置不同,数据也不同);对读取到的数据进行判断,并正确显示“开门”或“禁止入内”等信息。
介绍
本次我们要做的是用低频卡实现模拟小区门禁系统的作业。随着感应卡技术的发展,门禁系统得到了飞跃式的发展,进入了成熟期,出现了感应卡式门禁系统,它在安全性,方便性,易管理性等方面优势显著,门禁系统的应用领域也越来越广。
课前准备
首先我们要安装Visual Studio Installer这款软件,我们可以在电脑自带的应用商店里下载,也可以在微软官网下载。
官网下载地址:http://b.zhr33.cn/vs/
我们进入官网后可以看到十个版本,我们根据自己电脑配置安装合适的版本,在安装手册里可以看见每个版本所需要的电脑配置参数, 这样我们就能很容易选出我们适合安装的版本(如果你以前用过此软件,对某个版本很熟悉,如果官网没有这个版本,你也可以去微信搜索安装)。安装完成软件后,点快捷方式进入软件,Visual Studio分为社区版、专业版、企业版3个版本,社区版无需激活码 ,我们初学者就用社区版。选了社区版本之后你还要在里面安装模块组件功能扩展包,通常我们安装ASP.NET和Web开发、.NET桌面开发、通用Windows平台开发。讲完了安装,我们之后就可进行我们项目的创建了。
1、门禁系统逻辑框图,工作流程
开始创建项目之前,我们先来了解一下门禁系统工作流程
2、初步了解低频卡电子标签通信协议,命令解析
2.1、电子标签通信协议
我们先来了解主从命令的描述,看一下我们要修改模块所要发送的命令:
2.2、NewLab平台通信协议
2.3、CRC16校验
对于没一串数据,我们CRC16校验都是不同的,我们也很难去了解具体的计算过程,那么我们就可以利用软件去帮我们完成CRC16校验。
CRC16校验链接:http://www.ip33.com/crc.html
使用方法入如下图:
上面这些就是我们要在课程之前先要了解的步骤了。
3、软件设计
3.1、界面设计
我们使用Visual Studio Installer软件创建windos窗体应用,大概解释下面这个样子:
使用控件时,一定要做好控件的命名,不会的可以去查控件命名手册链接地址:https://www.cnblogs.com/netserver/p/4564010.html,这是我们刚开始接触时老师就反复强调的事项。
3.2、代码部分
窗体主函数部分Form代码:
String[] port = SerialPort.GetPortNames();
for (int i = 0; i < port.Length; i++) {cboxSerialPort.Items.Add(port[i]);}
if (port.Length != 0) cboxSerialPort.SelectedItem = 0;
if (!com1.IsOpen)
{
btnOpen.BackColor = Color.Red;
}
打开串口(btnOpen)代码:
if (!com1.IsOpen) //判断串口是否打开
{
com1.PortName = cboxSerialPort.Text; //先获取端口号
com1.BaudRate = 115200; /*int.Parse(comboBox2.Text);*/ //获取选项框2的文本信息,并转换成整数;
com1.DataBits = 8; //设置数据位宽
com1.StopBits = StopBits.One; //设置停止位
com1.Parity = Parity.None; //设置奇偶校验
com1.Open(); //设置协议完成,打开端口
btnOpen.Text = "关闭端口";
btnOpen.BackColor = Color.Green;
button2.Enabled = true;
btnRegister.Enabled = true;
timer1.Enabled = true;
/*com1.DataReceived += new SerialDataReceivedEventHandler(button3_Click);*/
}
else if (com1.IsOpen)
{
com1.Close();
btnOpen.Text = "打开端口";
btnOpen.BackColor = Color.Red;
button2.Enabled = false;
label1.Text = "";
timer1.Enabled = false;
}
注册(btnRegister)代码:
txtDisplay.Text = " ";
byte[] buff = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x03, 0x04, 0x05, 0x01, 0x00, 0x00, 0x44, 0x66, 0x9D, 0xEF };
com1.Write(buff, 0, buff.Length);
label1.Text = "注册完成!";
读卡(btnCardRead)代码:
txtDisplay.Text = " ";
byte[] buff = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x03, 0x03, 0x01, 0x01, 0x0E, 0x70 };
com1.Write(buff, 0, buff.Length);
label1.Text = "读卡成功";
注销(btnOff)代码:
txtDisplay.Text = " ";
byte[] buff = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x03, 0x04, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x47, 0x0C };
com1.Write(buff, 0, buff.Length);
label1.Text = "注销成功";
时间控件(timer)代码:
if (com1.BytesToRead != 0)
{
int len = com1.BytesToRead;
byte[] buffer = new byte[len];
com1.Read(buffer, 0, len);
if (buffer[9] == 0x44 && buffer[10] == 0x66)
{
btnAccessControl.Text = "开门";
btnAccessControl.BackColor = Color.Green;
}
else
{
btnAccessControl.Text = "禁止入内";
btnAccessControl.BackColor = Color.Red;
}
for (int i = 0; i < len; i++)
{
txtDisplay.Text += buffer[i].ToString("X").PadLeft(2, '0') + " ";
}
}
注意:
我们看见代码块里面有很多这样的0Xxx的数据,这就是电子标签通信协议,文章前面也有部分协议,大家对电子标签通信协议一定要记住,只有写了才能读出相应数据块的信息。
4、硬件设计
4.1、连接硬件
当我们用连接线将硬件连接好后(连接位置如下图),接通电源,NEWLab平台波动开关置于“通信模式”,放上低频卡,点击我们设置的界面,就可以完成低频卡的读卡、写卡,注册和注销了。
到这里我们这次的实验就结束了,自己也快去动手做做这个实验吧!不防也叫上你的小伙伴,一起体验这样的快乐,在代码的世界里遨游!
有什么问题的小伙伴也可以在评论区留言,我们一起解决你的疑惑!