近期疫情形势还是比较严峻的,在此向奋战在一线的医务工作者致敬!武汉加油,全国加油!
最近笔者接了一个项目需要生成条形码并给出配套的解码程序,研究了几个小时以后有了一定成果,记录一下@[email protected]
Code128条码编码规则
CODE128条码应该来说是应用比较广泛的一类条码编码,由于其可以表示0~127的数据故称为Code128。事实上Code128分为3类:128A、128B、128C,其特性如下
类型 | 特性 |
---|---|
Code128A | 大写字符、数字、标点、控制符 |
Code128B | 大小写字符、数字、标点 |
Code128C | 纯数字 |
笔者在项目中选择了Code128A类型的编码。事实上无论是128A还是128B、128C,其编码规则都是一致的,有如下几部分
前空白 | 起始位 | 数据 | 校验位 | 结束位 | 后空白 |
---|
以下给以详细介绍
前后空白
前后空白的规定比较松,只需最小宽度为10倍单位宽度即可,(注:单位宽度就是宽度为1的条纹宽度),当然空白越大越容易识别,对于某些识别程序而言判别机制做得较差,即使留出10倍宽度也经常无法识别,因此在工业现场或其他应用场合须做一定量的测试。
起始位
起始位是条码能见部分的开始,也是区分3种编码的主要方式。
码制 | 起始位[黑 白 黑 白 黑 白] |
---|---|
Code128A | 2,1,1,4,1,2 |
Code128B | 2,1,1,2,1,4 |
Code128C | 2,1,1,2,3,2 |
例如
该条码起始位为2黑、1白、1黑、4白、1黑、2白,也就是说这是一个Code128A条码。
数据
数据区较为有意思,因为其与ASCII字符集中的可见字符是一一映射的,因此似曾相识。以下给出部分
数据 [黑 白 黑 白 黑 白] | Code128A | Code128B | Code128C |
---|---|---|---|
2,1,2,2,2,2 | 空格 | 00 | |
2,2,2,1,2,2 | ! | 01 | |
2,2,2,2,2,1 | " | 02 | |
1,2,1,2,2,3 | # | 03 | |
1,2,1,3,2,2 | $ | 04 | |
1,3,1,2,2,2 | % | 05 |
我们需要注意的是,Code128A的字符集以“空格”打头,这是ASCII字符集的第一个可见字符,但是在Code128B中,该字符不是有效字符,在Code128C中代表了两位数00。
因此从ASCII字符到Code128字符需要减去32
校验位
校验位采用校验和模103的方式,如下表示
其中为该位数据的值,由前面介绍可知,N位其ASCII码值-32。
特别地数据头值如下
START A | 103 |
---|---|
START B | 104 |
START C | 105 |
例如计算Code128A型,数据位“0123”的校验码
因此校验位为77
结束位
结束位是固定的
结束位 | 2, 3, 3, 1, 1, 1,2 |
---|
这是一串7位数,这能够让最后一条为黑色
条码高度
为了保证识别效果,条码高度有一定要求,高度一般在条码总长的15%或者至少6.35mm,这个要求也比较宽松,当然随着识别距离的增加适当增加高度是有必要的。
实验结果
根据上述规则编写了一个测试代码,代码运行在STM32H750平台,使用FATFS将指定条码生成并保存为一个PDF文件,文件可以在PC上的打开查阅,结果如下。
生成的PDF使用Chrome顺利打开,条码使用手机QQ扫码识别成功。