条码扫描枪的数据接收处理

在前面小节介绍了一些利用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();
        }
复制代码

 

然后我们为了方便使用,还可以定义一个统一的处理读卡器和扫描枪的接收数据的小窗口。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Spring Boot应用程序中的条形码扫描,您可以按照以下步骤进行操作: 1. 首先,确保您的条形码扫描可以通过USB或蓝牙与计算机或设备连接。如果使用USB连接,请插入扫描的USB接口到计算机的USB端口。 2. 在Spring Boot应用程序中,您需要使用适当的库来处理条形码扫描。一个常用的库是Zxing(也称为"Zebra Crossing"),它是一个用于解码和生成条形码的Java库。 您可以在Maven或Gradle配置文件中添加以下依赖项来引入Zxing库: Maven: ```xml <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.4.1</version> </dependency> ``` Gradle: ```groovy implementation 'com.google.zxing:core:3.4.1' ``` 3. 创建一个接收条形码输入的处理器。您可以在Spring Boot中创建一个控制器或者在任何需要处理扫描结果的地方添加相关代码。 例如,您可以创建一个Spring MVC控制器,并使用`@RequestMapping`注解来处理扫描输入: ```java import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import com.google.zxing.BinaryBitmap; import com.google.zxing.LuminanceSource; import com.google.zxing.MultiFormatReader; import com.google.zxing.ReaderException; import com.google.zxing.Result; import com.google.zxing.common.HybridBinarizer; @RestController public class BarcodeController { @PostMapping("/scan") public String scanBarcode(@RequestBody String barcodeData) { try { byte[] imageBytes = barcodeData.getBytes(); // 根据实际情况获取图片数据 LuminanceSource source = new BufferedImageLuminanceSource(ImageIO.read(new ByteArrayInputStream(imageBytes))); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); MultiFormatReader reader = new MultiFormatReader(); Result result = reader.decode(bitmap); return result.getText(); // 返回解码后的条形码数据 } catch (IOException | NotFoundException | ReaderException e) { // 处理异常情况 } } } ``` 请注意,上述代码中的`barcodeData`参数是一个Base64编码的图像数据,您可以根据实际情况修改代码以适应您的需求。 4. 启动Spring Boot应用程序,并确保应用程序能够接收来自条形码扫描的输入。您可以使用Postman或其他工具发送POST请求到`/scan`端点,并将条形码图像数据作为请求主体发送。 当条形码扫描将图像数据发送到应用程序时,它将被解码,并从`scanBarcode`方法中返回解码后的条形码数据。 这样,您就可以在Spring Boot应用程序中使用条形码扫描了。请注意,上述代码仅提供了一个基本的示例,您可能需要根据实际需求进行适当的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值