在我们开发一些项目的时候,一般需要一些外围的设备进行数据处理,如ID/IC读卡器获取卡号、激光条码扫描枪、USB摄像头、USB方式的小票据打印机(POS打印机)、USB来电录音盒、普通打印机等一系列附属设备。借助这些设备,可以使我们的业务流程更严谨,输入数据更方便,或者能够一些特殊的数据等功能。本文主要介绍其中的ID读卡器(IC读卡器)快速读取卡号,以及实用激光条码枪的条码扫描录入功能,后面的一些硬件设备的处理,后续文章在继续介绍。
1、设备介绍
前面介绍的设备,在很多场合上都可能用到,如我的会员管理系统里面,就需要用到下面的设备处理。
本文主要针对性了解ID读卡器和条码枪的设备数据处理,这两种设备虽然不同,但是它们相似的地方就是都支持在光标处录入数据的,就有点类似我们的键盘快速录入一样,当然激光条码枪也支持很多种方式的事件处理操作,这是后话。
2、ID读卡器数据读取界面和条码扫描枪读取界面的分析介绍
在我的会员管理系统里面,录入卡号一般是通过ID读卡器获取的,在界面上设置一个可以弹出录入的文本框,也方便手工录入卡号,如下面的界面功能所示。
当然,有时候,我们可能不需要提供手工录入,那么就不能通过光标录入方式获取扫描的内容,因为我们把输入框设置为只读的了,所以这种情况,就就应该通过事件来获取设备的输入内容。
在条码枪处理读取条形码或者二维码的时候,我们一般都是和商品相关的地方使用条形码,二维码也可以使用,条形码可能一般带有数据供阅读,二维码则没有,但是都可以通过设备读取出来到文本框里面,一般如果录入,就停放光标在文本框就可以了,如商品的信息的录入。在我们需要输入条码的地方点一下,然后操作条码枪录入条码即可,这种不需要额外的代码处理。
但是对于一些我们需要快速录入商品信息的界面,如客户消费界面,那么就需要对条码的事件进行处理了。
例如下面的界面,在消费确认前的产品录入,我们都是通过条码枪的快速扫描产品进行录入的,这时候条码枪就代替了手工的录入,我们可以每次扫描一次,就在列表里面自动增加一个对应商品的记录,非常方便的了。
3、通用的读卡操作和条码扫描枪操作实现
在前面小节介绍了一些利用ID读卡器录入数据和使用条码枪的场景,对于如果是在可输入文本框里面获得内容,不用任何编码,如果是在只读界面或者窗体上获得设备的数据,那么就可以通过事件进行处理了,那么读卡器和扫描枪的事件应该如何处理的呢。
我的做法,是统一在我的Winform开发框架的界面层基类模块里面,增加一些硬件相关的处理类和界面,这样在各个框架派生出来的项目就可以很方便使用了。
其中Device里面的CardReader就是IC、ID读卡器获取操作的处理,一般来说,这些卡都是以00开始的,所以我们的处理类,通过一个Time来控制连续获取数据的处理就可以了,主要就是监听KeyUp事件。
以CardReader为例,它的完整代码如下所示。
/// <summary> /// 读卡器封装类 /// </summary> public class CardReader { private Control _hostCtrl; private string _cardCode; private Timer _timer; private const int CARD_CODE_LEN = 10; private const string CARD_CODE_START = "00"; /// <summary> /// 读卡器读到一张卡的事件 /// </summary> public event CardReadEventHandler CardRead; /// <summary> /// 默认读卡器(挂在主窗体上,会被主窗体初始化,在模块里用肯定是安全的) /// </summary> public static CardReader Default { get; set; } /// <summary> /// 构造器 /// </summary> /// <param name="hostCtrl">接受键盘事件的宿主控件</param> public CardReader(Control hostCtrl) { _hostCtrl = hostCtrl; if (_hostCtrl is Form) { (_hostCtrl as Form).KeyPreview = true; } _hostCtrl.KeyUp += new KeyEventHandler(hostCtrl_KeyUp); _cardCode = ""; _timer = new Timer(); _timer.Interval = 20; _timer.Tick += new EventHandler(timer_Tick); _timer.Start(); } /// <summary> /// 判断是否卡号 /// </summary> /// <param name="code"></param> /// <returns></returns> public static bool IsCardCode(string code) { return code.Length == CARD_CODE_LEN && code.StartsWith(CARD_CODE_START); } /// <summary> /// 定时器到期的事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void timer_Tick(object sender, EventArgs e) { //达到一定的位数才开始判断 if (_cardCode.Length >= CARD_CODE_LEN) { _cardCode = _cardCode.Trim((char)13); if (IsCardCode(_cardCode)) { _timer.Stop(); OnCardRead(_cardCode); } } _cardCode = ""; _timer.Start(); } /// <summary> /// 监听按键弹起的事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void hostCtrl_KeyUp(object sender, KeyEventArgs e) { _timer.Stop(); _cardCode = _cardCode + (char)e.KeyValue; _timer.Start(); } private void OnCardRead(string scanCode) { if (CardRead != null) { CardRead(scanCode); } } } /// <summary> /// 读卡器读到一张卡的事件处理委托 /// </summary> /// <param name="cardCode"></param> public delegate void CardReadEventHandler(string cardCode);
CardReader封装类, 它的使用操作如下所示。我们通过事件就可以获取到完整的输入内容,然后进行数据的绑定或处理即可,代码如下所示。
public partial class FrmProcessConsumption : BaseDock { /// <summary> /// 会员信息 /// </summary> private MemberInfo memberInfo { get; set; } /// <summary> /// 读卡器接口 /// </summary> private CardReader cardReader; public FrmProcessConsumption() { InitializeComponent(); ................................ cardReader = new CardReader(this); cardReader.CardRead += new CardReadEventHandler(cardReader_CardRead); } void cardReader_CardRead(string cardCode) { this.txtMember_CardNo.Text = cardCode; BindMemberData(); }
然后我们为了方便使用,还可以定义一个统一的处理读卡器和扫描枪的接收数据的小窗口。
这个弹出的小窗口用来处理读卡器,扫描枪等信息的录入就可以了,当然上述的如CardReader/USBScanner还是可以独立使用,如我们在一个只读控件或者窗口里面,一样可以监听到对应的设备数据读取操作,但设备有数据读取完成过后,就会触发相应的事件了。
下面代码就是上面设备信息读取的代码
/// <summary> /// 读卡器、USB条码扫描器、串口条码扫描器数据读取及显示窗体 /// </summary> public partial class DeviceReaderDialog : BaseForm { private CardReader _cardReader; private USBScanner _usbScanner;public DeviceReaderDialog(DeviceType type = DeviceType.Card) { InitializeComponent(); //能手填 this.Readonly = false; if (type == DeviceType.Card) { this._cardReader = new CardReader(this); this._cardReader.CardRead += new CardReadEventHandler(_cardReader_CardRead); } else if (type == DeviceType.UsbScanner) { this._usbScanner = new USBScanner(this); this._usbScanner.ScannerRead += new ScannerReadEventHandler(Scanner_ScannerRead); } } void Scanner_ScannerRead(string scanCode) { this.txtCode.Text = scanCode; DialogResult = DialogResult.OK; } void _cardReader_CardRead(string cardCode) { this.txtCode.Text = cardCode; DialogResult = DialogResult.OK; } public string Code { get { return txtCode.Text; } } public bool Readonly { get { return txtCode.Properties.ReadOnly; } set { txtCode.Properties.ReadOnly = value; this.btnOK.Enabled = !value; this.btnOK.Visible = !value; } } private void DeviceReaderDialog_Load(object sender, EventArgs e) { if (!this.Readonly) { this.KeyDown += new KeyEventHandler(DeviceReaderDialog_KeyDown); } } void DeviceReaderDialog_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { this.DialogResult = DialogResult.OK; } } }
推荐一款适合库存管理专用扫描枪:FS01指环式条码扫描枪
相关推荐
总的来说,"winform+usb扫码枪与usb读卡器监听"项目涉及了C#编程、WinForm设计、设备交互以及数据解析等多个技术领域,对于理解和掌握.NET桌面应用开发具有一定的实践价值。在实际开发中,开发者需要考虑设备兼容性...
C# WinForm开发框架是一种基于.NET Framework的桌面应用程序开发工具,它为开发者提供了一套完整的控件、设计模式和架构,使得创建具有丰富用户界面的Windows应用程序变得更加便捷和高效。这款框架尤其适合初学者,...
【Winform快速开发框架】是一种基于Windows Forms(Winform)技术的高效开发工具,它针对企业级应用提供了便捷的框架支持。这个框架的核心特点是利用基类的三层架构,旨在简化开发过程,提高代码复用性,同时保持...
C# Winform通用开发框架,支持多语言,多数据库,自动更新,模块化,可用其开发任意CS端系统。此框架没有任何版权限制,支持拿来商用。此框架内部集成了大部分的数据库,可以随意更换数据库,且封装好了所有的实体...
Winform通用框架之权限管理系统---------菜单,开发界面。 在csdn一篇博客中看到文章Winform通用框架之权限管理系统,但是只有文章没有源码就是耍流氓。于是自己写了出来,可用于所有管理系统的开发框架。 软件的...
C# winform开发框架,适合初学者,包括模块 版本管理 功能管理 角色管理 用户管理
Winform 开发框架源码 devexpress 管理系统源码 C# .NET 多主题通用权限管理系统 Winform开发框架源码 devexpress 管理系统源码 C# .NET 多主题 net开发框架,通用权限管理系统,仓库管理系统源码。 开发模式:C/S ...
Winform通用开发框架 - 基于C#开发,包含196个文件,如CS、PNG、RESX、CSPROJ、VM、JSON、ICO、JPG、GITIGNORE和LICENSE等。该系统是一个简单实用的二次开发框架,内置了完整的权限架构,包括菜单、角色、用户、字典...
Winform开发框架是一种基于.NET Framework的用户界面应用程序开发平台,尤其适合初学者学习和构建桌面应用。这个框架简化了创建Windows窗体应用的过程,提供了丰富的控件和功能,让开发者可以快速搭建图形用户界面。...
Winform开发框架源码 devexpress管理系统源码 C# .NET多主题 通用权限管理系统
【标题】"winform 快速开发框架 仓库管理系统源码 C#源码"涉及到的是一个基于C#编程语言的Windows Forms(Winform)应用程序,用于构建仓库管理系统的快速开发框架。这个框架允许开发者快速搭建功能完备的仓库管理...
Winform开发框架源码 devexpress 管理系统源码 C# .NET 多主题 net开发框架,通用权限管理系统,仓库管理系统源码。 开发模式:C/S C/S采用的是dev14.1插件,界面美观大方,多种主题切换,是目前最流行的UI插件。 ...
在C# WinForm应用开发中,串口通信是与硬件设备交互的重要手段,特别是当涉及到像扫描枪这样的设备时。本文将深入探讨如何利用C#来接收串口扫描枪发送的数据,以及如何进行串口设备的相关设置。 串口通信基础: ...
5. **DevExpress (DevExpress)**:这是一款流行的.NET开发组件套件,提供了一系列高质量的控件和工具,用于增强WinForm、ASP.NET、WPF等平台的应用程序,包括数据网格、图表、报表等组件,可以提升应用的用户体验和...
界面好看,易开发,易扩展,性能好 界面好看:采用DX 控件开发 易开发:采用插件形式开发,只要另建项目,然后在数据库中加Form的名称就可以 易扩展:可以无限扩展,权限智能配置 性能好:客户端与服务端分离,...
这个框架集成了控件库、工具类库、扩展类库和多页面开发框架,旨在提升开发效率,优化用户体验,为桌面应用程序的构建提供强大的支撑。 首先,SunnyUI.NET的核心优势在于其丰富的控件库。控件库包含了各种常见和...
在C#中,处理条形码扫描主要涉及两个方面:一是识别扫描枪发送的数据;二是将这些数据正确地显示或存储。具体来说,当用户通过扫描枪扫描条形码时,扫描枪会模拟键盘输入,将条形码数据发送到当前焦点所在的控件上...
在IT行业中,Windows Forms(WinForms)是一种常用的开发桌面应用程序的框架,由微软提供,它允许程序员创建具有丰富用户界面的交互式应用。标题提到的"winform上位机框架",指的是使用WinForms技术构建的上位机系统...
这对于初学者来说是一个宝贵的资源,他们可以借此了解如何在C#中处理硬件交互,以及如何在WinForm应用中接收和解析来自扫描枪的数据。 【压缩包子文件的文件名称列表】"Scan_Pro"可能是项目的主程序文件或者项目...
C# WinForm 系统框架包括:版本控制、 动态权限管理、数据字典、可扩展的功能接口。方便学习使用Access数据库。 版本管理 1.创建版本,创建本版本下的角色,用户 2.修改版本,如果是加入权限,只加默认角色,如果...