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

news/2024/4/19 10:47:00/

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


http://www.ppmy.cn/news/370665.html

相关文章

串口通信接口

目录 SPI(Serial Peripheral Interface&#xff09; 1、SPI概述 2、SPI信号线 3、SPI典型应用 UART (Universal Asynchronous Receiver/Transmitter) 1、概述 2、RS232 3、RS422 4、RS485 I2C (Inter&#xff0d;Integrated Circuit) 1、IIC概述 2、IIC速率 3、II…

Java串口通信,串口读写卡工具介绍

前言 Java串口通信&#xff0c;串口读写卡工具介绍。这里介绍下自己做的一个java版串口读写卡工具。 RXTXcomm.jar这个串口库很赞&#xff01;32位或者64位系统都能用。之前一直使用的是sun提供的comm.jar,且用他做了个读写卡测卡工具&#xff0c;结果只有32位系统下能用。 …

C++串口编程

CSerialPort 类&#xff0c;头文件&#xff1a; SerialPort.h #ifndef _SERIAL_H #define _SERIAL_H#include <string> #include <Windows.h> #include <cstddef> #include <cstdlib> #include <cassert>// 定义串口类型 #ifdef _UNICODE typede…

串口卡住问题分析与解决

对于消息类系统而言任何阻塞都会导致整个系统的消息被卡住造成系统假死的问题。今天来说说串口导致系统卡死的问题 1.问题说明&#xff1a; 路由器在挂机过程中&#xff0c;偶现串口卡住&#xff0c;web页面进不去&#xff0c;有限终端拿不到地址的现象。 2.问题分析&#xff1…

STM32串口卡死问题

本次遇到的问题是USART串口发送函数卡死程序&#xff0c;究其原因原来是串口发送函数中的发送空寄存器没有置位&#xff0c;且超时时间设置的太大导致程序死循环&#xff0c;直到发送超时退出。 在调用CUBE的串口发送函数时一定要注意写的方式。关于传送完毕&#xff0c;有人用…

【啃】《Java核心卷 一》 | 第一,二章

文章目录 《Java核心技术卷 一》第一章 概述第二章 Java编程环境 图书推荐 《Java核心技术卷 一》 第一章 概述 前言&#xff1a;本书与一些”0基础入门“的书定位感觉是不太一样的&#xff0c;可能就像书名所说&#xff0c;是”核心技术“叭。书中经常将Java语言与 c 进行对比…

TypeScrip-03(接口和对象类型)

目录 interface 重名 、重合 任意属性 [propName: string] 可选 ? 操作符、 readonly 只读 interface 接口继承 interface 定义函数类型 在 ts 中&#xff0c;定义对象的方式要用关键字 interface&#xff08;接口&#xff09;&#xff0c;我的理解是使用interface来定义…

读书笔记:《德鲁克管理思想精要》- 6

《德鲁克管理思想精要》 美 . 彼复 . 德鲁克 著 李维安 王世权 刘金岩 译 《The Essential Drucker》The Best of Sixty Years of Peter Druckers Essential Writings on Management - 18&#xff0c;19&#xff0c;20&#xff0c;21&#xff0c;22 - 发挥沟通作用 …

想了解会计软件吗?来看看Zoho Books的功能和特点

Zoho Books 是一款功能强大的在线会计软件&#xff0c;为企业提供多合一解决方案&#xff0c;该解决方案可定制、可扩展&#xff0c;并使始终保持合规。 轻松生成电子发票 在Zoho Books中&#xff0c;您可以通过包含电子发票架构中提到的所有必填字段来创建电子发票格式的发票。…

STM32中重映射的功能和机理

在STM32系列微控制器中&#xff0c;GPIO端口具有多种功能&#xff0c;如输入、输出、模拟输入/输出等。为了提高GPIO的灵活性和可用性&#xff0c;STM32系列微控制器提供了重映射&#xff08;Remap&#xff09;功能。 重映射功能允许将一个GPIO端口重新映射到另一个GPIO端口上…

SSR渲染-初识Nuxt-01

SSR服务端渲染 SSR服务端渲染&#xff1a;在后端将html页面处理好&#xff0c;前端直接展示&#xff08;可以解决为后端给你传了一个html脚本&#xff0c;全段渲染&#xff09; 为什么要有SSR服务端渲染&#xff1f; 可以解决单页面首屏加载慢的问题&#xff0c;同时有利于用…

大学物理(上)-期末知识点结合习题复习(5)——刚体力学-转动惯量、力矩、线密度 面密度 体密度、平行轴定理和垂直轴定理、角动量定理和角动量守恒定律

目录 刚体的定轴转动 题1 题目描述 题解 题2 题解 题3 题目描述 题解 题4 题目描述 题解 题5 题目描述 题解 角动量定理和角动量守恒定律 刚体的定轴转动 1.转动动能 由&#xff0c;得 表示质量 表示质量分布点 2.转动惯量 为刚体对给定轴的转动惯量&…

显卡维修之显存位置如何确认

众所周知&#xff0c;一般显卡花屏通常是由显存问题引起&#xff0c;也有可能是核心脱焊。这里主要说的是N卡&#xff0c;即NVIDIA显卡。 通过mats工具可以知道是哪一个位置上的显存出问题&#xff0c;如下图B0报错 知道显存出问题&#xff0c;那么就需要换显存&#xff0c;下…

实时监测GPU的显存和显存清理小功能学习

目录 一、pynvml库的简单使用 二、显存清理 在跑神经网络训练或者推理的时候&#xff0c;有的时候很有必要实时监测一下显存的状态。NVIDIA显卡在终端管理界面&#xff0c;使用命令&#xff1a;watch -n 3 nvidia-smi可以指定每隔几秒中来显示一下显卡信息。当然NVIDIA也是开…

如何检测显卡类型和OpenGL版本?

摘要 OpenGL是一个行业标准的3D图像API。运行 CityEngine 需要 OpenGL 2.x 或更高版本。OpenGL 驱动通常与显卡驱动和支持的软件&#xff08;例如&#xff1a;DirectX&#xff09;一同安装。 过程 1.检测显卡类型&#xff08;Windows&#xff09;&#xff1a; 1&#xff09;…

宣布推出NVIDIA DGX GH200:首款100TB显卡显存系统

在 COMPUTEX 2023 上&#xff0c;NVIDIA 发布了 NVIDIA DGX GH200 &#xff0c;这标志着 GPU 加速计算的又一次突破&#xff0c;为要求最严苛的巨型 AI 工作负载提供支持。 除了描述 NVIDIA DGX GH200 架构的关键方面外&#xff0c;本文还讨论了 NVIDIA Base Command 如何实现快…

Material—— RBD(Houdini To UE)

Houdini刚体碎块导入UE&#xff0c;有两个方面需还原&#xff0c;一是材质还原&#xff0c;一是动态还原&#xff1b; 一&#xff0c;ABC to UE 材质方面&#xff0c;Houdini里的每个Primtive Group属性&#xff0c;都表示UE内的对应材质球&#xff1b;导入时勾选Find Material…

Spark集群部署和启动与关闭

上一篇我们讲了Hadoop集群部署和启动与关闭&#xff0c;今天我们讲一下Spark集群部署和启动与关闭。首先我们先来了解一下Spark集群部署模式&#xff0c;分别有以下三种&#xff1a; Standalone   Standalone&#xff08;独立模式&#xff09;是Spark一种简单的集群部署模式&…

Python之快速排序

算法思路&#xff1a; 我们首先判断数组是否只有一个元素或没有元素&#xff0c;如果是则直接返回原数组。否则&#xff0c;我们选择一个基准值&#xff08;这里我们选择数组的第一个元素&#xff09;&#xff0c;并将数组分为两个部分&#xff1a;小于基准值和大于基准…

[srpingboot]菜鸟学习-ReSTful

REST即表述性状态转移&#xff08;英文&#xff1a;Representational State Transfer&#xff0c;简称REST&#xff09;&#xff0c;是一种针对网络应用的设计和开发方式&#xff0c;可以降低开发的复杂性&#xff0c;提高系统的可伸缩性。它主要描述了资源的表述以及资源之间的…