web实现usb扫码枪读取二维码数据功能


前言

常见的扫码枪有2种,一种串口扫码枪通过串口实现数据通信,技术实现上使用Web Serial API,可以查看本人另一篇博文Web Serial API串口通信,实现web和electron扫码枪读取数据。另一种是usb扫码枪,也是本文所要讲述的,usb扫码枪可以看成是输入设备,实际等同于键盘通过按键输入方式进行二维码信息读取,技术实现相比串口扫码枪简单多了,只需监听输入事件,但是它也有很多弊端和限制。


一、usb扫码枪获取数据步骤和条件

1.必须有个input输入框并且让其处于聚焦状态
2.监听输入框按键事件keydown或者keyup,遇到keyCode为13(回车)表示输入结束(一般usb扫码枪设置读取以回车结束,当然有的也可以设置其他,如果是其他结束符就监听相应的keyCode)
3.回车结束后从input输入框dom对象获取value值就是二维码内容

通过上面总结很容易实现,如下代码:

 <input id="input"/>    
  <script>
   const input= document.getElementById('input');
   input.addEventListener('keydown',e=>{
     if(e.keyCode==13){//回车结束
        let qrcodeData=input.value;
        console.log(`二维码数据为${qrcodeData}`)
     }
   })
   input.focus()//聚焦
  </script>

扫码测试:
在这里插入图片描述

二、优化

上面demo我们只是简单实现了从扫码枪获取数据功能的核心逻辑,但实际开发中我们的需求场景可能不一样,会遇到很多问题和坑点需要优化解决。

挖坑1:中文输入法会影响输入内容准确性,可以通过设置input type=“password”,设置输入框为密码类型解决

挖坑2:如果你的需求是读取二维码内容填充到一个特定输入框可以像上面例子一样实现,但是如果读取二维码不需要填充到输入框或者需要回显很多个地方就需要先获取数据再做数据处理,这个时候可以投机取巧画个输入框移动到屏幕外。

挖坑3:当你采用挖坑2技巧把输入框画在屏幕外,并用代码聚焦在输入框后,用户可能乱点页面导致读取数据前失焦,从而无法正常读取到二维码数据。解决方法可以定时不间断自动对焦并显示加载模态框引导用户不去乱点击,减少失败率。

二、代码实现

接下来将以vue3 elementui-plus来举例,实现一个扫码获取多个表单字段回显功能

操作逻辑设计:
1.页面设计一个二维码识别按钮
2.用户点击按钮触发扫码功能并锁定界面出现识别中加载转圈,防止用户乱点击失焦。
3.扫码识别,识别成功,识别加载转圈消失,数据自动回显到对应表单控件上
4.n秒内如果用户未扫码关闭加载转圈恢复初态

代码如下(示例):

scanner.js(扫码逻辑封装hook):

import { nextTick, onMounted } from "vue";
import { ElLoading, ElMessage } from "element-plus";

let isInputing = false; //是否在输入中

/**
 *
 * @param {*} inputRef:输入框Ref
 * @param {*} callBack :识别回调
 * @returns
 */
