1. RFID系统

RFID即无线射频识别技术,它是近年来高速发展起来的一种自动化识别技术。-般而言,RFID体系主要包含阅读器部件、射频卡部件、天线部件、主机部件等部件。而且RFID技术主要是使用了无线射频的方法实现在阅读器以及射频卡之间进行非接触式的双向数据传送,从而实现对目标车辆的识别以及数据信息通信的目标。和传统的基于条型码识别、磁卡识别及IC卡识别的方式相比较而言,射频卡具备非接触式、阅读效率高、不易磨损、抗干扰性强、使用寿命长、方便、敲的优势特点,同时还可以支持防止目标冲突的特点,支持同时数张卡片识别的特性。而目前,RFID技术已经开始在交通运输收费领域得到初步的应用,实现了智能化的收费模式。

  1. RFID系统组成框图

1.3 上位机及C#语言

上位机是指可以直接发出操控命令的计算机,一般是PC/host computer/master computer/upper computer,屏幕上显示各种信号变化(液压,水位,温度等)。下位机是直接控制设备获取设备状况的计算机,一般是PLC/单片机single chip microcomputer/slave computer/lower computer之类的。C#是一种最新的、面向对象的编程语言。它使得程序员可以快速地编写各种基于Microsoft .NET平台的应用程序,Microsoft .NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。

上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。下位机不时读取设备状态数据(一般为模拟量),转换成数字信号反馈给上位机。简言之如此,实际情况千差万别,但万变不离其宗:上下位机都需要编程,都有专门的开发系统。上位机应用程序采用C#语言开发遵守C#编程规范刷卡计费管理的功能根据原理机COM协议实现,使用串口线和USB转串口线将PC于原理机连接;上位机程序根据原理机COM协议实现刷卡计费管理的相关功能后,通过串口与原理机进行通信最终完成RFID ETC路费系统软件开发。

1.4 实现功能

1)系统连接数据库,能限定管理员登录使用。

2)管理员能发放卡片,对空白卡写入许可人员个人信息,包括车主,车牌号、QQ、联系电话、余额、本次扣费,并保存到数据库中。

3)已登记车辆通过时,系统能够自动计费并放行。

4)将存储有QQ、车号、金额等信息的射频电子标签卡安装在汽车前方挡风玻璃上。当持卡车辆进入停车收费车道时,车辆感应器会感应到来车的信号,然后激发RFID的读写器来读取此车的射频标签信息,利用微波自动识别技术,可以利用系统用来自动交费而不需要人工进行操作。

2需求分析

随着国民经济、社会的快速发展,汽车工业也得到快速发展,车辆的增多,大大增加了高速公路收费的压力。而传统的高速公路收费模式,不仅仅使用“路路设站”的方法,同时采用人工结合电脑系统收费的模式。这种收费模式不仅容易导致高速公路交通堵塞,严重的可能引|发交通事故,同时还可能延长车辆缴费的等待时间,这就严重地降低了高速公路收费模式的效率。近年来,高速公路收费模式开始进入了智能收费的时代,而借助于无线射频技术(RFID)为开创高速公路智能化收费系统带来了曙光。为了避免高速公路收费过程中的舞弊情况或者是票款流失的情况以及漏费的情况等,为为进一步提升高速公路交通运营的效率、服务水平,为了开创高速公路智能收费系统的新局面,有必要对RFID技术进行介绍,并对RFID技术在智能高速公路收费系统中的应用模式进行分析和探索,从而提高收费系统的性能和效率。

不停车收费技术特别适于在高速公路或交通繁忙的桥隧环境。传统的车道隔离收费系统称为单车道不停车收费系统,在无车道隔离情况下的自由交流下的不停车收费系统通称为自由流不停车收费系统。不停车收费技术的实施,不仅可以大大提高公路的通行能力,使公路收费走向自动化,同时也可以大大降低收费口的噪声水平和废气排放。从而,节约了基建费用和管理费用,也为城市环境的改善做出了突出贡献。

 目前,RFID技术已在我国很多行业得到应用,并取得良好成果。例如,我国已在有条件的部门和地方启动了RFID应用试点工作,主要涉及领域包括:工业自动化;商业自动化;汽车行业;生产管理;供应链管理与现代物流等。RFID技术已成为21世纪全球自动识别技术发展的主要方向。特别是RFID技术在ETC系统中的应用,为交通收费行业的发展做出了不可磨灭的贡献。从未来的交通网络的发展来看,ETC系统将成为交通业的主流,因而该系统在交通收费行业有着广阔的发展前景。

