打印机(条码)打印标签、条码的方式一种是通过驱动发送图形的方式(这时一般需要排版软件),另一种是无需驱动直接通过发送指令到打印机执行打印。这里就是采取第二种方式打印。下面把实现过程中遇到的问题和一些心得总结一下:本实例使用DataMax-i-4308打印机。
      1. VS2008)中存在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
      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给出警告。

      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的指令DPLZebra的指令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就行了,具体的函数编写可以根据自己的习惯或者思维方式来写。实现的方式很多种,也可以自己定义一个类封装函数。
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小时内删除。