const useScancer = (inputRef, callBack) => {
  let interval = null; //定时器实例
  let loading = null; //ElLoading组件实例

  //输入框绑定keydown事件
  const addKeydownEvent = () => {
    if (inputRef?.value) {
      inputRef.value.addEventListener("keydown", (event) => {
        isInputing = true;
        let keyCode = event.keyCode || event.which;
        if (keyCode === 13) {
          let qrcodeData = inputRef?.value?.value ?? ""; //二维码数据
          if (interval) {
            clearInterval(interval);
            interval = null;
          }
          callBack(qrcodeData);
          inputRef.value.value = "";
          loading && loading.close();
          loading = null;
          ElMessage.success("识别成功");
          isInputing = false;
        }
      });
    }
  };

  //自动聚焦
  const autoFocus = () => {
    //立即执行
    inputFocus();
    if (!interval) {
    //每50ms自动对焦
      interval = setInterval(() => {
        inputFocus();
      }, 50);
    }
  };

  //input聚焦
  const inputFocus = () => {
    if (inputRef && inputRef.value) {
      inputRef.value.focus();
    }
  };

  //开始扫码
  const handleScanCode = () => {
    if (!loading) {
      console.log('loading')
      loading = ElLoading.service({
        lock: true,
        text: "请开始扫码识别",
        background: "rgba(255, 255, 255, 0.7)",
      });

      //20秒内未扫码关闭loading
      setTimeout(() => {
        if (!isInputing) {
          loading && loading.close();
          loading = null;
          if (interval) {
            clearInterval(interval);
            interval = null;
          }
        }
      }, 20 * 1000);

      nextTick(() => {
        autoFocus();
      });
    }
  };

  //初始化绑定事件
  onMounted(() => {
    addKeydownEvent();
  });

  return { autoFocus, handleScanCode };
};

export default useScancer;

页面调用
index.vue

<template>
  <input class="input" ref="inputRef" type="password"/>
  <el-button @click.native="handleScanCode" type="primary">扫码识别</el-button>
  <el-form :model="formData" style="margin-top: 20px">
    <el-form-item label="姓名">
      <el-input disabled v-model="formData.name" />
    </el-form-item>
    <el-form-item label="年龄">
      <el-input disabled v-model="formData.age" />
    </el-form-item>
    <el-form-item label="生日">
      <el-input disabled v-model="formData.birthday" />
    </el-form-item>
  </el-form>
</template>

<script setup>
import { ref, reactive } from "vue";
import useScancer from "./scanner.js"; //扫码识别hook

//表单数据
const formData = reactive({
  name: "",
  age: "",
  birthday: "",
});


//输入框
const inputRef = ref();

//扫码回调
const { handleScanCode } = useScancer(inputRef, (data) => {
  console.log(data, "二维码数据为:data");
  if (data) {
    try {
    //二维码字符串转为json对象
      data= JSON.parse(data);
      for(let key in formData){
        formData[key]=data[key]??'';
      }
    } catch (e) {
      console.log(e,'e')
    }
  }
});
</script>
<style scoped>
.input {
  position: fixed;
  left: 0;
  transform: translateX(-200%);
}
</style>

测试运行:

初始态:
在这里插入图片描述
开始识别:
在这里插入图片描述

识别完成:
在这里插入图片描述


总结