3 系统设计

上位机应用程序采用C#语言开发,遵守C#编程规范,门禁控制功能根据原理机COM协议实现,使用串口线和USB转串口线将PC与原理机连接:上位机程序根据原理机COM协议实现RFID门禁控制的相关功能后,通过串口与原理机进行通信,最终完成RFID门禁控制的相关功能。

ETC路费系统的设计应满足结构简洁、条理清晰的要求,本系统较为简单,其运行流程如图3-1所示:

图 3-1 ETC系统流程图

点击自动缴费选项卡,将电子标签靠近超高频的外接天线,听到“滴”的声音说明超高频模块读到了卡片,软件中会将读到的卡片的卡号显示出来,一个电子标签绑定一辆车。

若这张卡片没有车主信息的话,点击登记按钮对车辆进行登记并保存到数据库中。

对已登记的车辆,当检测到卡片时,将对该标签的车辆扣费,同时控制试验箱上的步进电机转动,模拟ETC自动缴费的功能。

点击删除按钮可以删除车辆信息,将电子标签重置为未登记的状态。

对车辆可以自定义的进行充值。

4 系统实现

4.1登入页面设计

打开程序,系统编译完成后点击“启动调试”,启用程序。输入正确的管理员信息即可执行相应程序。

如图4-1所示:

图4-1 登录页面设计

4.2读卡并保存数据至数据库

连接相应串口设备,使用RFID读卡设备识别相应电子标签。对新的标签进行登记处理,登记车主信息,对旧标签进行相应识别扣费处理。系统实现如图4-2所示:

图4-2 读卡保存数据

4.3查看数据库保存的数据

ETC系统将保存的车主信息同步到数据库中,用于下次自动更新同步,实现方便客户的功能。同时存储的信息在“后台”也可以进行更改查删 效果图如图4-3所示:

图4-3 查看数据库

5 系统优缺点

5.1 优点

能限定管理员登录使用;管理员能发放卡片,对空白卡写入许可人员个人信息,包括车主,车牌号、QQ、联系电话、余额、本次扣费,并保存到数据库中;可以删除车主的信息;已登记车辆通过时,系统可以识别出车主的信息;已登记车辆通过时,系统能够自动计费并放行;充值金额可以自定义;当车主的余额较少时,系统提醒用户及时充值。借助于RFID技术可以为高速公路实现智能化收费,缓解车流拥塞的情况,降低交通压力带来的事故率,提高了收费效率,降低了各种潜在的安全风险。

5.2 缺点

车辆需要停车后才可以识别,会造成交通堵塞,影响车辆的正常通行;无法在一段时间后自动删除车主信息。无法识别快速移动的物体。车主有驾车时间限制,当时间到了的时候,应及时删除车主信息;识别距离不够远。卡片需要尽可能地靠近天线才可以进行识别。当危险人物经过时,不容易进行发现拦截。这是一个对不法分子不能及时限制得缺点。

5.3需要改进的部分

车主有驾车时间限制,系统应在超过车主使用日期后,及时删除车主信息;将卡片识别的距离进行延长,这样便于识别快速移动的物体,减少交通的拥堵;当余额不足时,可以以一个固定值进行自动充值,节省车主时间;金额的充值与扣款没有与时间相连接,无法产生账单供车主进行查询。设置系统错误时得应急方法,保证人员正常进出。

5.4总结

通过此次实训,充分的认识到了不停车收费系统,对这门学科有了更新的认识,RFID射频识别技术是一种非接触的自动识别技术,其基本原理是利用射频信号和空间耦合(电感或电磁耦合)传输特性实现对被识别物体的自动识别。经过这次实训,我收获了很多,一方面学习到了许多以前没学过的专业知识与知识的应用,另一方面还提高了自我动手做项目的本事。本次实训,是对我本事的进一步锻炼,也是一种考验。从中获得的诸多收获,也是很可贵的,是十分有意义的。

