主题
Honeywell扫描器USB HID接口软件开发指引
适用范围
? ? ? ?
1200、1202、1250、1300、1400、1402、1450、1452、1900、1902 1910i、1911i、1280i、1980i、1981i BCC Scanner
3310G、3320G、7580G、7980G
解决方案
一、扫描器接口简介
Honeywell扫描器与上位机之间主要的接口方式有:USB Keyboard(默认)、USB HID、USB虚拟串口、
RS232(串口)、PS2(键盘口)、RS485。最常见的应用场景是扫描器(接专用的USB数据线)模拟USB键盘,将条码数据输入到上位机当前输入焦点所在位置。这种接口方式存在一些局限性,如没有输入焦点就无法获取和显示条码数据,条码数据无法隐藏(条码数据需要保密或对使用者无意义),无法正确显示中文,数据显示速度慢等。
因此,很多用户改用串口方式,开发程序后台监听串口获取条码数据,然后根据实际需要处理。但由此却带来
了新的问题,如上位机可能没有多余的串口,扫描器需要额外供电,串口通信参数需要手动设置(端口号、波特率),总之不是理想的方式。USB虚拟串口虽然解决了供电问题,但需要安装驱动(Windows系统)或定制操作系统时即要集成USB虚拟串口驱动(Linux系统),而且插入不同USB口时,系统分配的端口号也可能会随之改变,导致后台程序出错。
那么有没有一种更完美的解决方案呢?答案是肯定的,基于USB HID(USB Human Interface Device)接口
方式开发程序有以下优点:
1、 USB供电,无需外接电源;
2、 USB端口资源丰富,并可用USB HUB扩展;
3、 USB HID驱动是大多数操作系统的标配,无需另外安装驱动;
4、 无论扫描器插入哪个USB口,都可即时获取其VID(USB设备厂家ID)和PID(产品识别码),过滤非扫描
器USB设备,锁定USB端口号;
5、 无论是否有输入焦点,通过侦听USB端口即可获取条码数据,并按需解析;
6、 USB HID支持双向通信,上位机既可获取扫描器数据,也可发送指令完成相关设置; 7、 USB传输速度远超串口;
接下来将详细介绍Honeywell 扫描器的USB HID接口通信协议,并分享一个基于Android Studio开发的安卓
例程,以讲解USB HID通信软件运行流程。
注意:扫描器须扫描以下条码,方能将通信接口方式切换到USB HID
图1:USB HID接口模式设置条码
二、USB HID接口协议
Honeywell扫描器USB接口采用双通道中断传输方式,单次传输数据量小但能满足实时性要求。其中接口0
(interface 0)为发送接口(即上位机的接收接口),接口1(interface 1)为接收接口(即上位机的发送接口)。数据包容量为标准64字节。
第0位 ID=0x02 条码数据包(扫描器→上位机)格式定义如表1所示:
第1位 条码数据长度(不包含标识符、码制代码和保留位 第2位 条码标识符“]”=0x5D 第3位 条码标识符 (无实际意义) 第4位 条码标识符 (无实际意义) 第5~60位 条码数据,若条码数据长度<0x38会依次补0x00 第61位 条码码制代码 第62位 (保留位) 0x00 第63位 (保留位) 0x00 表1 由表1可知一个数据包最多包含56字节条码数据(第5~60位),当条码数据长度大于56字节时,将分若干个数据包连续传输,只需校验数据包第1位数据是否<0x38(十进制56)即可判断此数据包是否是最后一个。 举例,如上位机收到数据包如下:
0x02,0x0A,0x5D,0x43,0x31,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70 0x00,0x00,
按协议解析,此数据包包含10字节Code128码数据,数据内容=“1234567890”。 指令数据包(上位机→扫描器)格式定义如表2所示:
第0位 ID=0xFD 第1位 指令数据长度 第2~63位 指令(包括指令、指令前缀和后缀),不足62字节以0x00补齐
表2 一个数据包只能传输一条指令,多条指令须分多个数据包传输。指令长度一般5~10字节,因此一个数据包足够包含一条指令。指令前缀:SYN M CR(即0x16 0x4D 0x0D),指令后缀:! (即0x21)。
举例,如发送指令“TRGMODE3”将扫描器工作模式切换成Presentation(自感应),数据包内容如下:
0xFD,0x0B,0x16,0x4D,0x0D,0x54,0x52,0x47,0x4D,0x4F,0x44,0x33,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
特殊指令是在手动触发模式(Manual Trigger)下开启和关闭扫描指令是:SYN T CR(0x16 0x54 0x0D)和SYN U CR(0x16 0x55 0x0D),无须添加指令前缀和后缀。
三、Android实例源代码解析
目前市场上以Android平板或工控机为核心的自动售贩机、快递柜、人行道闸越来越普及,对扫描器的需求也
越来越大。如前所述,扫描器与安卓主机的接口方式首推USB HID。接下来将详细分析基于Android平台开发USB HOST通信软件的要点。需要注意的是,只有Android SDK 12(Android 3.1)以上版本才支持USB HOST相关软件开发。
本例开发环境是Android Studio。
1、 Android主机要与USB外设通信首先需要获取权限; 在AndroidManifest.xml文件添加如下语句以获取硬件管理授权
2、 USBManager是Android提供的管理USB通信的类,在MainActivity.java文件头部添加如下与USB通信相 关的引用: import android.hardware.usb.UsbManager; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbAccessory; import android.hardware.usb.UsbInterface; import android.hardware.usb.UsbEndpoint; import android.hardware.usb.UsbDeviceConnection; import android.hardware.usb.UsbRequest; import android.hardware.usb.UsbConstants; 3、 与USB通信相关的全局变量解释如下: