具体写 稍微有点麻烦,我给你一段以前同事留下的一段代码,你参考参看,稍微有点乱。 unit PortUtls;interface uses windows,SysUtils; const addr_list:array[1..8] of word = ($3f8,$2f8,$3e8,$2e8,$dc00,$dc08,$dc10,$9018); DBUF = $0 ; // DATA BUFFER REGISTER LSB = $0 ; MSB = $1 ; IER = $1 ; // intr enable register IIR = $2 ; // intr ident. register LCR = $3 ; // line control register MCR = $4 ; // modem control register LSR = $5 ; // line status register MSR = $6 ; // modem status register var lines:Array[0..400] of char; line1:Array[1..1000]of Char; line2:Array[1..1000]of Char; myfont:Array[0..31] of Char; FHandle:THandle; PrnPort:integer; FPrnHandle1,FPrnHandle2:THandle; iPrnPort1,iPrnPort2:integer; function SendStr(iPort:integer;AP:Pchar;Count:integer):Boolean;export;stdcall;far; function OpenPort(bPt:byte):boolean; procedure ClosePort; {=========================函数原型声明==================================} // 读端口函数,一次读取一个字节。 function PortReadByte(wAddr: Word): Byte;// 高速读端口函数,一次读取一个字(Two Byte)。 // 对某些不能使用WORD访问的计算机或卡可能会引起问题, // 但一般情况下能正常使用。 function PortReadWord(wAddr: Word): Word;// 低速读端口函数,一次读取一个字(Two Byte)。 // 可以在任何情况下使用, 必要时调整DELAY的数值。 function PortReadWordLS(wAddr: Word): Word;// 写端口函数,一次写一个字节。 procedure PortWriteByte(wAddr: Word; bValue: Byte);// 高速写端口函数,一次写一个字。 // 对某些不能使用WORD访问的计算机或卡可能会引起问题, // 但一般情况下能正常使用。 procedure PortWriteWord(wAddr: Word; wValue: Word);// 低速写端口函数,一次写一个字。 // 可以在任何情况下使用, 必要时调整DELAY的数值。 procedure PortWriteWordLS(wAddr: Word; wValue: Word); Function InitSerialPort(wAddr: Word; wValue: Word):Word; assembler; register; Function ReceiveByte(n:integer):Byte; Function SendByteWithWait(n:integer;c:byte):Boolean; Function SendByteWithoutWait(n:integer;c:byte):Boolean; procedure SendStringWithoutWait(n:integer;s:string); procedure SendStringWithWait(n:integer;s:string); Function ReceiveString(n:integer;Len:integer):string; function InterPalComm(wValue:word;wPt:word):word;assembler; function PalComm(bType,bValue:byte;wPt:word):byte; procedure OutVal(bValue:byte;wAddr:word);assembler; function InitPalPrn(iPt:integer):integer; function SendStrToPalPrn(iPt:integer;str:string;iStrLen:integer):integer; function PalPrnStr(iPt:integer;str:string):integer;implementation //======================================================================= // 名称: PortReadByte // 说明: 读端口函数,一次读取一个字节。 // 参数: wAddr:Word // 端口地址 // 返回: Byte // 从给定端口读回的值。//======================================================================= function PortReadByte(wAddr: Word): Byte; assembler; register; asm MOV DX, AX IN AL, DX end;//======================================================================= // 名称: PortReadWord // 说明: 高速读端口函数,一次读取一个字(Two Byte)。 // 对某些不能使用WORD访问的计算机或卡可能会引起问题, // 但一般情况下能正常使用。 // 参数: wAddr:Word // 端口地址 // 返回: Word // 从给定端口读回的值。//======================================================================= function PortReadWord(wAddr: Word): Word; assembler; register; asm MOV DX, AX IN AX, DX end;//======================================================================= // 名称: PortReadWordLS // 说明: 低速读端口函数,一次读取一个字(Two Byte)。 // 可以在任何情况下使用, 必要时调整DELAY的数值。 // 参数: wAddr:Word // 端口地址 // 返回: Word // 从给定端口读回的值。//======================================================================= function PortReadWordLS(wAddr: Word): Word; assembler; register; const Delay = 150; // depending of CPU speed and cards speed asm MOV DX, AX IN AL, DX // read LSB port MOV ECX,Delay @1: LOOP @1 // delay between two reads XCHG AH, AL INC DX // port+1 IN AL, DX // read MSB port XCHG AH, AL // restore bytes order end;//======================================================================= // 名称: PortWriteByte // 说明: 写端口函数,一次写一个字节。 // 参数: wAddr:Word // 端口地址 // bValue:Byte // 写到端口的数值 // 返回: 无//======================================================================= procedure PortWriteByte(wAddr: Word; bValue: Byte); assembler; register; asm XCHG AX, DX OUT DX, AL end;//======================================================================= // 名称: PortWriteWord // 说明: 高速写端口函数,一次写一个字。 // 对某些不能使用WORD访问的计算机或卡可能会引起问题, // 但一般情况下能正常使用。 // 参数: wAddr:Word // 端口地址 // wValue:Word // 写到端口的数值 // 返回: 无//======================================================================= procedure PortWriteWord(wAddr: Word; wValue: Word); assembler; register; asm XCHG AX, DX OUT DX, AX end;//======================================================================= // 名称: PortWriteWordLS // 说明: 低速写端口函数,一次写一个字。 // 可以在任何情况下使用, 必要时调整DELAY的数值。 // 参数: wAddr:Word // 端口地址 // wValue:Word // 写到端口的数值 // 返回: 无//======================================================================= procedure PortWriteWordLS(wAddr: Word; wValue: Word); assembler; register; const Delay = 150; // depending of CPU speed and cards speed asm XCHG AX,DX OUT DX,AL // port LSB MOV ECX,Delay @1: LOOP @1 // delay between two writes XCHG AH,AL INC DX // port+1 OUT DX,AL // port MSB end; //======================================================================= // 名称: InitSerialPort // 说明: 初始化串口 // 调用BIOS中断(9600波特率,无奇偶校验,一个起始位,8个数据位) // 参数: wAddr:Word // 端口地址 // wValue:Word // 写到端口的数值 // 返回: 无 //======================================================================= Function InitSerialPort(wAddr: Word; wValue: Word):Word; assembler; register; asm XCHG AX, DX INT 14h end; {Function InitSerialPort(wAddr: Word; wValue: Word):Word; assembler; register; var status:Byte; begin status:=0; PortWriteByte(Addr_list[wAddr+1]+LCR,$e3) ; //读状态寄存器 status:=PortReadByte(Addr_list[wAddr+1]+LSR) ; //读状态寄存器 Result:=status; end;}//======================================================================= // 名称: Rec_char // 说明: 从串口读入字符 // 参数: n:Integer // 端口地址 // c:Byte // 输出字符 // 返回: 无//======================================================================= Function ReceiveByte(n:integer):Byte; var status:Byte; begin Result:=0; status:=0; if (n<1) or (n>8) then exit; while (status and $1)=0 do status:=PortReadByte(addr_list[n]+LSR); Result:=PortReadByte(addr_list[n]); end;
//======================================================================= // 名称: SendByteWithWait // 说明: 向串口输出字符(如发送不成功死等待直至数据被取走) // 参数: n:Integer // 端口地址 // c:Byte // 输出字符 // 返回: 无//======================================================================= Function SendByteWithWait(n:integer;c:byte):Boolean; var status:integer; begin status:=0; Result:=False; Try if (n<1) or (n>8) then exit; while((status and $20)=0) do //判断是否准备好 status:=PortReadByte(Addr_list[n]+LSR) ; //读状态寄存器 PortWriteByte(addr_list[n]+DBUF,c); //发送一个字节{ status:=InitSerialPort(n-1,$0300); while(status AND $0200)<>0 do begin PortWriteByte(addr_list[n]+DBUF,c); //如果有超越错重发字节 status:=InitSerialPort(n-1,$0300); end;} status:=PortReadByte(Addr_list[n]+LSR); while(status AND $02)<>0 do//判断是否有超越错 begin PortWriteByte(addr_list[n]+DBUF,c); //如果有超越错重发字节 status:=PortReadByte(Addr_list[n]+LSR); end; Result:=True; Except Result:=False; end; end; //======================================================================= // 名称: SendByteWithoutWait // 说明: 向串口输出字符(如发送不成功不等待) // 参数: n:Integer // 端口地址 // c:Byte // 输出字符 // 返回: 无//======================================================================= Function SendByteWithoutWait(n:integer;c:byte):Boolean; var status:integer; begin status:=0; Result:=False; Try if (n<1) or (n>8) then exit; while((status and $20)=0) do //判断是否准备好 status:=PortReadByte(Addr_list[n]+LSR) ; //读状态寄存器 PortWriteByte(addr_list[n]+DBUF,c); //发送一个字节 Result:=True; Except Result:=False; end; end; //======================================================================= // 名称: SendStringWithtWait // 说明: 向串口输出字符串 // 参数: n:Integer // 端口地址 // c:Byte // 输出字符 // len:integer // 长度 // 返回: 无//======================================================================= procedure SendStringWithWait(n:integer;s:string); var i:integer; begin for i:=1 to Length(s) do SendByteWithWait(n,ord(s[i])); end; //======================================================================= // 名称: SendStringWithouttWait // 说明: 向串口输出字符串 // 参数: n:Integer // 端口地址 // c:Byte // 输出字符 // len:integer // 长度 // 返回: 无//======================================================================= procedure SendStringWithoutWait(n:integer;s:string); var i:integer; begin for i:=1 to Length(s) do SendByteWithoutWait(n,ord(s[i])); end; //======================================================================= // 名称: ReceiveString // 说明: 从串口读出字符串 // 参数: n:Integer // 端口地址 // c:Byte // 读出字符 // len:integer // 长度 // 返回: 无//======================================================================= Function ReceiveString(n:integer;Len:integer):string; var i:integer; begin Result:=''; for i:=1 to Len do Result:=Result+Chr(ReceiveByte(n)); end;//函数: OpenPort //功能: 打开端口(串/并口) //参数:bPt:端口号,1:com1,2:com2,3:com3,4:com4,5:lpt1,6:lpt2 ; // 返回:true:成功;false:失败 //外部调用:否 //如果是串口,采用异步通讯模式; function OpenPort(bPt:byte):boolean; var PortName: pchar; PortStr:string; tPortDcb:TDCB; tms:TCOMMTIMEOUTS; begin //限制端口号超出范围 if (bPt<=0) or (bPt>2) then begin result:=false; exit; end; //如果这个端口已经被打开,不需要重新打开文件。提高速度 //否则重新生成文件。 if (PrnPort<>0) and (PrnPort=bPt) then begin result:=true; exit; end; PrnPort:=bPt; PortStr:='LPT'; PortName:=strAlloc(5); try case bPt of 1:StrPCopy( PortName, PortStr+'1'); 2:StrPCopy( PortName, PortStr+'2'); else StrPCopy( PortName, PortStr+'1'); end; if FHandle<>0 then ClosePort; FHandle := CreateFile( PortName, GENERIC_READ or GENERIC_WRITE, 0, // Not shared nil, // No security attributes OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL , 0 // No template ); if FHandle=invalid_handle_value then result:=false else begin tms.ReadIntervalTimeout:=MaxWord; tms.ReadTotalTimeoutMultiplier:=100;//0; tms.ReadTotalTimeoutConstant:=100;//1; tms.WriteTotalTimeoutMultiplier:=200;//20; tms.WriteTotalTimeoutConstant:=200; SetCommTimeOuts(FHandle,tms); result:=true; end; finally strdispose(PortName); end; end;//过程:ClosePort //功能:关闭端口 //参数:无 //外部调用:否 procedure ClosePort; begin if FHandle<>0 then CloseHandle(FHandle); FHandle:= 0; PrnPort:=0; end;//函数;SendStr //功能:往端口发送字符串,包含打开和关闭端口 //参数:sSendStr:要发送的字符串 //返回:true:成功;false:失败 //外部调用:是 function SendStr(iPort:integer;AP:Pchar;count:integer):Boolean;export; var nsent:DWord; dwDataSize,dError:Dword; p:pchar; write_os:OVERLAPPED; begin result:=false; if OpenPort(iPort)=false then begin exit; end; p:=Ap; dwDataSize:=Count; //并口通讯处理,简单的同步处理。 WriteFile( FHandle,p^,dwDataSize,nSent, nil); nSent:=abs(nsent); if dwDatasize=nSent then result:=true; end; //函数:InterPalComm //功能:调用BIOS INT17中断,对并口操作 //参数:wValue:通信口参数;bPt:端口号,0:LPT1,1:LPT2 //返回:AX值 //外部调用:否 function InterPalComm(wValue:word;wPt:word):word;assembler; asm INT 17H end;//函数:PalComm //功能:调用BIOS INT17中断,对并口操作 //参数:iType:对并口的操作类型,0:写字符;1:初始化,2:取打印机状态; // iValue:要写入的字符;iPt:端口号,0:LPT1,1:LPT2 //返回:AH值 //外部调用:否 //说明: 各参数的设置与C语言中的biosprint()函数完全相同 function PalComm(bType,bValue:byte;wPt:word):byte; var wValue,wRes:word; begin wValue:=bType*$100+bVAlue; wRes:=InterPalComm(wValue,wPt); result:=wRes div $100; end; //过程:OutVal //功能:将字节输出到硬件端口 //参数:bValue:要输出的字节;wAddr:硬件地址 //外部调用:否 procedure OutVal(bValue:byte;wAddr:word);assembler; asm OUT DX,AL end; //函数: InitPalPrn //功能: 初始化并口打印机 //参数: iPt:打印机端口,1:LPT1,2:LPT2 //返回: 1:成功初始化;0:错误 function InitPalPrn(iPt:integer):integer; begin if (iPt<1) or (iPt>2) then begin result:=0; exit; end; PalComm(1,0,iPt-1); end;//函数: SendStrToPalPrn //功能: 向并口打印机发送字符串 //参数: iPt:打印机端口,1:LPT1,2:LPT2 // str:要发送的字符串 // iStrLen:字符串长度 //返回: 1:成功;-1:错误; function SendStrToPalPrn(iPt:integer;str:string;iStrLen:integer):integer; var i:integer; bSta:byte; begin if (iPt<1) or (iPt>2) then begin result:=-1; exit; end; for i:=1 to iStrLen do begin bSta:=PalComm(0,ord(str[i]),iPt-1); if (bSta and $01)=$01 then begin result:=0; exit; end; end; result:=1; end;//函数: PalPrnStr //功能: 向并口打印机发送字符串并打印 //参数: iPt:打印机端口,1:LPT1,2:LPT2 // str:要发送的字符串 //返回: 1:成功;-1:错误; function PalPrnStr(iPt:integer;str:string):integer; begin str:=str+#$0a; result:=SendStrToPalPrn(iPt,str,length(str)); end;end.
大概是 :ESC @
unit PortUtls;interface
uses windows,SysUtils;
const
addr_list:array[1..8] of word = ($3f8,$2f8,$3e8,$2e8,$dc00,$dc08,$dc10,$9018);
DBUF = $0 ; // DATA BUFFER REGISTER
LSB = $0 ;
MSB = $1 ;
IER = $1 ; // intr enable register
IIR = $2 ; // intr ident. register
LCR = $3 ; // line control register
MCR = $4 ; // modem control register
LSR = $5 ; // line status register
MSR = $6 ; // modem status register
var
lines:Array[0..400] of char;
line1:Array[1..1000]of Char;
line2:Array[1..1000]of Char;
myfont:Array[0..31] of Char;
FHandle:THandle;
PrnPort:integer; FPrnHandle1,FPrnHandle2:THandle;
iPrnPort1,iPrnPort2:integer; function SendStr(iPort:integer;AP:Pchar;Count:integer):Boolean;export;stdcall;far;
function OpenPort(bPt:byte):boolean;
procedure ClosePort;
{=========================函数原型声明==================================}
// 读端口函数,一次读取一个字节。
function PortReadByte(wAddr: Word): Byte;// 高速读端口函数,一次读取一个字(Two Byte)。
// 对某些不能使用WORD访问的计算机或卡可能会引起问题,
// 但一般情况下能正常使用。
function PortReadWord(wAddr: Word): Word;// 低速读端口函数,一次读取一个字(Two Byte)。
// 可以在任何情况下使用, 必要时调整DELAY的数值。
function PortReadWordLS(wAddr: Word): Word;// 写端口函数,一次写一个字节。
procedure PortWriteByte(wAddr: Word; bValue: Byte);// 高速写端口函数,一次写一个字。
// 对某些不能使用WORD访问的计算机或卡可能会引起问题,
// 但一般情况下能正常使用。
procedure PortWriteWord(wAddr: Word; wValue: Word);// 低速写端口函数,一次写一个字。
// 可以在任何情况下使用, 必要时调整DELAY的数值。
procedure PortWriteWordLS(wAddr: Word; wValue: Word); Function InitSerialPort(wAddr: Word; wValue: Word):Word; assembler; register;
Function ReceiveByte(n:integer):Byte;
Function SendByteWithWait(n:integer;c:byte):Boolean;
Function SendByteWithoutWait(n:integer;c:byte):Boolean;
procedure SendStringWithoutWait(n:integer;s:string);
procedure SendStringWithWait(n:integer;s:string);
Function ReceiveString(n:integer;Len:integer):string;
function InterPalComm(wValue:word;wPt:word):word;assembler;
function PalComm(bType,bValue:byte;wPt:word):byte;
procedure OutVal(bValue:byte;wAddr:word);assembler;
function InitPalPrn(iPt:integer):integer;
function SendStrToPalPrn(iPt:integer;str:string;iStrLen:integer):integer;
function PalPrnStr(iPt:integer;str:string):integer;implementation
//=======================================================================
// 名称: PortReadByte
// 说明: 读端口函数,一次读取一个字节。
// 参数: wAddr:Word
// 端口地址
// 返回: Byte
// 从给定端口读回的值。//=======================================================================
function PortReadByte(wAddr: Word): Byte; assembler; register;
asm
MOV DX, AX
IN AL, DX
end;//=======================================================================
// 名称: PortReadWord
// 说明: 高速读端口函数,一次读取一个字(Two Byte)。
// 对某些不能使用WORD访问的计算机或卡可能会引起问题,
// 但一般情况下能正常使用。
// 参数: wAddr:Word
// 端口地址
// 返回: Word
// 从给定端口读回的值。//=======================================================================
function PortReadWord(wAddr: Word): Word; assembler; register;
asm
MOV DX, AX
IN AX, DX
end;//=======================================================================
// 名称: PortReadWordLS
// 说明: 低速读端口函数,一次读取一个字(Two Byte)。
// 可以在任何情况下使用, 必要时调整DELAY的数值。
// 参数: wAddr:Word
// 端口地址
// 返回: Word
// 从给定端口读回的值。//=======================================================================
function PortReadWordLS(wAddr: Word): Word; assembler; register;
const
Delay = 150; // depending of CPU speed and cards speed
asm
MOV DX, AX
IN AL, DX // read LSB port
MOV ECX,Delay
@1:
LOOP @1 // delay between two reads
XCHG AH, AL
INC DX // port+1
IN AL, DX // read MSB port
XCHG AH, AL // restore bytes order
end;//=======================================================================
// 名称: PortWriteByte
// 说明: 写端口函数,一次写一个字节。
// 参数: wAddr:Word
// 端口地址
// bValue:Byte
// 写到端口的数值
// 返回: 无//=======================================================================
procedure PortWriteByte(wAddr: Word; bValue: Byte); assembler; register;
asm
XCHG AX, DX
OUT DX, AL
end;//=======================================================================
// 名称: PortWriteWord
// 说明: 高速写端口函数,一次写一个字。
// 对某些不能使用WORD访问的计算机或卡可能会引起问题,
// 但一般情况下能正常使用。
// 参数: wAddr:Word
// 端口地址
// wValue:Word
// 写到端口的数值
// 返回: 无//=======================================================================
procedure PortWriteWord(wAddr: Word; wValue: Word); assembler; register;
asm
XCHG AX, DX
OUT DX, AX
end;//=======================================================================
// 名称: PortWriteWordLS
// 说明: 低速写端口函数,一次写一个字。
// 可以在任何情况下使用, 必要时调整DELAY的数值。
// 参数: wAddr:Word
// 端口地址
// wValue:Word
// 写到端口的数值
// 返回: 无//=======================================================================
procedure PortWriteWordLS(wAddr: Word; wValue: Word); assembler; register;
const
Delay = 150; // depending of CPU speed and cards speed
asm
XCHG AX,DX
OUT DX,AL // port LSB
MOV ECX,Delay
@1:
LOOP @1 // delay between two writes
XCHG AH,AL
INC DX // port+1
OUT DX,AL // port MSB
end;
//=======================================================================
// 名称: InitSerialPort
// 说明: 初始化串口
// 调用BIOS中断(9600波特率,无奇偶校验,一个起始位,8个数据位)
// 参数: wAddr:Word
// 端口地址
// wValue:Word
// 写到端口的数值
// 返回: 无
//=======================================================================
Function InitSerialPort(wAddr: Word; wValue: Word):Word; assembler; register;
asm
XCHG AX, DX
INT 14h
end;
{Function InitSerialPort(wAddr: Word; wValue: Word):Word; assembler; register;
var
status:Byte;
begin
status:=0;
PortWriteByte(Addr_list[wAddr+1]+LCR,$e3) ; //读状态寄存器
status:=PortReadByte(Addr_list[wAddr+1]+LSR) ; //读状态寄存器
Result:=status;
end;}//=======================================================================
// 名称: Rec_char
// 说明: 从串口读入字符
// 参数: n:Integer
// 端口地址
// c:Byte
// 输出字符
// 返回: 无//=======================================================================
Function ReceiveByte(n:integer):Byte;
var
status:Byte;
begin
Result:=0;
status:=0;
if (n<1) or (n>8) then
exit;
while (status and $1)=0 do
status:=PortReadByte(addr_list[n]+LSR);
Result:=PortReadByte(addr_list[n]);
end;
// 名称: SendByteWithWait
// 说明: 向串口输出字符(如发送不成功死等待直至数据被取走)
// 参数: n:Integer
// 端口地址
// c:Byte
// 输出字符
// 返回: 无//=======================================================================
Function SendByteWithWait(n:integer;c:byte):Boolean;
var
status:integer;
begin
status:=0;
Result:=False;
Try
if (n<1) or (n>8) then
exit;
while((status and $20)=0) do //判断是否准备好
status:=PortReadByte(Addr_list[n]+LSR) ; //读状态寄存器 PortWriteByte(addr_list[n]+DBUF,c); //发送一个字节{ status:=InitSerialPort(n-1,$0300);
while(status AND $0200)<>0 do
begin
PortWriteByte(addr_list[n]+DBUF,c); //如果有超越错重发字节
status:=InitSerialPort(n-1,$0300);
end;}
status:=PortReadByte(Addr_list[n]+LSR);
while(status AND $02)<>0 do//判断是否有超越错
begin
PortWriteByte(addr_list[n]+DBUF,c); //如果有超越错重发字节
status:=PortReadByte(Addr_list[n]+LSR);
end;
Result:=True;
Except
Result:=False;
end;
end;
//=======================================================================
// 名称: SendByteWithoutWait
// 说明: 向串口输出字符(如发送不成功不等待)
// 参数: n:Integer
// 端口地址
// c:Byte
// 输出字符
// 返回: 无//=======================================================================
Function SendByteWithoutWait(n:integer;c:byte):Boolean;
var
status:integer;
begin
status:=0;
Result:=False;
Try
if (n<1) or (n>8) then
exit;
while((status and $20)=0) do //判断是否准备好
status:=PortReadByte(Addr_list[n]+LSR) ; //读状态寄存器
PortWriteByte(addr_list[n]+DBUF,c); //发送一个字节
Result:=True;
Except
Result:=False;
end;
end;
//=======================================================================
// 名称: SendStringWithtWait
// 说明: 向串口输出字符串
// 参数: n:Integer
// 端口地址
// c:Byte
// 输出字符
// len:integer
// 长度
// 返回: 无//=======================================================================
procedure SendStringWithWait(n:integer;s:string);
var
i:integer;
begin
for i:=1 to Length(s) do
SendByteWithWait(n,ord(s[i]));
end;
//=======================================================================
// 名称: SendStringWithouttWait
// 说明: 向串口输出字符串
// 参数: n:Integer
// 端口地址
// c:Byte
// 输出字符
// len:integer
// 长度
// 返回: 无//=======================================================================
procedure SendStringWithoutWait(n:integer;s:string);
var
i:integer;
begin
for i:=1 to Length(s) do
SendByteWithoutWait(n,ord(s[i]));
end;
//=======================================================================
// 名称: ReceiveString
// 说明: 从串口读出字符串
// 参数: n:Integer
// 端口地址
// c:Byte
// 读出字符
// len:integer
// 长度
// 返回: 无//=======================================================================
Function ReceiveString(n:integer;Len:integer):string;
var
i:integer;
begin
Result:='';
for i:=1 to Len do
Result:=Result+Chr(ReceiveByte(n));
end;//函数: OpenPort
//功能: 打开端口(串/并口)
//参数:bPt:端口号,1:com1,2:com2,3:com3,4:com4,5:lpt1,6:lpt2 ;
// 返回:true:成功;false:失败
//外部调用:否
//如果是串口,采用异步通讯模式;
function OpenPort(bPt:byte):boolean;
var
PortName: pchar;
PortStr:string;
tPortDcb:TDCB;
tms:TCOMMTIMEOUTS;
begin
//限制端口号超出范围
if (bPt<=0) or (bPt>2) then
begin
result:=false;
exit;
end;
//如果这个端口已经被打开,不需要重新打开文件。提高速度
//否则重新生成文件。
if (PrnPort<>0) and (PrnPort=bPt) then
begin
result:=true;
exit;
end;
PrnPort:=bPt;
PortStr:='LPT';
PortName:=strAlloc(5);
try
case bPt of
1:StrPCopy( PortName, PortStr+'1');
2:StrPCopy( PortName, PortStr+'2');
else
StrPCopy( PortName, PortStr+'1');
end;
if FHandle<>0 then
ClosePort; FHandle := CreateFile(
PortName,
GENERIC_READ or GENERIC_WRITE,
0, // Not shared
nil, // No security attributes
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL ,
0 // No template
); if FHandle=invalid_handle_value then
result:=false
else begin
tms.ReadIntervalTimeout:=MaxWord;
tms.ReadTotalTimeoutMultiplier:=100;//0;
tms.ReadTotalTimeoutConstant:=100;//1;
tms.WriteTotalTimeoutMultiplier:=200;//20;
tms.WriteTotalTimeoutConstant:=200;
SetCommTimeOuts(FHandle,tms);
result:=true;
end;
finally
strdispose(PortName);
end;
end;//过程:ClosePort
//功能:关闭端口
//参数:无
//外部调用:否
procedure ClosePort;
begin
if FHandle<>0 then
CloseHandle(FHandle);
FHandle:= 0;
PrnPort:=0;
end;//函数;SendStr
//功能:往端口发送字符串,包含打开和关闭端口
//参数:sSendStr:要发送的字符串
//返回:true:成功;false:失败
//外部调用:是
function SendStr(iPort:integer;AP:Pchar;count:integer):Boolean;export;
var
nsent:DWord;
dwDataSize,dError:Dword;
p:pchar;
write_os:OVERLAPPED;
begin
result:=false;
if OpenPort(iPort)=false then
begin
exit;
end;
p:=Ap;
dwDataSize:=Count;
//并口通讯处理,简单的同步处理。
WriteFile( FHandle,p^,dwDataSize,nSent, nil);
nSent:=abs(nsent);
if dwDatasize=nSent then
result:=true;
end;
//函数:InterPalComm
//功能:调用BIOS INT17中断,对并口操作
//参数:wValue:通信口参数;bPt:端口号,0:LPT1,1:LPT2
//返回:AX值
//外部调用:否
function InterPalComm(wValue:word;wPt:word):word;assembler;
asm
INT 17H
end;//函数:PalComm
//功能:调用BIOS INT17中断,对并口操作
//参数:iType:对并口的操作类型,0:写字符;1:初始化,2:取打印机状态;
// iValue:要写入的字符;iPt:端口号,0:LPT1,1:LPT2
//返回:AH值
//外部调用:否
//说明: 各参数的设置与C语言中的biosprint()函数完全相同
function PalComm(bType,bValue:byte;wPt:word):byte;
var
wValue,wRes:word;
begin
wValue:=bType*$100+bVAlue;
wRes:=InterPalComm(wValue,wPt);
result:=wRes div $100;
end;
//过程:OutVal
//功能:将字节输出到硬件端口
//参数:bValue:要输出的字节;wAddr:硬件地址
//外部调用:否
procedure OutVal(bValue:byte;wAddr:word);assembler;
asm
OUT DX,AL
end;
//函数: InitPalPrn
//功能: 初始化并口打印机
//参数: iPt:打印机端口,1:LPT1,2:LPT2
//返回: 1:成功初始化;0:错误
function InitPalPrn(iPt:integer):integer;
begin
if (iPt<1) or (iPt>2) then
begin
result:=0;
exit;
end; PalComm(1,0,iPt-1);
end;//函数: SendStrToPalPrn
//功能: 向并口打印机发送字符串
//参数: iPt:打印机端口,1:LPT1,2:LPT2
// str:要发送的字符串
// iStrLen:字符串长度
//返回: 1:成功;-1:错误;
function SendStrToPalPrn(iPt:integer;str:string;iStrLen:integer):integer;
var
i:integer;
bSta:byte;
begin
if (iPt<1) or (iPt>2) then
begin
result:=-1;
exit;
end; for i:=1 to iStrLen do
begin
bSta:=PalComm(0,ord(str[i]),iPt-1);
if (bSta and $01)=$01 then
begin
result:=0;
exit;
end;
end; result:=1;
end;//函数: PalPrnStr
//功能: 向并口打印机发送字符串并打印
//参数: iPt:打印机端口,1:LPT1,2:LPT2
// str:要发送的字符串
//返回: 1:成功;-1:错误;
function PalPrnStr(iPt:integer;str:string):integer;
begin
str:=str+#$0a;
result:=SendStrToPalPrn(iPt,str,length(str));
end;end.
刚刚看到一个语句:printer.printerindex:=printer.printerindex;//打印机复位
这个不知道要怎么用??
谢谢!
printer.printerindex:=printer.printerindex;//打印机复位
但不知道这语句得放到哪?
高手请指教,谢谢!