通过上面介绍可以看出usb扫码枪虽然使用简单,但是限制多,只能满足一些特定场景,对用户一些不确定操作可能会影响读取成功率,这个时候也可以从产品设计上引导用户主动触发聚焦减少用户乱点击频率,提高成功率。

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: LabVIEW是一种强大的图形化编程工具,它可以与各种硬件设备和仪器进行集成。要使用LabVIEW读取扫码二维码,可以按照以下步骤进行操作: 1. 安装VISA驱动程序:扫码通常通过串口与计算机连接,需要在计算机上安装适当的驱动程序。可以从生产商的官方网站上下载并安装VISA(Virtual Instrument Software Architecture)驱动程序。 2. 连接扫码:将扫码插入计算机上的串口(或通过USB转串口适配器连接),确保连接正常。 3. 打开LabVIEW:打开LabVIEW,创建一个新的VI(Virtual Instrument)。 4. 创建串口读取节点:在Block Diagram中,搜索“VISA”并选择“VISA Resource Name”函数。将其拖动到Block Diagram上。 5. 配置串口:右键单击“VISA Resource Name”节点,选择“Create Constant”。在弹出的对话框中,选择与扫码连接的串口。 6. 设置读取参数:使用“VISA Configure Serial Port”节点来设置串口的波特率、数据位、停止位和校验位等参数。通过右键单击节点并选择“Create Constant”来设置需要的参数。 7. 读取二维码数据:使用“VISA Read”节点来读取扫码接收到的数据。将其连接到“VISA Configure Serial Port”节点的输出。 8. 显示结果:使用适当的控件(如String、Indicator等)来显示读取到的二维码数据。 9. 运行VI:点击LabVIEW界面上的运行按钮,即可开始读取扫码二维码。如果一切设置正确,LabVIEW会从扫码接收到数据并显示。 需要注意的是,具体使用LabVIEW读取扫码二维码可能会因扫码型号、串口设置等因素而有所不同。因此,在操作过程中,根据具体的设备和需求进行调整和优化。 ### 回答2: 在labview中使用扫码读取二维码需要按照以下步骤进行操作: 1. 连接扫码:首先确保扫码已经正确连接到电脑。可以通过USB接口或者其他接口将扫码连接到电脑。 2. 安装必要的驱动程序:在使用扫码之前,需要确保已经安装了扫码的驱动程序。如果没有自动安装,可以从官方网站上下载并进行手动安装。 3. 打开LabView:启动LabView软件。 4. 创建新的VI文件:在LabView中创建一个新的VI文件。 5. 添加控件:在新的VI文件中,从"Controls"面板中添加一个按钮和一个文本框控件。 6. 控件连线:将扫码的输出端口连接到文本框控件的输入端口。 7. 编写代码:在按钮的点击事件中,添加代码来执行读取二维码的操作。可以使用LabView内置的VI函数来实现。 8. 运行程序:运行程序,点击按钮,扫描二维码。 9. 获取二维码数据:扫描二维码后,数据将会显示在文本框控件中。 10. 处理二维码数据:根据需要,可以对获取到的二维码数据进行进一步的处理,例如解码、解析等操作。 总结起来,在LabView中使用扫码读取二维码的关键步骤是连接扫码、安装驱动程序、创建VI文件、添加控件、编写代码、运行程序、获取和处理二维码数据。通过以上步骤,可以实现在LabView中使用扫码读取二维码功能。 ### 回答3: LabVIEW是一种基于图形化编程环境的开发工具,常用于科学研究和工程应用。要使用扫码读取二维码,可以参考以下步骤: 1. 连接扫码:将扫码通过USB接口或其他适配器连接到计算机。 2. 安装扫码驱动程序:根据扫码型号,从官方网站或光盘上下载和安装相应的驱动程序。确保驱动程序与LabVIEW兼容。 3. 打开LabVIEW:启动LabVIEW开发环境。 4. 创建新的VI:在LabVIEW开发环境中,创建一个新的VI(Virtual Instrument)。 5. 添加输入控制:在VI中,选择"输入控制"栏目,并从控件面板中拖拽一个文本框或字符串输入框到前面板上。 6. 配置输入对象:选择文本框或字符串输入框,在属性面板上将其命名为"二维码扫描结果"或类似的名称。 7. 添加扫码读取功能:在LabVIEW编辑器中,选择"函数"栏目,并搜索或浏览相关的扫码API函数。 8. 将函数拖拽到编辑器中:在函数库中找到适合的函数,例如"读取二维码"或"扫描"函数,并将其拖拽到编辑器图表中。 9. 连接输入和输出:将扫码输入连接到前面板上的文本框或字符串输入框,并将输出连接到后面的数据处理模块。 10. 配置参数:根据扫码的要求,设置相应的参数,如扫描速度、解码格式等。 11. 运行VI:保存并运行VI,然后尝试使用扫码扫描二维码。扫描结果将自动显示在前面板上的文本框或字符串输入框中。 12. 数据处理:可以通过其他LabVIEW功能模块对扫描结果进行处理、解码或记录。 13. 调试和优化:如果存在问题或需要优化,可以使用调试工具和技术进行诊断和修正。 总的来说,通过以上步骤,您就可以在LabVIEW中使用扫码读取二维码。请注意,具体的实现可能会因扫码型号、LabVIEW版本等因素而有所差异,请根据实际情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值