代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;
using System.IO.Ports;
using System.Threading;
using System.Data.OleDb;namespace ETCSystem
{public partial class Form1 : Form{Boolean IsLogined = false;Boolean IsConnected = false;private SerialPort SerialPort;private Thread Thread;private delegate void ThreadCallback(ThreadResp resp, String msg);private ThreadCallback threadCallback;public enum ThreadResp{error,updateLabel,updateTag}public enum operation{ add,sub}public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){RefreshCom();String[] strValue = { "7200", "9600", "14400", "19200", "38400", "57600", "115200", "128000", "230400", "460800", "921600", "1228800" };cmb_BaudRate.Items.AddRange(strValue);cmb_BaudRate.SelectedItem = "115200";threadCallback = new ThreadCallback(threadResp);panelHide();panel_PayInfo.Visible = true;}private void panelHide(){panel_PayInfo.Visible = false;panel_Register.Visible = false;panel_TopUp.Visible = false;}/// <summary>/// 线程接收到数据时响应/// </summary>/// <param name="resp"></param>/// <param name="msg"></param>private void threadResp(ThreadResp resp, String msg){switch (resp){case ThreadResp.error:MessageBox.Show(msg, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);break;case ThreadResp.updateLabel:lbl_Connect.Text = msg;break;case ThreadResp.updateTag:txt_Snr.Text = msg;bn_RegisterOrTopUp.Visible = true;panelHide();panel_PayInfo.Visible = true;OleDbConnection conn = new OleDbConnection();conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\database.mdb;Persist Security Info=True";//conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\database.accdb;Persist Security Info=True";conn.Open();String sql = String.Format("SELECT * FROM tab_CarInfo WHERE CardID='{0}'", msg);OleDbCommand cmd = new OleDbCommand(sql, conn);OleDbDataReader dr = cmd.ExecuteReader();if (dr.Read()){txt_info.Text = "缴费信息";txt_PayInfo_Name.ReadOnly = true;txt_PayInfo_CarNum.ReadOnly = true;txt_PayInfo_Phone.ReadOnly = true;txt_PayInfo_QQ.ReadOnly = true;txt_PayInfo_Pay.ReadOnly = true;txt_PayInfo_balance.ReadOnly = true;btn_RegisterOrTopUp.Text = "充值";btn_RegisterOrTopUp.Image = ETCSystem.Properties.Resources.top_up;bn_DeleteOrSave.Visible = true;btn_DeleteOrSave.Text = "删除";btn_DeleteOrSave.Image = ETCSystem.Properties.Resources.delete;txt_PayInfo_Name.Text = dr["UserName"].ToString().Trim();txt_PayInfo_CarNum.Text = dr["CarNum"].ToString().Trim();txt_PayInfo_Phone.Text = dr["Phone"].ToString().Trim();txt_PayInfo_QQ.Text = dr["QQ"].ToString().Trim();txt_PayInfo_Pay.Text = "10";Int32 balance = Int32.Parse(dr["Balance"].ToString().Trim());if (balance < 10){txt_PayInfo_balance.Text = balance.ToString();MessageBox.Show("您的余额不足,请充值!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);}else{updateBalance(msg, "10", operation.sub);txt_PayInfo_balance.Text = (balance - 10).ToString();}}else{txt_info.Text = "车辆未登记";txt_PayInfo_Name.ReadOnly = true;txt_PayInfo_CarNum.ReadOnly = true;txt_PayInfo_Phone.ReadOnly = true;txt_PayInfo_QQ.ReadOnly = true;txt_PayInfo_Pay.ReadOnly = true;txt_PayInfo_balance.ReadOnly = true;btn_RegisterOrTopUp.Text = "登记";btn_RegisterOrTopUp.Image = ETCSystem.Properties.Resources.registerCar_32;bn_DeleteOrSave.Visible = false;txt_PayInfo_Name.Text = "";txt_PayInfo_CarNum.Text = "";txt_PayInfo_Phone.Text = "";txt_PayInfo_Pay.Text = "";txt_PayInfo_balance.Text = "";}conn.Close();conn = null;cmd = null;dr = null;break;default:break;}}/// <summary>/// 刷新串口设备,将连接到PC上的串口设备显示到相应的串口下拉列表中/// </summary>public void RefreshCom(){List<String> ComList;cmb_PortNum.Items.Clear();cmb_PortNum.Text = "";if (GetComList(out ComList) > 0){foreach (String com in ComList){cmb_PortNum.Items.Add(com);}cmb_PortNum.SelectedIndex = 0;}}/// <summary>/// 取得连接到PC上的串口设备的串口号方法/// </summary>/// <param name="ComList"></param>/// <returns></returns>public Int32 GetComList(out List<String> ComList){RegistryKey keyCom = Registry.LocalMachine.OpenSubKey("Hardware\\DeviceMap\\SerialComm");if (keyCom != null){string[] sSubKeys = keyCom.GetValueNames();ComList = new List<string>();foreach (string sName in sSubKeys){ComList.Add((string)keyCom.GetValue(sName));}return ComList.Count;}else{ComList = null;return 0;}}private void btn_Login_Click(object sender, EventArgs e){if (IsLogined){lbl_Login.Text = "您已经登录!";return;}if (txt_UserName.Text.Trim() == ""){lbl_Login.Text = "请填写用户名!";return;}if (txt_PassWord.Text.Trim() == ""){lbl_Login.Text = "请填写密码!";return;}OleDbConnection conn = new OleDbConnection();conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\database.mdb;Persist Security Info=True";conn.Open();String sql = String.Format("SELECT PassWord FROM tab_User WHERE UserName='{0}'", txt_UserName.Text.Trim());OleDbCommand cmd = new OleDbCommand(sql, conn);OleDbDataReader dr = cmd.ExecuteReader();if (dr.Read()){if (((String)dr["PassWord"]).Trim() == txt_PassWord.Text.Trim()){IsLogined = true;lbl_Login.Text = String.Format("登录成功,尊敬的用户:{0},欢迎您!", txt_UserName.Text.Trim());}else{lbl_Login.Text = "您的密码错误,请重新填写!";txt_PassWord.Text = "";txt_PassWord.Focus();}}else{lbl_Login.Text = "您的用户名不存在,请重新填写!";txt_UserName.Text = "";txt_UserName.Focus();}conn.Close();conn = null;cmd = null;dr = null;}private void btn_Reset_Click(object sender, EventArgs e){txt_UserName.Text = "";txt_PassWord.Text = "";}private void btn_Logout_Click(object sender, EventArgs e){if (!IsLogined){lbl_Login.Text = "尚未登录,不能注销!";return;}IsLogined = false;lbl_Login.Text = "已注销,继续使用需重新登录!";}private void btn_SerialOpen_Click(object sender, EventArgs e){if (!IsLogined){lbl_Connect.Text = "尚未登录,不能打开串口!";return;}if (IsConnected){lbl_Connect.Text = "串口已经打开,不能重复打开串口!";return;}if (cmb_PortNum.SelectedIndex < 0){lbl_Connect.Text = "请选择与设备连接的串口地址!";return;}if (cmb_BaudRate.SelectedIndex < 0){lbl_Connect.Text = "错误:请选择合适的波特率!";cmb_BaudRate.Focus();return;}String PortName = cmb_PortNum.Text.Trim();Int32 BaudRate = Int32.Parse(cmb_BaudRate.Text.Trim());try{SerialPort = new SerialPort(PortName);SerialPort.BaudRate = BaudRate;SerialPort.DataBits = 8;SerialPort.StopBits = StopBits.One;SerialPort.Parity = Parity.None;SerialPort.Open();if (SerialPort.IsOpen) //打开成功{lbl_Connect.Text = String.Format("串口{0}打开成功!", PortName);IsConnected = true;//启动线程接收数据Thread = new Thread(new ThreadStart(receiveThread));Thread.IsBackground = true;Thread.Start();Thread.Sleep(20);sendAFrame();}else//打开失败{lbl_Connect.Text = String.Format("串口{0}打开失败!", PortName);IsConnected = false;}}catch{lbl_Connect.Text = String.Format("串口{0}打开失败!", PortName);IsConnected = false;}}private void receiveThread(){Byte[] rcvData = new Byte[125];String rcvStr = "";DateTime startTime = DateTime.Now.AddSeconds(-5);DateTime endTime;TimeSpan timeSpan;while (IsConnected){try{while (SerialPort.BytesToRead > 0){Int32 count = SerialPort.Read(rcvData, 0, rcvData.Length);for (Int32 i = 0; i < count; i++){rcvStr += String.Format("{0:X2}", rcvData[i]);}}if (!rcvStr.Equals("")){endTime = System.DateTime.Now;timeSpan = endTime.Subtract(startTime);startTime = endTime;if (timeSpan.Seconds >= 2){//数据处理Int32 StartPos, StopPos;StartPos = rcvStr.IndexOf("EECC");StopPos = rcvStr.IndexOf("0D0A");if ((StartPos >= 0) && (StopPos > StartPos)){String framestr = rcvStr.Substring(StartPos, StopPos - StartPos + 4);processAFrame(framestr);rcvStr = rcvStr.Remove(0, StopPos + 4);}}rcvStr = "";}}catch (Exception ex){this.BeginInvoke(threadCallback, ThreadResp.error, String.Format("数据接收异常,异常信息为{0}", ex.Message));IsConnected = false;break;}Thread.Sleep(20);}try{SerialPort.Close();SerialPort = null;this.BeginInvoke(threadCallback, ThreadResp.updateLabel, "串口关闭成功!");}catch{ }}/// <summary>/// 15693发送一帧数据的方法/// </summary>/// <param name="command"></param>/// <param name="select"></param>/// <param name="data"></param>private void sendAFrame(){if (!IsConnected){lbl_Connect.Text = "错误:请先通过串口连接设备!";return;}Byte[] frame = new Byte[12];frame[0] = 0xEE;frame[1] = 0xCC;frame[2] = 0x01;frame[3] = 0x05;frame[4] = 0x00;frame[5] = 0x00;frame[6] = 0x01;frame[7] = 0x00;frame[8] = 0x00;frame[9] = 0x00;frame[10] = 0x0D;frame[11] = 0x0A;try{SerialPort.Write(frame, 0, frame.Length);}catch (InvalidOperationException ex){lbl_Connect.Text = String.Format("发送异常!:{0}", ex.Message);IsConnected = false;}}/// <summary>/// 15693解析一帧数据的方法/// </summary>/// <param name="frameStr"></param>private void processAFrame(String frameStr){Byte[] framedata = new Byte[frameStr.Length / 2];for (int i = 0; i < framedata.Length; i++){ framedata[i] = Convert.ToByte(frameStr.Substring(i * 2, 2), 16); }Byte statusCode = framedata[2];Byte LByte = framedata[6];Byte HByte = framedata[5];Int32 DataLength = HByte * 256 + LByte;String DataByte = frameStr.Substring(14, DataLength * 2);this.BeginInvoke(threadCallback, ThreadResp.updateTag, DataByte);}private void btn_SerialClose_Click(object sender, EventArgs e){if (!IsConnected){lbl_Connect.Text = "串口尚未打开,无需关闭";return;}else{IsConnected = false;}}private void btn_SerialRefresh_Click(object sender, EventArgs e){RefreshCom();}private void btn_RegisterOrTopUp_Click(object sender, EventArgs e){if (btn_RegisterOrTopUp.Text.Equals("登记")){txt_info.Text = "车辆登记";panelHide();panel_Register.Visible = true;txt_money.Text = "充值金额:";txt_Register_Name.Clear();txt_Register_CarNum.Clear();txt_Register_Phone.Clear();txt_Register_QQ.Clear();txt_Register_TopUp.Clear();txt_Register_Name.ReadOnly = false;txt_Register_CarNum.ReadOnly = false;txt_Register_Phone.ReadOnly = false;txt_Register_QQ.ReadOnly = false;txt_Register_TopUp.ReadOnly = false;bn_DeleteOrSave.Visible = true;btn_DeleteOrSave.Text = "保存";btn_DeleteOrSave.Image = ETCSystem.Properties.Resources.save_48;}else{txt_info.Text = "充值";panelHide();panel_TopUp.Visible = true;String strCarID = txt_Snr.Text.Trim();if (strCarID.Equals("")){MessageBox.Show("未发现卡片!", "错误");return;}OleDbConnection conn = new OleDbConnection();conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\database.mdb;Persist Security Info=True";conn.Open();String sql = String.Format("SELECT * FROM tab_CarInfo WHERE CardID='{0}'", strCarID);OleDbCommand cmd = new OleDbCommand(sql, conn);OleDbDataReader dr = cmd.ExecuteReader();if (dr.Read()){txt_TopUP_balance.Text = dr["Balance"].ToString().Trim();}else{MessageBox.Show("卡片未注册,请先注册!", "提示");}conn.Close();conn = null;cmd = null;dr = null;txt_TopUp.Clear();bn_DeleteOrSave.Visible = false;}}private void btn_DeleteOrSave_Click(object sender, EventArgs e){String strCardID = txt_Snr.Text.Trim();OleDbConnection conn = new OleDbConnection();conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\database.mdb;Persist Security Info=True";OleDbCommand cmd;if (strCardID.Equals("")){MessageBox.Show("未发现卡片!", "错误");return;}if (btn_DeleteOrSave.Text.Equals("删除")){try{conn.Open();String sql = String.Format("DELETE FROM tab_CarInfo WHERE CardID='{0}'", strCardID);cmd = new OleDbCommand(sql, conn);if (cmd.ExecuteNonQuery() > 0){bn_DeleteOrSave.Visible = false;btn_RegisterOrTopUp.Text = "登记";btn_RegisterOrTopUp.Image = ETCSystem.Properties.Resources.registerCar_32;MessageBox.Show("删除成功!", "提示");txt_info.Text = "车辆未登记";txt_PayInfo_Name.Clear();txt_PayInfo_CarNum.Clear();txt_PayInfo_Phone.Clear();txt_PayInfo_QQ.Clear();txt_PayInfo_Pay.Clear();txt_PayInfo_balance.Clear();txt_Register_Name.Clear();txt_Register_CarNum.Clear();txt_Register_TopUp.Clear();txt_Register_Phone.Clear();conn.Close();conn = null;cmd = null;}}catch (Exception ex){MessageBox.Show(String.Format("删除错误,错误信息:{0}", ex), "错误");}}else{//保存登记信息String strName = txt_Register_Name.Text.Trim();String strCarNum = txt_Register_CarNum.Text.Trim();String strPhone = txt_Register_Phone.Text.Trim();String strQQ = txt_Register_QQ.Text.Trim();String strMoney = txt_Register_TopUp.Text.Trim();if (strName.Equals("")){MessageBox.Show("请输入车主姓名!", "错误");return;}if (strCarNum.Equals("")){MessageBox.Show("请输入车牌号!", "错误");return;}try{conn.Open();String sql = "insert into tab_CarInfo(CardID, UserName, CarNum, Phone,QQ, Balance) values('" + strCardID + "', '" + strName + "', '" + strCarNum + "', '" + strPhone + "', '" + strQQ + "', '" + strMoney + "')";cmd = new OleDbCommand(sql, conn);if (cmd.ExecuteNonQuery() > 0){btn_RegisterOrTopUp.Text = "充值";btn_RegisterOrTopUp.Image = ETCSystem.Properties.Resources.top_up;txt_info.Text = "车辆信息";MessageBox.Show("登记完成!", "提示");btn_DeleteOrSave.Text = "删除";btn_DeleteOrSave.Image = ETCSystem.Properties.Resources.delete;conn.Close();conn = null;cmd = null;txt_money.Text = "余额:";txt_Register_Name.ReadOnly = true;txt_Register_CarNum.ReadOnly = true;txt_Register_Phone.ReadOnly = true;txt_Register_QQ.ReadOnly = true;txt_Register_TopUp.ReadOnly = true;txt_PayInfo_Name.Text = strName;txt_PayInfo_CarNum.Text = strCarNum;txt_PayInfo_Phone.Text = strPhone;txt_PayInfo_QQ.Text = strPhone;txt_PayInfo_balance.Text = strMoney;}}catch (Exception ex){MessageBox.Show(String.Format("保存错误,错误信息:{0}", ex), "错误");}}}private void txt_Register_Phone_KeyPress(object sender, KeyPressEventArgs e){if (!(Char.IsNumber(e.KeyChar)) && e.KeyChar != (char)13 && e.KeyChar != (char)8){e.Handled = true;}}private void txt_TopUp_KeyPress(object sender, KeyPressEventArgs e){if (!(Char.IsNumber(e.KeyChar)) && e.KeyChar != (char)13 && e.KeyChar != (char)8){e.Handled = true;}}private void btn_Confirm_Click(object sender, EventArgs e){String strCardID = txt_Snr.Text.Trim();if (strCardID.Equals("")){MessageBox.Show("未发现卡片!", "错误");return;}String strMoney = txt_TopUp.Text.Trim();MessageBox.Show(updateBalance(strCardID, strMoney, operation.add), "提示");}private void btn_Cancle_Click(object sender, EventArgs e){panelHide();panel_PayInfo.Visible = true;txt_info.Text = "车辆信息";bn_DeleteOrSave.Visible = true;btn_DeleteOrSave.Image = ETCSystem.Properties.Resources.delete;btn_DeleteOrSave.Text = "删除";}private String updateBalance(String CardID, String strMoney, operation operation){String msg = "";OleDbConnection conn = new OleDbConnection();conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\database.mdb;Persist Security Info=True";conn.Open();String sql = String.Format("SELECT * FROM tab_CarInfo WHERE CardID='{0}'", CardID);OleDbCommand cmd = new OleDbCommand(sql, conn);OleDbDataReader dr = cmd.ExecuteReader();if (dr.Read()){Int32 balance = Int32.Parse(dr["Balance"].ToString().Trim());Int32 topUp = Int32.Parse(strMoney);String strBalance = "0";switch (operation){ case operation.add:strBalance = (balance + topUp).ToString();break;case operation.sub:strBalance = (balance - topUp).ToString();break;default:break;}string strUpdt = String.Format("UPDATE tab_CarInfo SET Balance = '" + strBalance + "' WHERE CardID='{0}'", CardID);cmd = new OleDbCommand(strUpdt, conn);if (cmd.ExecuteNonQuery() > 0){if (operation == operation.add){msg = "充值成功!";}txt_PayInfo_balance.Text = strBalance;txt_TopUP_balance.Text = strBalance;}else{if (operation == operation.add){msg = "充值失败!";}}}else{msg = "卡片未注册,请先注册!";}conn.Close();conn = null;cmd = null;dr = null;return msg;}private void txt_Register_TopUp_KeyPress(object sender, KeyPressEventArgs e){if (!(Char.IsNumber(e.KeyChar)) && e.KeyChar != (char)13 && e.KeyChar != (char)8){e.Handled = true;}}private void panel_PayInfo_Paint(object sender, PaintEventArgs e){}private void txt_TopUP_balance_TextChanged(object sender, EventArgs e){}}
}

