PDF417二维条码在嵌入式设备中的应用
根据SE923HS与微控制器的接口图,软件总体上可分为扫描头工作函数和中断函数,流程如图5和图6所示。
用SE923HS译码程序相对简单。首先,设置好SE923HS与W77E58通信的波特率。然后,打开串口中断,在需要扫描条码时将P1.2置为低电平,进入3s的延时,扫描电机开始工作。在延时时间内,扫描头一直处于工作状态,扫描头译码后的数据输入至单片机产生串口中断,在中断函数中存储译码后的信息。一般来说,SE923HS扫描头有效工作1s后可以将纸质的扫描译码完毕。P1.2置为高电平时,扫描电机停止工作。
对解码后的数据进行后期处理,将这些数据和其它需要重新加密的数据重新二维条码编码和纠错,得到加密后的数据。这些数据可以通过RS232、USB或者蓝牙发送给上位机作相应的处理。
3.2 二维条码编码和纠错
在实际应用中,考虑到在应用中投递物品信息组成和单片机处理速度,投递物品上的信息多用汉字表示,且文本字符和数字的数量较少,所以可以只用字节压缩模式(BC)对其进行编码。这样可大大减小编译码的复杂性,并且对数据的压缩率影响也不大。再有,由PDF417条码标准规定,条码符号的行数不超过90行,数据区列数不超过30列,所以最多可以编2700个码字。纠错码最多512个,那么数据码最多可编2188个。但是由于PDF417条码标准规定数据区第一个码字表示数据区码字的个数,这就限制了数据区码字最多不超过928个,也就是说译码最多只能译 928个码字,没有用到编码数量的极限。当要编码的数据较多时,则可以作如下改动:采用2个码字表示数据区码字的个数,这样就可以做到编码个数的极限2188个码字。因此在具体应用时,根据情况灵活地运用PDF417条码标准是很重要的。javascript:window.open(this.src);" style="cursor:pointer;"/>
为统一起见,在编码过程中只采用模式结构中的字节压缩模式(BC)。现简要介绍如下:
字节压缩模式通过基256至基900的转换,将字节序列转换为码字序列。当所要表示的字节总数不是6的倍数时,用模式锁定901;当所要表示的字节总数是6的倍数时,用模式锁定924。在应用模式锁定924的情况下,6个字节可通过基256至基900的转换用5个码字表示,从左到右进行转换。在应用模式锁定901的情况下,每前6个字节的转换方法与上述方法相同,对被6整除所剩余的字节应每个字节对应一个码字,逐字节用码字表示。具体编码流程如图7所示。
四一七条码采用Reed-Solomon错误控制算法(简称RS码)对数据码字进行纠错编码和译码。RS码是一类可以纠正多个随机错误的多进制循环码。对于一组给定的数据码字,根据不同的码字个数采用相应的纠错等级,错误纠正码字根据Reed-Solomon错误控制码算法计算。
对于一个给定的错误纠正等级,其错误纠正容量由下式确定:
javascript:window.open(this.src);" style="cursor:pointer;"/>
式中: e-拒读错误数目; t-替代错误数目;
s-错误纠正等级; d-错误纠正码字数目。
错误纠正码字的总数为2s+1。其中,两个用于错误检测。其余的错误纠正码字用于错误纠正。用一个错误纠正码字恢复一个拒读错误,用两个错误纠正码字纠正一个替代错误。
当被纠正的替代错误数目小于4时(s=0除外),错误纠正容量由下式确定:
e+2t ≤ d-3
对于一组给定的数据码字,错误纠正码字根据RS错误控制码算法计算。
(1)建立符号数据多项式
javascript:window.open(this.src);" style="cursor:pointer;"/>
(2)建立纠正码字的生成多项式
javascript:window.open(this.src);" style="cursor:pointer;"/>
(3)产生错误纠正码字
对一组给定的数据码字和一选定的错误纠正等级,错误纠正码字为符号数据多项式d(x)乘以xk,然后除以生成多项式g(x),所得为余式的各系数的补数。
注:解码、编码和纠错程序见本刊网站www.dpj.com.cn。
图7
4 结 论
本文提供了一种简单可行的PDF417二维条码译码和编码的方案。利用PDF417二维条码具有信息容量大、编码范围广、容错能力强、译码可靠性高、保密防伪性好、成本低、条码形状和尺寸可变等优点,使SE923HS扫描头和W77E58微控制器结合,成本低、可行性强。在小数据量(小于1000字节)和较低纠错级别(5级以下)时,编码和纠错时间在10s之内,处理速度优势明显。