实战开发:获取条码枪扫描枪读码器把枪的扫码结果
扫描枪分类
市面上的条形码扫描枪按照接口类型,一般可以分为三种:
- PS/2接口。这个接口一般老式的条码枪才会有,现在的条码枪基本上都没有这个接口了,因为现在的电脑上,基本上也不会有这个老式接口了。这个接口大家更熟悉的是以前的鼠标键盘会采用这种接口。
- USB接口。这是目前扫描枪用的最多的接口。
- RS232串口。一般来说,很少扫描枪会使用这种接口,除非用于开发。
就目前市面上而言,PS/2接口和串口的RS232已经很难找到了,因为现在的电脑尤其是笔记本电脑,大部分都没有PS/2接口了,笔记本电脑越做越薄,所以笔记本电脑一般都没有RS232接口。
开发
从开发的角度,可以将扫描枪分为两类:PS/2和USB接口一类,RS232串口一类。
RS232串口扫描枪开发
串口扫描枪在某些场景下是必须的,串口扫描枪有以下优缺点:
优点
- 多个扫描枪可以通过串口号进行区分。也就是说,如果某些场景需要使用多个扫描枪,而且需要区分是哪个把枪扫描到的条码,那么就要采用串口接口方式的条形码扫描枪。
- 后台接受数据。相对于PS/2和USB接口,串口通信可以在后台默默接受数据,所以程序可以在后台运行,条件没有PS/2和USB接口的扫描枪这么苛刻。
缺点
- 接线麻烦。由于串口本身不供电,所以还是需要一根电源线来作为扫描枪的供电,一般来说,通过一根USB线作为扫描枪的供电线。所以采用串口方式的扫描枪,有两根线,一根是usb的电源线,一根是串口的数据线。
- 开发相对复杂,因为涉及到串口通信开发。不过如果您熟悉串口通信开发,这个问题就不存在了。
RS232串口扫描枪的开发,这里就不再赘述了,其实就是串口通信开发。我在一个按订单分拣的项目中,使用了两把串口扫描枪,当时选择使用串口扫描枪,主要的目的就是区分条码来自于哪个扫描枪。说实话找了很久才找到有串口的扫描枪(差点我就放弃了这个方案,幸亏找到了,不然采用别的方案,项目复杂度要增加N倍)。
PS/2接口和USB接口扫描枪开发
PS/2接口的扫描枪也很少见了,不过由于它的开发和USB接口的扫描枪一样,所以也归为同一类,都当做是USB接口的吧。另外,USB接口的,目前也有两种,一种是有线的,一种是无线的,但是对于开发来说,没有区别。
扫描枪大部分的使用场景是收银类的软件,最常见的就是便利店的收银软件,通过扫描商品上的条形码,将商品输入到收银软件中,然后进行价格结算。阻碍广大程序员开发收银软件的三个拦路虎:扫描枪、客显、打印机。
很多程序员刚接触到usb扫描枪的时候,感觉无从下手,其实很简单,因为,usb扫描枪和usb键盘鼠标一样,都是一种输入设备。也就是说,不需要进行任何开发,就能获取到扫描枪的输入,您需要的,就是一个文本框,用来接收扫描枪扫描到的条码。
不过跟键盘输入还是有些区别的,毕竟扫描枪是一次性输入一串文本(条形码)。我们可以通过监听文本框的TextChanged事件来获取条码,但是我们怎么知道一串条码输入结束了呢?一般的扫描枪都可以通过扫描特定的条形码来对扫描枪进行功能设置:比如关闭和打开扫码音,设置回车换行作为条码输入的结束符。比如本文所使用的扫描枪,默认使用回车键作为条码输入结束的标志,代码如下:
private void tbInputBarcode_TextChanged(object sender, EventArgs e)
{
string text = tbInputBarcode.Text;
int pos = text.IndexOf('\r');
if (-1 != pos)
{
// 接收到条码
string barcode = text.Substring(0, pos);
if (!string.IsNullOrEmpty(barcode))
{
// 将条码全部选中,下一次扫码的时候,旧条码就会被新条码覆盖
tbInputBarcode.SelectAll();
// 处理条码
ProcessBarcode(barcode);
}
}
}
这样,我们就可以获取到usb接口扫描枪扫描到的条码了,但前提是获取条码的那个文本框,必须获得输入焦点。
有时候条码上有污渍,或者破损,导致扫描枪扫不出来,这时候就要手工输入了,所以这个文本框还得兼容人工输入条码,继续加强。人工输入条码这个功能,输入条码后,按回车键结束输入,所以我们通过监听文本框的KeyPress消息进行处理:
private void tbInputBarcode_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\r')
{
// 如果是回车键
e.Handled = true;
string barcode = tbInputBarcode.Text;
if (!string.IsNullOrEmpty(barcode))
{
// 将条码全部选中,下一次扫码的时候,旧条码就会被新条码覆盖
tbInputBarcode.SelectAll();
// 处理条码
ProcessBarcode(barcode);
}
}
}
至此,我们完美的解决了如何获取usb扫描枪扫描到的条码。
usb接口的扫描枪,最大的缺点就是:接收条码的程序,必须是前台程序。必须有一个文本框来接收条码,而且这个文本框必须获得输入焦点。
上一篇: 快学Scala(第二版)-07-包和引入