物联网RFID技术在高速ETC中的应用相关推荐

  1. RFID技术在物流行业中的应用:优化物流流程,提高效率

    随着物流行业的不断发展,如何优化物流流程.提高效率成为了每个物流从业者关注的重点.RFID技术作为一种先进的自动识别技术,正逐渐被广泛应用于物流行业,帮助企业降低成本.提高运营效率.本文将重点介绍RF ...

  2. 物联网rfid技术在工业自动化中的应用

    无论是互联网还是物联网都是生活中不可缺少的一部分,如何将物联网的技术应用到工业自动化及生产生活中,是我们面临的一大考验,因为物联网不仅能够实现我国的节能减排总目标,还能够改变和提高生产管理模式,所以我 ...

  3. 物联网RFID技术在智能交通系统的应用

    随着经济的发展和社会的进步,城市人口增多,汽车数量持续增加,交通拥挤和堵塞现象日趋严重,由此引发的环境噪声.大气污染.能源消耗等已经成为现在全球各工业发达国家和发展中国家面临的严峻问题.智能交通系统作 ...

  4. RFID技术在智能超市中的应用

    物联网技术作为目前备受关注的技术,多方面应用在各个行业,特别对零售业有十分重要的推动作用.能够让消费者在超市.商店中方便了解到商品位置.详细信息.打折促销活动信息等内容,显然有利于增加消费者购物体验, ...

  5. RFID技术在机床刀具管理中的应用

    应用背景 随着现代数控技术的快速发展,设备和加工零件品种的呈多元化.由于生产加工的实际应用需要,大量的刀具频繁地使用在刀具库以及机床之间流动交换.随着刀具在数量和种类上急剧增加,生产车间各种类型及规格 ...

  6. RFID技术在堆场自动化管理中的应用解析

    全球港口场桥设备中轮胎式起重机(以下简称轮胎吊)占据比例较大,轨道式起重机占据比例较小.因此,自动化.智能化绿色港口的发展离不开轮胎吊,同样,轮胎吊自动化改造将会为绿色港口.港机制造企业走向自动化.智 ...

  7. RFID技术产品在制造工业中的应用方案

    RFID技术产品在制造工业中的应用方案 改革开放到现在,我国的发展呈直线上升,无论从居民生活水平提高.经济发展,还是国家安全的角度都需要强大.独立.自主的制造业.新工业革命的出现,不仅仅是挑战,更是一 ...

  8. 铨顺宏RFID:试卷管理中RFID技术智能系统发挥着什么样的作用

    1.项目背景 在我国的教育招生考试中,试卷的管理一直是比较棘手的问题,它涉及试卷的组卷.印刷.封包.运输.发放.回收.入库.阅卷以及历史保存等一系列复杂的流程,且数量巨大.到目前为止,我国的试卷管理主 ...

  9. 基于RFID技术智慧工厂智能仓储管理平台解决方案

    现在RFID技术应用太广泛了,尤其在工业方面,今天就重点介绍一下RFID技术在智慧工厂中的应用.

