admin 管理员组

文章数量: 887031


2024年1月14日发(作者:免费资源excel自学教程)

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

dwCreationDisposition应设为OPEN_EXISTING。

hTemplateFile需要设为NULL或者0。

在C#中使用API需要做一个dll库的使用声明,例:

[DllImport(" ")]

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);

hPortP = new IntPtr(hPort);//定义一个IntPtr对象并初始化,用于对句柄操作。

SafeFileHandle sfHandle = new SafeFileHandle(hPortP, true);//因为用hPortP给出警告。

FileStream fs;

fs = new FileStream(sfHandle, ,1);//利用安全句柄和写模式实例一个文件流。

StreamWriter writer = new StreamWriter(fs);//定义一个写入流进行向LPT1写入数据。

ush = false;//不让自动清空

ine(sContent);//把数据(字符串)写入到LPT1。

();

();

();

CloseHandle(hPort);

3. DataMax的指令DPL与Zebra的指令ZPL不同,开始编写指令发送,总是遇到一些无法打印(识别)的问题。DPL看上去不如ZPL好理解,也许是很多人对ZPL比较熟悉的原因。其实总的来说指令都大同小异,只是语法标示不太一样。DPL指令在标签设置部分是以L做开始标示符的。每行语句以做结束符。开始学习时一直把当做一个字符串来理解,在网上差了一些资料,说是需要转化为16进制才行,然后拼命的将转化为16进制,再把十六进制的数字格式化为字符串,发送给打印机仍然是无反应。最后研究了下ASCII码,发现STX是一个控制字符。<>只是起到说明里面的内容是控制字符的意思,需要用16进制转义字符。例:

str = "x02Ln" + "D11n" + "1E0" + +

ng("yyyyMMdd") + strFor +

"n";//输入的单位编号加日期加流水号组成条码内容。

str += "1211Barcode En" + "En";

把这里的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

19

20

21

22

23

24

25

26

27

28

29

30

31

DC2

DC3

DC4

NAK

SYN

TB

CAN

EM

SUB

ESC

FS

GS

RS

US

50

51

52

53

54

55

56

57

58

59

60

61

62

63

2

3

4

5

6

7

8

9

:

;

<

=

>

?

82

83

84

85

86

87

88

89

90

91

92

93

94

95

R

X

T

U

V

W

X

Y

Z

[

/

]

^

114

115

116

117

118

119

120

121

122

123

124

125

126

127

r

s

t

u

v

w

x

y

z

{

|

}

~

DEL

NUL 空

SOH 标题开始

STX 正文开始

ETX 正文结束

EOY 传输结束

ENQ 询问字符

ACK 承认

BEL 报警

BS 退一格

HT 横向列表

LF 换行

VT 垂直制表

FF 走纸控制

CR 回车

SO 移位输出

SI 移位输入

DLE 空格

DC1 设备控制1

DC2 设备控制2

DC3 设备控制3

DC4 设备控制4

NAK 否定

SYN 空转同步

ETB 信息组传送结束

CAN 作废

EM 纸尽

SUB 换置

ESC 换码

FS 文字分隔符

GS 组分隔符

RS 记录分隔符

US 单元分隔符

DEL 删除


本文标签: 打印 需要 指令