直接打印至打印机 请问指令如何写入。(500分)(100分)

  • 主题发起人 主题发起人 idon
  • 开始时间 开始时间
I

idon

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用的是EPSONTM_U300B打印机 要求不安装驱动程序,直接写入 类似ESC @ 这样的指令
请问这种指令如何向串口写入 ,我是新手,请详细指教
最好 给我一段源代码 多谢了!!!
 
在程序中增加一个串口通讯控件如SPCOM或MSCOM
设置串口参数,如波特率校验位数据位个数等。
利用控件提供的方法向打印机发送控制码
代码如下:以SPCOM为例:
procedure Form1.InitComm;
begin
spcom.commname:='COM2';

spcom.BaudRate:=19200;
spcom.paritycheck:=false;
spcom.ByteSize:=_8;
spcom.StopBits:=_1;
try
spcom.StartComm;
except on ECommsErrordo
ShowMessage('串口初始化败');
end;
end;

2.向打印机发送命令:
procedure Form1.PrintToComm;
var
s:string;
begin
//.....
s:=chr($1b)+'@';
writecomm(s);
end;
procedure Form1.writecomm(s:string);
begin
spcom.WriteCommData(PCHAR(s),Length(s));
end;
 
allen,我单位的一台打卡机现在要求用PC机监控,也就是说直接从打卡机的串口(原来是直接
接打印机的)接受送往打印机的数据,然后进行翻译和数据库管理,请问翻译如何实现?
 
procedure Directprint(s:string);
type
PrnBuffRec=record
Bufflength:integer;
Buffer:array[0..255] of char;
end;
var Buff:PrnBuffRec;
begin
StrPcopy(Buff.Buffer,s);
Buff.Bufflength:=Strlen(Buff.Buffer);
Escape(Printer.handle,Passthrough,0,@Buff,nil);
end;

//调用Directprint 发送控制码,打印
Procedure PrintESC;
begin
Printer.begin
Doc;
DirectPrint(CHR(28)+chr(101)+chr(32)+chr(32)+' 客运公司收费单 ');
...
Printer.EndDoc;
end;
控制码根据打印机类型,做相应替换就行.
 
同意:Allen
 
问题是不知道怎么得到打印机的缓存什么时候已满的信息
这样除非加足够的延迟时间,否则不能避免数据湮没的情况发生。
 
var
TFile :TEXTFILE;
sPort:String;
begin
try
AssignFile(TFile,sPort);
Rewrite(TFile);
Writeln(TFile,PrintString);
CloseFile(TFile);
except
Application.MessageBox('打印文件出错!','信息',MB_ICONINFORMATION+MB_OK);
Exit;
end;
 
往缓冲区不停的输入数据,就算打印机来不及打印,
那个傻打印机也根本不会报错,只是字丢了重叠了或是乱码。
到底怎么得到打印机的反馈信息,大家帮帮忙好不好。
我现在用的是足够的延时,总觉得不够地道。应该有办法解决的。
 
给了分的问题已经解决了,追加提问是不是该加分哦?
 
To: 惊弓之亮
可以阿 我还好,还付的起。关键是你接招了。
 
关于缓冲区满的问题:
你可使用串口通信中的流量控制协议之一:XON/XOFF,DSR/DTR或RTS/DTS。
EPSONTM_U300B上肯定支持XON/XOFF,对于DSR/DTR和RRTS/DTS是支持哪一个,我不记得了,
具体参见说明书。我一直用XON/XOFF,因为XON/XOFF只需要三根线就可以了,还没有发生缓冲区满的问题。
 
怎样得到打印是否正常?
 
unit PrtRaw;

interface
uses
WinTypes;
{$IFDEF WIN32}
type SpoolInt = DWORD;
{$else
}
type SpoolInt = integer;
{$ENDIF}
function StartRawPrintJob(PrinterName : pChar;
Port : pChar;
do
cName : pChar) : THandle;
function StartRawPrintPage(hPrn : THandle) : integer;
function PrintRawData(hPrn : THandle;
Buffer : pointer;
NumBytes : SpoolInt) : integer;
function EndRawPrintPage(hPrn : THandle) : integer;
function EndRawPrintJob(hPrn : THandle) : integer;

implementation
uses
WinProcs,
{$IFDEF WIN32}
WinSpool;
{$else
}
Print;
{$ENDIF}

