打印机(条码)打印标签、条码的方式一种是通过驱动发送图形的方式(这时一般需要排版软件),另一种是无需驱动直接通过发送指令到打印机执行打印。这里就是采取第二种方式打印。下面把实现过程中遇到的问题和一些心得总结一下:本实例使用DataMax-i-4308打印机。
1. VS(2008)中存在Com口操作的控件,却未有现成的LPT端口控件,而相对COM口来说,LPT的速度要快,所以在打印的时候客户一般选择LPT通讯方式,经过网上的一些查阅,终于实现了LPT口的打印,其他品牌打印机原理类似,只是打印指令有所区别。
实现LPT端口指令打印的方式是采用Windows下的API函数CreateFile,该函数要实现并口操作,需要设置几个关键参数。函数原型为:
HANDLE WINAPI CreateFile( LPCTSTRlpFileName, DWORDdwDesiredAccess, DWORDdwShareMode, LPSECURITY_ATTRIBUTESlpSecurityAttributes, DWORDdwCreationDisposition, DWORDdwFlagsAndAttributes, HANDLEhTemplateFile);
LPT操作需要设置:
lpFileName应设为端口号;如"LPT1"或者"COM3"等;
dwDesiredAccess设为GENERIC_WRITE或者GENERIC_READ或者GENERIC_WRITE|GENERIC_READ。
实现LPT端口指令打印的方式是采用Windows下的API函数CreateFile,该函数要实现并口操作,需要设置几个关键参数。函数原型为:
HANDLE WINAPI CreateFile( LPCTSTRlpFileName, DWORDdwDesiredAccess, DWORDdwShareMode, LPSECURITY_ATTRIBUTESlpSecurityAttributes, DWORDdwCreationDisposition, DWORDdwFlagsAndAttributes, HANDLEhTemplateFile);
LPT操作需要设置:
lpFileName应设为端口号;如"LPT1"或者"COM3"等;
dwDesiredAccess设为GENERIC_WRITE或者GENERIC_READ或者GENERIC_WRITE|GENERIC_READ。
dwCreationDisposition应设为OPEN_EXISTING。
hTemplateFile需要设为NULL或者0。
在C#中使用API需要做一个dll库的使用声明,例:
[DllImport("kernel32.dll ")]
private static extern int CreateFile( string lpFileName, uint dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);
注:以上的宏需要自己定义,例:private const uint GENERIC_WRITE = 0x40000000; private const int OPEN_EXISTING = 3;
2. 使用CreateFile操作并口,然后使用CreateFile返回的句柄与并口通信。例:(我这里是写入数据到LPT1)
int hPort = CreateFile("LPT1", GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
System.IntPtr hPortP = new IntPtr(hPort);//定义一个IntPtr并输出对象并初始化,用于对句柄操作。
SafeFileHandle sfHandle = new SafeFileHandle(hPortP, true);//因为用hPortP给出警告。
hTemplateFile需要设为NULL或者0。
在C#中使用API需要做一个dll库的使用声明,例:
[DllImport("kernel32.dll ")]
private static extern int CreateFile( string lpFileName, uint dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);
注:以上的宏需要自己定义,例:private const uint GENERIC_WRITE = 0x40000000; private const int OPEN_EXISTING = 3;
2. 使用CreateFile操作并口,然后使用CreateFile返回的句柄与并口通信。例:(我这里是写入数据到LPT1)
int hPort = CreateFile("LPT1", GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
System.IntPtr hPortP = new IntPtr(hPort);//定义一个IntPtr并输出对象并初始化,用于对句柄操作。
SafeFileHandle sfHandle = new SafeFileHandle(hPortP, true);//因为用hPortP给出警告。
FileStream fs;
fs = new FileStream(sfHandle, FileAccess.Write,1);//利用安全句柄和写模式实例一个文件流。
StreamWriter writer = new StreamWriter(fs);//定义一个写入流进行向LPT1写入数据。
writer.AutoFlush = false;//不让自动清空
writer.WriteLine(sContent);//把数据(字符串)写入到LPT1。
writer.Flush();
writer.Close();
fs.Close();
CloseHandle(hPort);
3. DataMax的指令DPL与Zebra的指令ZPL不同,开始编写指令发送,总是遇到一些无法打印(识别)的问题。DPL看上去不如ZPL好理解,也许是很多人对ZPL比较熟悉的原因。其实总的来说指令都大同小异,只是语法标示不太一样。DPL指令在标签设置部分是以<STX>L做开始标示符的。每行语句以<CR>做结束符。开始学习时一直把<STX>当做一个字
符串来理解,在网上差了一些资料,说是需要转化为16进制才行,然后拼命的将<STX>转化为16进制,再把十六进制的数字格式化为字符串,发送给打印机仍然是无反应。最后研究了下ASCII码,发现STX是一个控制字符。<>只是起到说明里面的内容是控制字符的意思,需要用16进制转义字符。例:
str = "\x02L\n" + "D11\n" + "1E0000000150100" + textBoxNum.Text +
dateTimePickerDate.Value.ToString("yyyyMMdd") + strFor + "\n";//输入的单位编号加日期加流水号组成条码内容。
str += "121100000000100Barcode E\n" + "E\n";
把这里的str赋值给上面的sContent就行了,具体的函数编写可以根据自己的习惯或者思维方式来写。实现的方式很多种,也可以自己定义一个类封装函数。
str = "\x02L\n" + "D11\n" + "1E0000000150100" + textBoxNum.Text +
dateTimePickerDate.Value.ToString("yyyyMMdd") + strFor + "\n";//输入的单位编号加日期加流水号组成条码内容。
str += "121100000000100Barcode E\n" + "E\n";
把这里的str赋值给上面的sContent就行了,具体的函数编写可以根据自己的习惯或者思维方式来写。实现的方式很多种,也可以自己定义一个类封装函数。
ASCII码表完整版
ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 |
0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | ” | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | , | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DCI | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | X | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | / | 124 | | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ~ |
31 | US | 63 | ? | 95 | — | 127 | DEL |
NUL 空 | VT 垂直制表 | SYN 空转同步 |
SOH 标题开始 | FF 走纸控制 | ETB 信息组传送结束 |
STX 正文开始 | CR 回车 | CAN 作废 |
ETX 正文结束 | SO 移位输出 | EM 纸尽 |
EOY 传输结束 | SI 移位输入 | SUB 换置 |
ENQ 询问字符 | DLE 空格 | ESC 换码 |
ACK 承认 | DC1 设备控制1 | FS 文字分隔符 |
BEL 报警 | DC2 设备控制2 | GS 组分隔符 |
BS 退一格 | DC3 设备控制3 | RS 记录分隔符 |
HT 横向列表 | DC4 设备控制4 | US 单元分隔符 |
LF 换行 | NAK 否定 | DEL 删除 |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论