honeywell 1500/1300条码枪的串口读写类

此类用于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();
        }

    }
}
时间: 2024-12-28 02:54:06

honeywell 1500/1300条码枪的串口读写类的相关文章

honeywell 1500 1300 条码枪虚拟

在工作中,经常会用到串口设备,如串口条码枪.串口测试仪.串口称重仪等,在调试的时候,这些设备都需要从车间借调,每次借调都很麻烦. 能否简单一点呢?我琢磨了一下,可以通过虚拟“串口设备”来实现,不需要连接真实的设备也能进行调试.下面以honeywell 1500 1300 条码枪的虚拟化为例来说明. 这里需要用到一个软件:VSPD.这个软件可以在windows上虚拟出成对的串口.如下图所示: 在这里,我们建立一个串口对COM101与COM102,并假定条码枪那一端的串口号是COM101,电脑一端的

[WinAPI] 串口读写

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <windows.h> 4 5 HANDLE hComm; 6 OVERLAPPED m_ov; 7 COMSTAT comstat; 8 DWORD m_dwCommEvents; 9 10 //如果在调用CreateFile创建句柄时指 11 //定了FILE_FLAG_OVERLAPPED标志,那么调用ReadFile和WriteFile对该句柄进 12 /

设计一个串口装饰类(1)

团队正在开发一个仪器控制软件的框架,希望该框架能兼容/容忍一些硬件的变换,以及灵活定制建立在该硬件平台之上的工作流.目标仪器使用了很多的串口通信(Serial Port),所以大家觉得应该设计/封装一个统一的串口类来管理串口通信的一致性.就我个人的意见来说,我不是建议在System.IO.Port.SerialPort上再做封装的.串口通信逻辑很简单,基本就是I/O.该类已经提供了同步阻塞模型.基于事件的异步模型,各种I/O快捷方法,所以不认为封装该类可以获得什么更多好处.但是面对框架的 一些其

c# dbf文件读写类

public class DbfReader     { private string _path; private OleDbConnection _connection; public DbfReader(string dbfPath)         { _path = dbfPath; CheckFile(); } public OleDbDataReader GetReader() { try { _connection.Open(); OleDbCommand command = n

利用Spring.Net技术打造可切换的分布式缓存读写类

利用Spring.Net技术打造可切换的Memcached分布式缓存读写类 Memcached是一个高性能的分布式内存对象缓存系统,因为工作在内存,读写速率比数据库高的不是一般的多,和Radis一样具有高效的读写和分布式的优势,上一篇博文<Memcached在Windows下的配置和使用>已经对介绍过它在windows上的配置和使用. 新建ICacheWriter类--CacheWriter的接口,以达到通过配置文件可以切换缓存读写方式,例如,缓存读写也可以通过httpruntime.cach

C#异步数据接收串口操作类

C#异步数据接收串口操作类 使用C#调用传统32位API实现串口操作,整个结构特别的简单.接收数据只需要定义数据接收事件即可. 上传源代码我不会,需要源代码的请与我([email protected])联系.你也可以教我怎么上传源代码. using System; using System.Runtime.InteropServices; /// <summary> /// (C)2003-2005 C2217 Studio  保留所有权利 /// /// 文件名称:     IbmsSeri

Cookie 读写类

/** Cookie 读写类 读:Cookie.get(name) 写:Cookie.set(name, value, domain, ttl/*是否持久* /) 删除: Cookie.clear(name) 绑定Cookie变化事件 Cookie.change(function(){}) */ var Cookie = function () { var prevCookie = null; var _user = {}; jQuery(function(){ window.setInterv

influxDB 0.9 C# 读写类

目前influxdb官网推荐的C#读写类是针对0.8版本的,截至本文写作之前,尚未发现有针对0.9的读写类. 我使用influxdb的是用于保存服务器的运行数据,程序需要以windows service的形式运行. influxdb提供了基于http的接口.一开始我使用的是httpClient来作为http客户端,但是发现程序以windows serive的形式运行的时候,居然无法发起http请求!而当windows service附在其它进程上,或者以window form形式运行时,却是正常

VC 串口通信类

为了节省时间,我就贴出来吧 头文件 SerialPort.h 1 /*************************************************************************************************** 2 * SerialPort.h 3 * 4 * 功 能:串口通讯类 5 * 类 名:CSerialPort 6 * 7 * Ver 变更日期 负责人 变更内容 8 * ───────────────────────────────