function StartRawPrintJob(PrinterName : pChar;
Port : pChar;
do
cName : pChar) : THandle;
{$IFDEF WIN32}
var
hPrn : THandle;
do
cInfo1 : TDocInfo1;
{$ENDIF}
begin
{$IFDEF WIN32}
if (OpenPrinter(PChar(PrinterName),
hPrn,
nil) = FALSE) then
begin
Result := THandle(-1);
Exit;
end;
do
cInfo1.pDocName :=do
cName;
do
cInfo1.pOutputFile := Port;
do
cInfo1.pDataType := 'RAW';
if (StartDocPrinter(hPrn,
1,
@DocInfo1) = 0) then
begin
Result := THandle(-1);
exit;
end;
Result := hPrn;
{$else
}
result := OpenJob(Port,
do
cName,
0);
{$ENDIF}
end;

function StartRawPrintPage(hPrn : THandle) : integer;
begin
{$IFDEF WIN32}
if (StartPagePrinter(hPrn) = FALSE) then
begin
Result := -1;
exit;
end;
result := 1;
{$else
}
result := StartSpoolPage(hPrn);
{$ENDIF}
end;

function PrintRawData(hPrn : THandle;
Buffer : pointer;
NumBytes : SpoolInt) : integer;
{$IFDEF WIN32}
var
BytesWritten : DWORD;
{$ENDIF}
begin
if (NumBytes = 0) then
begin
Result := 1;
exit;
end;
{$IFDEF WIN32}
if (WritePrinter(hPrn,
Buffer,
NumBytes,
BytesWritten) = FALSE) then
begin
Result := -1;
exit;
end;
if (NumBytes <> BytesWritten) then
begin
Result := -1;
exit;
end;
Result := 1;
{$else
}
result := WriteSpool(hPrn,
Buffer,
NumBytes);
{$ENDIF}
end;

function EndRawPrintPage(hPrn : THandle) : integer;
begin
{$IFDEF WIN32}
if (EndPagePrinter(hPrn) = FALSE) then
begin
Result := -1;
exit;
end;
Result := 1;
{$else
}
result := EndSpoolPage(hPrn);
{$ENDIF}
end;

function EndRawPrintJob(hPrn : THandle) : integer;
begin
{$IFDEF WIN32}
if (EndDocPrinter(hPrn) = FALSE) then
begin
Result := -1;
exit;
end;
if (ClosePrinter(hPrn) = FALSE) then
begin
Result := -1;
exit;
end;
Result := 1;
{$else
}
result := CloseJob(hPrn);
{$ENDIF}
end;

end.

{Example of use:}
uses
PrtRaw;

procedure TForm1.Button1Click(Sender: TObject);
var
hPrn : THandle;
Data : array[0..31] of char;
begin

hPrn := StartRawPrintJob('Generic / Text Only',
'LPT1:',
'Mydo
cument');
if (integer(hPrn) < 0) then
begin
ShowMessage('StartRawPrintJob Failed');
exit;
end;

if (StartRawPrintPage(hPrn) < 0) then
begin
ShowMessage('StartRawPrintPage Failed');
EndRawPrintJob(hPrn);
exit;
end;

Data[0] := 'P';
Data[1] := 'a';
Data[2] := 'g';
Data[3] := 'e';
Data[4] := #32;
Data[5] := '1';
Data[6] := #13;
Data[7] := #10;
if (PrintRawData(hPrn,
@data,
8) < 0) then
begin
ShowMessage('PrintRawData Failed');
EndRawPrintPage(hPrn);
EndRawPrintJob(hPrn);
exit;
end;

if (EndRawPrintPage(hPrn) < 0) then
begin
ShowMessage('EndRawPrintPage Failed');
EndRawPrintJob(hPrn);
exit;
end;

if (StartRawPrintPage(hPrn) < 0) then
begin
ShowMessage('StartRawPrintPage Failed');
EndRawPrintJob(hPrn);
exit;
end;
Data[0] := 'P';
Data[1] := 'a';
Data[2] := 'g';
Data[3] := 'e';
Data[4] := #32;
Data[5] := '2';
Data[6] := #13;
Data[7] := #10;
if (PrintRawData(hPrn,
@data,
8) < 0) then
begin
ShowMessage('PrintRawData Failed');
EndRawPrintPage(hPrn);
EndRawPrintJob(hPrn);
exit;
end;

if (EndRawPrintPage(hPrn) < 0) then
begin
ShowMessage('EndRawPrintPage Failed');
EndRawPrintJob(hPrn);
exit;
end;

if (EndRawPrintJob(hPrn) < 0) then
begin
ShowMessage('EndRawPrintJob Failed');
exit;
end;

end;

end.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部