最新文章

  1. nodejs png 转 rgb_90行代码,让微信登录界面的地球转起来
  2. MPP 二、Greenplum数据加载
  3. hybris导出系统已有数据的两种方式
  4. python不同时间周期k线_请问期货不同时间级别的k线呈现相反形态怎么判断买卖点?...
  5. 百度app不支持popstate_这一次谷歌很强硬,从现在起你的 App 再不支持,将拒绝上架!...
  6. [Web Chart系列之五] 1. 实战draw2d 之总体介绍
  7. CentOS6.5下安装mongodb
  8. 产品经理的书籍笔记(一)--------《神一样的产品经理》
  9. 服务器系统怎么设置从光盘启动,电脑BIOS怎么设置光盘启动 三种类型BIOS设置光驱启动的图文详解教程...
  10. 纽约市建筑能源得分预测代码分析
  11. Excel实现数据项校验的功能---VBA的编写以及数据有效性的设置
  12. You must restart adb and Eclipse处理方法(sjk_daemon.exe占用5037端口)
  13. java.util.concurrent.TimeoutExceptiofor com.alibaba.nacos.shaded.io.grpc.stub.ClientCalls$GrpcFuture
  14. CAD中插入外部参照字体会变繁体_CAD中形形色色的“替换”技巧你确定都知道了?...
  15. 线程安全的随机数生成
  16. 程序员职业生涯11个阶段
  17. html怎么给图片加鼠标滑过效果,jquery给图片添加鼠标经过时的边框效果
  18. 达梦数据库 find_in_set 函数适配
  19. dubbo/dubbox(一)源码编译
  20. 【Hard to Park】Estimating Parking Difficulty at Scale

热门文章

  1. 怎样做一个iOS App的启动分层引导动画?
  2. 金典指纹考勤机安装及使用操作步骤
  3. 第六章 go 文件操作
  4. 关于《算法的乐趣》历法一章演示程序错误的说明
  5. 挑战华为社招:2021Java高级面试题汇总解答
  6. Python实验报告 实验15 - 体育竞技分析
  7. Android9自带的游戏怎么玩,[Android]手机也能玩电脑游戏,PC游戏模拟器ED302-9最新版及详细使用帮助 | 樱花庄...
  8. 广域虚拟数据空间中边缘缓存系统的研究与实现
  9. 安装HighSierra版本黑苹果
  10. PyTorch 和 TensorFlow的区别