此类用于honeywell 1500/1300条码枪的串口读写,可实现控制条码枪扫描,并从条码枪中取得扫描的数据。使用条码枪的串口模式有以下几个好处:
(1)避免因文本框失去焦点而导致录入失败。
(2)可与自动化设备配合。
/*---------------------------------------------------------------- // 文件名:BarcodeScanner.cs // 文件功能描述:条码扫描枪类。用于控制条码枪进行扫描。 // // 创建标识:leo 2012.10.16 // // 修改标识: // 修改描述: // // 修改标识: // 修改描述: //----------------------------------------------------------------*/ using System; using System.Collections.Generic; using System.Text; using System.IO.Ports; using System.Windows.Forms; using System.Threading; using System.IO; namespace QMS.Infrastructure { public class BarcodeScanner { //****************************************************** 字 段 ************************************************************************** /// <summary> /// 串口对象。 /// </summary> SerialPort comm = new SerialPort(); /// <summary> /// 窗体对象。 /// </summary> Form _frm; //****************************************************** 属 性 *************************************************************************** /// <summary> /// 返回条码值。应当在条码扫描完毕事件发生时,再去取条码值。 /// </summary> public string Barcode { set; get; } //***************************************************** 事 件 *************************************************************************** /// <summary> /// 扫描完毕事件。 /// </summary> public event EventHandler ScanFinished; //****************************************************** 方 法 ******************************************************************* /// <summary> /// 打开设备。 /// </summary> /// <param name="portName">串口号</param> /// <param name="frm">窗体</param> public void Open( string portName, Form frm ) { try { // 初始化窗体对象 _frm = frm; _frm.FormClosing += new FormClosingEventHandler( _frm_FormClosing ); //初始化SerialPort对象 comm.PortName = portName; comm.BaudRate = 19200; //honeywell的是这个值 comm.Open(); comm.DataReceived += comm_DataReceived; //添加事件注册 } catch( Exception e ) { MessageBox.Show( e.Message ); } } /// <summary> /// 条码枪进行扫描。 /// </summary> public void Scan() { // 扫描超时监视 // tmr.Enabled = true; // 触发扫描 byte[] b = { 22, 84, 13 }; //十六进制数为16 54 0d,括号中为这三个数的十进制形式 string s = System.Text.Encoding.ASCII.GetString( b ); if( comm.IsOpen == true ) { comm.Write( s ); } else { MessageBox.Show( "无法触发扫描枪扫描!请检查连线或重启程序" ); } } /// <summary> /// 关闭设备。 /// </summary> public void Close() { if( comm.IsOpen == true ) { comm.Close(); comm.Dispose(); } } //****************************************************** 内部函数 ******************************************************************* /// <summary> /// 串口数据接收函数。当接收到数据时,则引发ScanFinished事件。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void comm_DataReceived( object sender, SerialDataReceivedEventArgs e ) { // 扫描超时监视。数据返回,则关闭监视 // tmr.Enabled = false; // 读取串口返回值 this.Barcode = comm.ReadLine().Trim(); // 引发事件 if( this.ScanFinished != null ) { _frm.Invoke( new MethodInvoker( delegate { this.ScanFinished( this, new EventArgs() ); } ) ); } } /// <summary> /// 在窗体关闭的时候关闭串口连接。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void _frm_FormClosing( object sender, FormClosingEventArgs e ) { this.Close(); } } }