这次做了个项目 其中有一个需求是控制条码机
要求一是能打印条码 二是能打印中文的经销商名称 还有打印一个位图徽标
测试环境是 Windows 2000/XP/2003 条码机是 Zebra 的 Z4M Plus
因为以前没有做过条码机 所以一开始想得比较简单 觉得通过打印驱动应该就搞定了
开始编码测试时发现 控制 Zebra 的打印驱动的确是可以按常规的打印机处理 但有两个缺陷
一是对打印内容的位置和效果控制不精确 二是打印速度不行
而且客户方有若干种不同型号的机器 要一一安装对应的驱动 这也的确是个麻烦事
所以就试着通过串口直接控制条码机

Zebra 系列内置了其自定义的 ZPL 通讯命令集
这其实也几乎是目前主流品牌机型都支持的标准规范
ZPL 的具体命令内容很多 提供了对条码机方方面面巨细不遗的控制
网上很多文章提到了指令的用法 不再赘述
更多详细的指令说明可以查阅 Zebra 的命令手册

一、条码的打印
条码机打印条码非常简单
发送的指令通常包括了对标签尺寸、条码位置、条码尺寸、条码类型的设置和具体的条码内容。

例:
 ^XA^LH0,0^FO130,44^FO20,25^BY4^FO100,100^BCN,104,Y,N,N^FD>;0123456789^FS^PQ1^XZ

注:
 该指令序列将打印 CODE 128 规范的 0-9 的一维数字条码

二、中文的打印
网上有文章提到 可以用一个名为 fnthex32.dll 的库 里面导出了一个 GetFontHex 函数
功能是将传入的中文字符串转换为十六进制编码并返回 这个库在网上不太好找 在我做完项目之后数天 有幸找到了一个
想来用起来应该是比较方便 不过项目做完 没有条码机测试了 需要的朋友可以试一下

三、图形的打印
上面提到的 GetFontHex 函数 不知道是不是也是把汉字转换成图形编码的 个人猜想应该是
所以其实条码机打印非标准字符和打印图形应该是同样的方法
对图形的处理 重点在于要将图形进行编码 再加上指令发送就行了
编码的方法比较简单 非常类似于 DOS 下中文平台中点阵汉字库的编码
即一个点用一个位(bit)表示 每个字节描述 8 个点 先行后列 从上到下
也就是说 条码机能打印的只能是二值图像
编码的时候需要注意的是 如果每行结束时字节未填满 应向上扩充至整字节(用 0 填位)

了解了编码方式 就比较容易处理了
网上有方案提出 直接从点阵汉字库里取点阵数据 这个方法个人觉得不太灵活
一是点阵字库较大 发布麻烦 二是文字大小受限
我的实现方法是 直接使用 API 向内存 Bitmap 画出汉字 这样汉字的字体和大小可以很方便地控制
然后扫描出点阵信息 经过编码 生成最终数据
比如确定好画成白底黑色 编码时白字当作 0 黑点当作 1
最终生成的数据 需要按图形方式下载到条码机缓存内
输出的时候指定使用该图形即可
另外需要注意的是 下载图形指令 ^DG 需要带上几个参数 分别指出图形缓存名称和图形的总字节数及每行字节数
这两个数字需要计算好 再拼接到命令串中

总字节数计算方法:
 ( 图形宽度 * dpm / 8 ) * ( 图形高度 / 8 )
 dpm 是分辨率 即每毫米点数(Dots Per mm)

每行字节数计算方法:
 ( 图形宽度 / 8 )

比如图形为 664 x 40  dpm 为 8(通常取这个值)
 则总字节数 = ( 664 * 8 / 8 ) * ( 40 / 8 ) = 3320 字节
 每行字节数 = ( 664 / 8 ) = 83 字节

例:
 ^XA^LH0,0^IDR:*.*^XZ~DGIMG0,3320,83,...(编码后的数据)...^PQ1^XZ
注:
 该指令将编码后的图形数据下载至条码机 并指定保存到别名为 IMG0 的缓存区域中
 之后 用 ^XG 指令即可引用该图形

//*******************
// 需要注意的问题:
//*******************
一、分辨率
如果分辨率不是标准的 8dpm 经测试 Zebra Z4M Plus 对数据的处理有时候会有 Error 状态发生
在 S 系列上则完全正常
但愿是我的方法或代码有问题

二、处理速度
串口发送数据速度较慢 经测试 3320 字节大小的数据从发送到打印完成平均需要 0.5 秒左右
好在这次项目标签尺寸并不大 速度尚在可接受范围内
若对速度有更高要求 可以考虑使用并口
USB 口也许更快 但未经测试 不知道方法是否通用

这里只记录了我涉及到的应用 记性太差 以后再有类似开发时有案可查 不至于从头再弄
也但愿能给刚开始接触且需要处理条码机应用的朋友一些拙劣的启发

欢迎同好研究探讨: scumyang@163.com

scum
2006-08-07

