4

Click here to load reader

delphi-api.txt 20/08/2011 a porta serial(COM1, COM2, etc ... · PDF filedelphi-api.txt 20/08/2011 {Objetivo: Fazer leitura de código de barras ou cheques utilizando a porta serial(COM1,

  • Upload
    ledung

  • View
    221

  • Download
    0

Embed Size (px)

Citation preview

Page 1: delphi-api.txt 20/08/2011 a porta serial(COM1, COM2, etc ... · PDF filedelphi-api.txt 20/08/2011 {Objetivo: Fazer leitura de código de barras ou cheques utilizando a porta serial(COM1,

delphi-api.txt 20/08/2011

{Objetivo:Fazer leitura de código de barras ou cheques utilizandoa porta serial(COM1, COM2, etc) sem usar um componente.Recurso:API – Application Programming Interface.Definição:Um conjunto de funções e sub-rotinas usadas para ativar um determinadodispositivo no programa.A Microsoft utiliza várias APIs nas várias versões do Windows:Win16 API, Win32 API, a OLE API e a Telephony API, entre outras.Autor:Cirilo J. Veloso – www.veloso.kit.net}unit RS232_U;

interface

usesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, ExtCtrls;

typeTfPrincipal = class(TForm)Panel1: TPanel;btAbrir: TButton;btFechar: TButton;Panel2: TPanel;edEnviar: TEdit;btEnviar: TButton;Panel3: TPanel;Memo1: TMemo;Label1: TLabel;Label2: TLabel;Panel4: TPanel;edConfig: TEdit;Label3: TLabel;Label4: TLabel;edPorta: TEdit;Timer1: TTimer;procedure btAbrirClick(Sender: TObject);procedure btFecharClick(Sender: TObject);procedure btEnviarClick(Sender: TObject);procedure FormCreate(Sender: TObject);procedure Timer1Timer(Sender: TObject);procedure FormClose(Sender: TObject; var Action: TCloseAction);

private{ Private declarations }public{ Public declarations }end;

varfPrincipal: TfPrincipal;hComm: THandle;bRead: array[0..255] of byte;iRet: LongBool;bAberta: Boolean;

implementation{Objetivo: Abrir comunicação com a porta serialParamentros:NomePorta =COM1,COM2,COM3,etcConfigPorta=9600,o,7,1 ou 9600,n,8,2 etcRetorno:True ou false}Function OpenComm(NomePorta, ConfigPorta: String):Boolean;var BarDCB: DCB;LastError: Cardinal;CTimeOut: COMMTIMEOUTS;

1

Page 2: delphi-api.txt 20/08/2011 a porta serial(COM1, COM2, etc ... · PDF filedelphi-api.txt 20/08/2011 {Objetivo: Fazer leitura de código de barras ou cheques utilizando a porta serial(COM1,

delphi-api.txt 20/08/2011

beginhComm:=CreateFile(PChar(NomePorta),GENERIC_READ+GENERIC_WRITE,1, //not sharednil, //no securityOPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, //+FILE_FLAG_OVERLAPPED0{template} );If hComm = INVALID_HANDLE_VALUE Then beginShowMessage(‘Porta Serial ‘ + NomePorta + ‘ não disponível. configure osparamentros da porta serial’);Result:=False;Exit;End;// Configurar os Time Outs para a PortaCtimeOut.ReadIntervalTimeout:=20;CtimeOut.ReadTotalTimeoutConstant:=1;CtimeOut.ReadTotalTimeoutMultiplier:=1;CtimeOut.WriteTotalTimeoutConstant:=20;CtimeOut.WriteTotalTimeoutMultiplier:=1;iRet:=SetCommTimeouts(hComm, CTimeOut);If Ord(iRet)= -1 Then beginLastError:=GetLastError();ShowMessage(‘Não é permitido configurar os Timeouts para esta porta ‘ +NomePorta + ‘ Erro: ‘ + Inttostr(LastError));CloseHandle(hComm);Result:=False;Exit;End;iRet:=BuildCommDCB(PChar(NomePorta+’:'+ConfigPorta), BarDCB);If Ord(iRet)=-1 Then beginLastError:= GetLastError();ShowMessage(‘Não é permitido montar os parametros da Porta’ + ConfigPorta +‘ Erro: ‘ + Inttostr(LastError));CloseHandle(hComm);Result:=False;Exit;End;iRet:=SetCommState(hComm, BarDCB);If Ord(iRet)= -1 Then beginLastError:= GetLastError();ShowMessage(‘Não é permitido configurar os parametros da Porta’ +ConfigPorta + ‘ Erro: ‘ + Inttostr(LastError));CloseHandle(hComm);Result:=False;Exit;End;Result:=True;End;{Objetivo: Fechar comunicação com a porta serialRetorno:True ou false}Function CloseComm:Boolean;beginResult:=CloseHandle(hComm);End;{Objetivo: Limpar Buffer de Leitura e Escrita}Procedure FlushComm;beginFlushFileBuffers(hComm);End;{Objetivo: Limpar dados recebidos na porta serial}Procedure ClearReadComm;beginPurgeComm(hComm,PURGE_RXCLEAR);End;{Objetivo: Limpar dados enviados para porta serial

2

Page 3: delphi-api.txt 20/08/2011 a porta serial(COM1, COM2, etc ... · PDF filedelphi-api.txt 20/08/2011 {Objetivo: Fazer leitura de código de barras ou cheques utilizando a porta serial(COM1,

delphi-api.txt 20/08/2011

}Procedure ClearSendComm;beginPurgeComm(hComm,PURGE_TXCLEAR);End;{Objetivo: Ler dados na Porta serialRetorno:String}Function ReadComm:String;var BytesLidos: DWord;i: Integer;ReadStr: String;beginiRet:=ReadFile(hComm, bRead[0], 255, BytesLidos, nil);if ord(iRet)=-1 then exit;ReadStr:=”;//IF bytesLidos > 0 then ShowMessage(inttostr(BytesLidos));If BytesLidos > 0 ThenFor I:=0 To BytesLidos – 1 doReadStr:=ReadStr + chr(bRead[i])ElseFlushComm;Result:=ReadStr;End;{Objetivo: Enviar dados para a porta serialParamentros:sComando = ’54FEC400'comando para configurar o leitor em 9600,o,8,1Modelo TL800 da empresa TecsimiRetorno:True ou false}Function SendComm(sComando: String):Integer;var BytesEnviados: DWORD;beginiRet:=WriteFile(hComm,PCHAR(sComando)[0],Length(sComando), BytesEnviados,nil);FlushComm;if iRet then Result:=BytesEnviados else Result:=-1;End;{FIM DAS FUNÇÕES DO WINDOWS}{$R *.DFM}

procedure TfPrincipal.btAbrirClick(Sender: TObject);begin//Abrir a porta e habilitar/desabilitar botões e Timer.bAberta:=OpenComm(edPorta.Text,edConfig.Text);btAbrir.Enabled:=not bAberta;btFechar.Enabled:=bAberta;Timer1.Enabled:=bAberta;//Memo1.Lines.Clear;//Memo1.Lines.Add(‘PASSE O DOCUMENTO NO LEITOR..’);end;

procedure TfPrincipal.btFecharClick(Sender: TObject);begin//Fechar a porta e habilitar/desabilitar botões e Timer.bAberta:=CloseComm;Timer1.Enabled:=not bAberta;btAbrir.Enabled:=bAberta;btFechar.Enabled:=not bAberta;end;

procedure TfPrincipal.btEnviarClick(Sender: TObject);begin//Enviar comando para a porta serialif not bAberta then beginShowMessage(‘PORTA SERIAL ESTA FECHADA !’);exit;end;

3

Page 4: delphi-api.txt 20/08/2011 a porta serial(COM1, COM2, etc ... · PDF filedelphi-api.txt 20/08/2011 {Objetivo: Fazer leitura de código de barras ou cheques utilizando a porta serial(COM1,

delphi-api.txt 20/08/2011

//SendComm(edEnviar.Text)+ chr(13) + chr(10);sendcomm(chr(84) + chr(254) + chr(196) + chr(0) + chr(13) + chr(10))end;

procedure TfPrincipal.FormCreate(Sender: TObject);beginbtFechar.Enabled:=False;end;

{Timer usado para executar a função de leitura da porta}procedure TfPrincipal.Timer1Timer(Sender: TObject);var cStr: String;beginif not bAberta then beginShowMessage(‘PORTA SERIAL ESTA FECHADA !’);exit;end;cStr:=ReadComm;if Length(cStr)>0 then Memo1.Lines.Add(cStr);end;

procedure TfPrincipal.FormClose(Sender: TObject; var Action: TCloseAction);beginif bAberta then CloseComm;end;

end.

4