开发工具及技术介绍
开发工具:
Microsoft Visual Studio 2019(简称 VS)是美国的开发工具包系列产品。VS 是一个基本的开发工具集,它包括了整个中所需要的大部分工具,如 UML 工具、代码管控工具、(IDE)等等。所写的目标代码适用于微软支持的所有平台,包括、、、、和 Microsoft 及。2018 年 6 月,微软宣布开发新一代集成开发环境(integrated development environment,IDE)Visual Studio 2019。
MySQL 8.0:MySQL 是一个,由瑞典 MySQL AB 公司开发,属于 旗下产品。MySQL 是最流行的之一,在 Web 应用方面,MySQL 是最好的 (Relational Database Management System,关系数据库管理系统) 应用软件之一。
技术介绍:
该课程设计主要使用了.net Window 窗体编程技术,Oracle 的 MySql.Data 技术以及 MySQL8.0 数据库的连接和交互技术以实现数据在系统中的可视化和可修改化。利用编译的 DBHelper.cs 文件实现该技术,对数据库的内容进行增删改查等操作。
2.总体设计
系统总体架构
员工或管理员在登录页面选择不同的身份输入自己的工号和密码后进入系统主页面,点击该页面的菜单项内容进入不同的系统模块进行不同的操作。管理员用户的菜单会额外显示员工管理选项和车位收费标准选项。普通员工登陆之后,菜单中的员工管理选项和车位收费标准选项会隐藏且普通员工无法进行操作。该系统为实现相关的操作,共在数据库中创建了保存管理员相关信息的管理员表、保存员工信息的员工表、保存停车证信息的停车证表、保存停车位信息的停车位表和保存收费标准的收费标准表五个表。
登录模块总体设计
登录模块主要用于识别用户的身份,并按照不同的用户身份进行不同的判断,成功则按照不同的身份类型进入主界面,失败按照识别原因进行相应的提示。模块架构图如图 2-1 所示。
登录模块总体设计
登录模块主要用于识别用户的身份,并按照不同的用户身份进行不同的判断,成功则按照不同的身份类型进入主界面,失败按照识别原因进行相应的提示。模块架构图如图 2-1 所示。
图 2-1 系统总体架构图
登录模块总体设计
登录模块主要用于识别用户的身份,并按照不同的用户身份进行不同的判断,成功则按照不同的身份类型进入主界面,失败按照识别原因进行相应的提示。模块架构图如图 2-1 所示。
图 2-2 登录模块架构图
主界面模块总体设计
主界面由一个 MenuStrip 菜单控件、一个文本提示框 Label 控件和一个 Panel 容器控件组成。菜单选项用于实现用户方便快捷的选择和使用系统的功能,当用户身份为管理员身份时,菜单选项中会额外多出“员工管理”选项和“收费标准”两个选项;当用户身份为普通员工时,这两个选项会隐藏并无法进行操作。当用户需要进行某项操作时,可以点击菜单中的相应选项,点击之后会在 Panel 控件中显示相应的界面以用于用户进行操作。模块架构图如图 2-3 所示。
图 2-3 主界面模块架构图
停车证管理模块总体设计
停车证管理模块包括停车证信息的检索、添加、编辑和删除等功能。主界面菜单中的“停车证管理”选项的子选项用于选择相应功能。停车证办理选项用于实现停车证信息的添加,停车证检索选项用于实现停车证信息的检索、添加、编辑和删除功能。模块架构图如图 2-4 所示。
图 2-4 停车证管理模块架构图
停车位管理模块总体设计
停车位管理模块包括车位信息的查询、添加、编辑和删除以及车辆的驶入、驶出和计费等功能。主界面菜单中的“车位管理”选项用于选择车辆驶入和车辆驶出并计费两种功能;主界面菜单中的“车位信息检索”选项用于实现停车位信息的检索、添加、编辑和删除功能。模块架构图如图 2-5 所示。
图 2-5 停车位管理模块架构图
员工管理模块总体设计
员工管理模块包括对员工信息的检索、添加、编辑和删除的功能。当用户身份为管理员时,主界面的菜单选项会显示“员工管理”选项,用于实现员工信息的查询、添加、删除和密码重置等功能。模块架构图如图 2-6 所示。
图 2-6 员工管理模块架构图
上位机图效果图
硬件设计
硬件连接方式
程序代码
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;
using System.IO;
namespace 高频
{
public partial class Form1 : Form
{
public delegate void showReceiveDelegate(string text); //当采用响应模式,应申明一个委托,实现不同线程的控件实验
SerialPort com = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One);
int com_num = 0;
int timer_num;
string txtName = "RegisterInfo.txt";
//定义
Brush bush1 = null;
Brush bush2 = null;
Brush bush3 = null;
Brush bush4 = null;
Graphics g1 = null;
Graphics g2 = null;
Graphics g3 = null;
//--------------------------------------------
//停车场计费系统
DateTime now1 = DateTime.Now;//获取当前时间
DateTime now2 = DateTime.Now;//获取当前时间
DateTime now3 = DateTime.Now;//获取当前时间
public int money = 10000;
public int money1 = 1;
/*-------------------------------------------------------------
* status_num状态字
* 1,表示读取信息
* 2,激活高频卡
--------------------------------------------------------------*/
int status_num=0;//状态字
public Form1 ()
{
InitializeComponent();
//初始化
g1 = this.pictureBox1.CreateGraphics();
g2 = this.pictureBox2.CreateGraphics();
g3 = this.pictureBox3.CreateGraphics();
bush1 = new SolidBrush(Color.Red);
bush2 = new SolidBrush(Color.Green);
bush3 = new SolidBrush(Color.Yellow);
bush4 = new SolidBrush(Color.Black);
}
//窗体加载
private void Form1_Load(object sender, EventArgs e)
{
//串口初始化
cmbPort.SelectedIndex = 2;
cmbBaudRate.SelectedIndex = 4;
cmbDataBits.SelectedIndex = 0;
cmbStopBits.SelectedIndex = 0;
cmbParity.SelectedIndex = 0;
cmbSector.SelectedIndex = 1;
//定时器初始化
System.Timers.Timer t = new System.Timers.Timer(50);//实例化Timer类,设置间隔时间为1000毫秒 就是1秒;
t.Elapsed += new System.Timers.ElapsedEventHandler(theout); //到达时间的时候执行事件;
t.AutoReset = true; //设置是执行一次(false)还是一直执行(true);
t.Enabled = true; //是否执行System.Timers.Timer.Elapsed事件;
timer_num = 0;
//存储数据空间数据初始化
comboBox1.SelectedIndex = 1;
comboBox2.SelectedIndex = 1;
comboBox3.SelectedIndex = 1;
}
//串口打开与关闭
private void btnOpen_Click(object sender, EventArgs e)
{
if (btnOpen.Text == "打开串口")
{
try
{
if (!com.IsOpen)
{
com.PortName = cmbPort.Text;
com.BaudRate = int.Parse(cmbBaudRate.Text);
com.DataBits = int.Parse(cmbDataBits.Text);
switch (cmbStopBits.SelectedIndex)
{
case 0:
com.StopBits = StopBits.One; break;
case 1:
com.StopBits = StopBits.Two; break;
case 2:
com.StopBits = StopBits.OnePointFive; break;
case 3:
com.StopBits = StopBits.None; break;
}
switch (cmbParity.SelectedIndex)
{
case 0: com.Parity = Parity.None; break;
case 1: com.Parity = Parity.Odd; break;
case 2: com.Parity = Parity.Even; break;
}
com.Open();//打开串口
}
btnOpen.Text = "关闭串口";
txtStatus.Text = "串口已打开!";
btnInformation.Enabled = true;
btnClear.Enabled = true;
button1.Enabled = true;
button2.Enabled = true;
button3.Enabled = true;
button4.Enabled = true;
button5.Enabled = true;
button6.Enabled = true;
button7.Enabled = true;
button8.Enabled = true;
button9.Enabled = true;
button10.Enabled = true;
button11.Enabled = true;
// 数据接收模式变化时,设置串口的数据接收侦听事件
try
{
com.DataReceived += new SerialDataReceivedEventHandler(com_DataReceived); //加载接收事件
}
catch (Exception err)
{
txtStatus.Text = err.ToString();
}
}
catch
{ txtStatus.Text = "串口打开错误或串口不存在!"; }
}
else //关闭串口
try
{
if (com.IsOpen)
com.Close(); //关闭串口
btnOpen.Text = "打开串口";
txtStatus.Text = "串口已关闭!";
btnInformation.Enabled = false;
btnClear.Enabled = false;
button1.Enabled = false;
button2.Enabled =