Zebra 条码打印机应用开发实践相关推荐

  1. 为什么您应该使用基于标准的开发实践

    为什么您应该使用基于标准的开发实践 Why you should use standards-based development practices (even if you don't have t ...

  2. [敏捷开发实践](2) 用于开发和维持复杂产品的敏捷开发框架Scrum

    [敏捷开发实践](2) 用于开发和维持复杂产品的敏捷开发框架Scrum 1,Scrum概述 上篇中提到敏捷开发有两种主流的方法,一个是XP,另一个是Scrum,本篇简要介绍Scrum方法.Scrum是 ...

  3. 华为昇腾师资培训沙龙·南京场 |华为昇腾 ACL 语言开发实践全程干货来了!看完就实操系列...

    自今年疫情以来,AI 技术加速进入了人们的视线,在抗疫过程中发挥了重要作用,产业发展明显提速,我国逐步走出了一条由需求导向引领商业模式创新.市场应用倒逼基础理论和关键技术创新的发展道路,AI 人才的争 ...

  4. 《JavaScript设计模式与开发实践》模式篇(12)—— 装饰者模式

    在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但是继承的方式并不灵活, 还会带来许多问题:一方面会导致超类和子类之间存在强耦合性,当超类改变时,子类也会随之 改变;另一方面,继承这种功能复 ...

  5. 转:MySQL 开发实践 8 问,你能 hold 住几个?

    来源:腾云阁 - 田京昆 链接:www.qcloud.com/community/article/233 最近研发的项目对DB依赖比较重,梳理了这段时间使用MySQL遇到的8个比较具有代表性的问题,答 ...

  6. Angular开发实践(一):环境准备及框架搭建

    引言 在工作中引入Angular框架将近一年了,在这一年中不断的踩坑和填坑,当然也学习和积累了很多的知识,包括MVVM框架.前后端分离.前端工程化.SPA优化等等.因此想通过Angular开发实践这系 ...

  7. 敏捷软件开发实践——估算与计划02

    目录 一.使用故事点估算大小 1.故事点是相对的 2.速度 3.小结 二.使用理想人天进行估算 1.理想时间和软件开发 2.以理想人天作为对大小的度量 3.给出一个而不是多个估算值 4.小结 三.估算 ...

  8. 敏捷软件开发实践——估算与计划(01)

    目录 一.计划的目的 1.为什么要进行估算和计划 2.优秀的计划是什么 3.敏捷计划是什么 4.小结 二.计划失败的原因 1.基于活动而不是基于特性进行计划 1.1.活动不会提前完成 1.2.延误沿着 ...

  9. JavaScript设计模式与开发实践——JavaScript的多态

    "多态"一词源于希腊文polymorphism,拆开来看是poly(复数)+ morph(形态)+ ism,从字面上我们可以理解为复数形态. 多态的实际含义是:同一操作作用于不同的 ...

最新文章

  1. ISME:长期进化实验揭示脱硫弧菌的硝酸盐耐受机制
  2. python怎么安装包-Python-如何离线安装软件包?
  3. audio 上一首 下一首 自定义样式_HTML5中 audio标签的样式修改
  4. wxWidgets:wxSingleInstanceChecker类用法
  5. php7.0 java 性能,php7代码性能常见优化技巧
  6. 20应用统计考研复试要点(part41)--概率论与数理统计
  7. 微软开源的Web测试和自动化神器 Playwright
  8. php 获取数据库中的信息,php获取数据库中数据的实现方法
  9. 一点一滴岗位测试答案_心理测试:凭直觉,选你最喜欢的一件睡衣,测你的野心是什么级别...
  10. 谷歌安卓之父离职内幕;抖音上线小程序;苹果被罚千万 | 极客头条
  11. FFplay使用指南
  12. “知识资源细颗粒度建设和标签标引”规则规范心得说明
  13. r语言和python混合_jupyter notebook同时使用python和R语言
  14. python绘图矩阵散点图_Python数据可视化:用Seaborn绘制高端玩家版散点图
  15. windows系统上安装与使用Android NDK r5
  16. 2017开发者技术和薪酬调查报告
  17. 掌门优课用户量增多,用户看上了它什么?
  18. 【SAP-SD】合同与发运协议的区别
  19. 微领地商业模式开发 软件开发
  20. chrome捕获大响应失败:Failed to load response data: request content was evicted from inspector cache

热门文章

  1. 【每日Linux】《Linux》
  2. torch.cat 和 torch.stack
  3. 虚拟机Ubuntu18.04连不上网问题解决
  4. 教程:在Vivado中指定VSCode作为文本编辑器
  5. pyecharts-动态可视化(2) 柱状图 时间轴/折线/堆叠/水印/瀑布图
  6. freenas 蜗牛星际_百花齐放的蜗牛星际DIY配置,我只是其中一朵
  7. 删除B站动态或视频的评论(仅限自己的)
  8. android activity自动重启,8) 十分钟学会android--Activity的生命周期之停止与重启
  9. mqtt协议产品化实现-华为鸿蒙实现mqtt客户端
  10. 剧本杀闯关小程序app软件