小票打印机和windows的COM开发
默认分类 2008-08-07 10:40:41 阅读44 评论0大中小 订阅
首先, 谈一下打印机硬件
最为经典的小票打印机, epsonTM系列:
爱普生TM-T58参数
基本参数 | |
行式热敏打印 | |
360dpi | |
打印性能 | |
100毫米/秒 | |
12×24(ANK)/ 24*24(Chinese) | |
RS-232,Bi-directional parallel | |
纸张耗品 | |
纸张尺寸 | Roll paper:57.5±0.5mm |
其他特性 | |
24VDC±7% | |
产品外形 | 116*204*137mm |
产品重量 | 1.3kg |
其他特点 | 纸张厚度:0.06-0.07mm |
爱普生TM-U120参数
基本参数 | |
针式打印 | |
360dpi | |
打印性能 | |
9针针式点阵打印 | |
Approx.4.3 lps (42 columns,16.8 cpi,1/6 line feed) Approx. 5.7 lps(30 columns, 16.8 cpi, 1/6 line feed) Approx. 8.3 lps (16 columns, 16.8 cpi, 1/6 line feed) Approx. 2.2 lps (23 columns, 9.3 cpi, 1/6 line feed) | |
Font(standard)Font A:9*9,Font B:7 x 9,Multilingual 16*16 | |
IEEE-1284并口 | |
纸张耗品 | |
纸张尺寸 | 76 + 0.5mm |
色带:ERC-43(P) Purple life: 5,000,000 characters Life based on continuous printing at 25℃(77oF) | |
其他特性 | |
环境标准 | 操作温度:0 - 45℃(32 - 113℃);存储温度:0 - 50℃(14 - 122℃),without paper and nbbon cassette;操作湿度:10 - 90%, must be no condensation;存储湿度:10 - 90%,must be no condensation,without paper and nbbon cassette |
+24 VDC | |
产品外形 | 160*248*132mm |
产品重量 | 1.5kg |
其他特点 | 接收缓冲:42 bytes/2KB;接口类型:Serial I/F (RS-232) or parallel 1F (IEEE 1284) |
当然在硬件的com连接上, 系统就算连接上了一个外设了, 然后安装对应的驱动程序.
epson的打印机相对来说贵一点, 其实小票打印机便宜的300多就可以了, 而epson价格则在1000以上,不过也许从驱动的支持程度,开发的简易性方面来考虑的话, 相对来说开发成本可以得到控制.
硬件说完了, 接下来看看怎么利用串口通信的技术来开发小票打印程序吧!!
首先, 设置通过com连接打印机的参数, 这一步就如要通过odbc连接数据库一样,是必须的.
参数包括port,speed,parity,data,flowctrl,stopbits, isgraphic等
另外在程序设计中,一般每个单独的设备的实现都是通过一个线程加一个自动状态机(automation states machine)来实现的, 状态的设计就很重要, 对于打印机来说, 其状态为:
typedef enum
{
PRINTER_INIT,
PRINTER_IDLE,
PRINTER_PRINTING,
PRINTER_OUTOFSERVICE,
PRINTER_MAX_AUTOMATON_STATES
} PrinterStates;
另外线程要实现的主要功能比较简单:
- CMD_CONFIG
- CMD_PRINT
- CMD_CUT
- CMD_GET_STATUS
- CMD_LOAD_FONT
而对于打印机来言, 需要的是程序通过com发送过来的command buffer指令, 而这些指令在epson的SPEC手册里应该有说明, 如对于epson,如下:
#define PRINTER_LF 0x0A /* print and line feed */
#define PRINTER_CR 0x0D /* carriage return */
#define PRINTER_INIT_CODE 0x40 /* CHAR_ESC + initialisation of the printer */
#define PRINTER_STATUS_DMD 0x76 /* CHAR_ESC + request the printer status */
#define PRINTER_CHAR_ESC 0x1B
#define PRINTER_PRINT_FEED 0x61
#define PRINTER_CHINESE_MODE 0x7E
#define PRINTER_FONT_9x9 0x1E
#define PRINTER_CUT 'P'
- print 指令: 对于epson U120, 每次buffer最大程度是984,所以如果要打印的内容比较多, 则要分批打印.
buffer[0]= 0x1d;
buffer[1] = 0x56;
buffer[2] = 0x42;
com通信的代码其实就像文件读写一样,可以通过封装供所有的com编程使用.
至于打印出来的格式的设置,则主要在发到print的buffer中来设置. 最好的办法是把上面的指令看成一个API, 再设计一个receipt专门用来组织这个buffer的程序来负责格式.
- 设置一个大的结构体来定义各种小票的格式, 其中id识别各种要打印的receipt, 接下来可以定义fontname,
fieldtype, headtype,language等, 另外也可以通过reference找到已经定义在"配置文件"中的内容, 该内容会copy给receipt_data这个打印buffer.
- 设置一个buffer, 就是receipt_data, 它用来存放通过格式得出来的要打印的buffer, 当然在组织这个buffer时,分两个部分, 一个是格式信息wordingreference, 另一个是实际数据 bussinessdata. 组织完整之后, 通过com发给打印机.