Business - Automação Comercial

Microterminal FIT Básico: Criando a primeira aplicação

Dando continuidade ao nosso mini-curso sobre o microterminal FIT Básico, veremos agora como declarar as funções da BemaSB32.dll e de como utilizá-las na aplicação.

por Iohannes Nakatani



Dando continuidade ao nosso mini-curso sobre o microterminal FIT Básico, veremos agora como declarar as funções da BemaSB32.dll e de como utilizá-las na aplicação.

Nesta edição, iremos iniciar com as funções de comunicação com o microterminal.

Obs: Não podemos esquecer que na edição 31 fizemos a configuração do microterminal FIT Básico, definindo o seu IP para a comunicação e demais opções, e na edição 33 conhecemos a BemaSB32.dll e sua configuração. É importante estarmos com tudo isso preparado para podermos iniciar o desenvolvimento.

- Declarando as Funções

A declaração das funções varia de acordo com a linguagem de programação que é utilizada. Em nosso mini-curso, utilizaremos o Delphi 7 e o Visual Basic 6 nas implementações.

  • Declaração das Funções da BemaSB32.dll em Delphi

function Bematech_FIT_IniciaComunicacao: integer; stdcall; external "BEMASB32.DLL" ;
function Bematech_FIT_FechaComunicacao: integer; stdcall; external "BEMASB32.DLL";
function Bematech_FIT_SelecionaProtocolo( iProtocolo: integer ): integer; stdcall; external "BEMASB32.DLL";
function Bematech_FIT_LimpaDisplay( Terminal: byte ): integer; stdcall; external "BEMASB32.DLL";
function Bematech_FIT_EscreveDisplay( Terminal: byte; Mensagem: string ): integer; stdcall; external "BEMASB32.DLL";
function Bematech_FIT_PosicionaCursor( Terminal: byte; Linha: byte; Coluna: byte ): integer; stdcall; external "BEMASB32.DLL";
function Bematech_FIT_LerBuffer( Terminal: byte ): char; stdcall; external "BEMASB32.DLL";
function Bematech_FIT_EnviaSerial( Terminal: byte; Dados: byte; Serial: byte ): integer; stdcall; external "BEMASB32.DLL";
function Bematech_FIT_ApagaLinha( Terminal: byte ): integer; stdcall; external "BEMASB32.DLL";
function Bematech_FIT_DeslocaCursorCima( Terminal: byte ): integer; stdcall; external "BEMASB32.DLL";
function Bematech_FIT_DeslocaCursorDireita( Terminal: byte ): integer; stdcall; external "BEMASB32.DLL";
function Bematech_FIT_VersaoFirmware( Terminal: byte ): integer; stdcall; external "BEMASB32.DLL";
function Bematech_FIT_ComandoGenerico( Terminal: byte; Comando: byte ): integer; stdcall; external "BEMASB32.DLL";
function Bematech_FIT_LeituraCodidoBarras( Terminal: byte ): integer; stdcall; external "BEMASB32.DLL";
function Bematech_FIT_EnviaComando( Comando: string ): integer; stdcall; external "BEMASB32.DLL";

  • Declaração das Funções da BemaSB32.dll em Visual Basic

Private Declare Function Bematech_FIT_IniciaComunicacao Lib "BemaSB32.dll" () As Integer
Private Declare Function Bematech_FIT_FechaComunicacao Lib "BemaSB32.dll" () As Integer
Private Declare Function Bematech_FIT_SelecionaProtocolo Lib "BemaSB32.dll" (ByVal Protocolo As Integer) As Integer
Private Declare Function Bematech_FIT_LimpaDisplay Lib "BemaSB32.dll" (ByVal Terminal As Byte) As Integer
Private Declare Function Bematech_FIT_EscreveDisplay Lib "BemaSB32.dll" (ByVal Terminal As Byte, ByVal Mensagem As String) As Integer
Private Declare Function Bematech_FIT_PosicionaCursor Lib "BemaSB32.dll" (ByVal Terminal As Byte, ByVal Linha As Byte, ByVal Coluna As Byte) As Integer
Private Declare Function Bematech_FIT_LerBuffer Lib "BemaSB32.dll" (ByVal Terminal As Byte) As Integer
Private Declare Function Bematech_FIT_EnviaSerial Lib "BemaSB32.dll" (ByVal Terminal As Byte, ByVal Dados As Byte, ByVal Serial As Byte) As Integer
Private Declare Function Bematech_FIT_ApagaLinha Lib "BemaSB32.dll" (ByVal Terminal As Byte) As Integer
Private Declare Function Bematech_FIT_DeslocaCursorCima Lib "BemaSB32.dll" (ByVal Terminal As Byte) As Integer
Private Declare Function Bematech_FIT_DeslocaCursorDireita Lib "BemaSB32.dll" (ByVal Terminal As Byte) As Integer
Private Declare Function Bematech_FIT_VersaoFirmware Lib "BemaSB32.dll" (ByVal Terminal As Byte) As Integer
Private Declare Function Bematech_FIT_ComandoGenerico Lib "BemaSB32.dll" (ByVal Terminal As Byte, ByVal Comando As Byte) As Integer
Private Declare Function Bematech_FIT_LeituraCodidoBarras Lib "BemaSB32.dll" (ByVal Terminal As Byte) As Integer
Private Declare Function Bematech_FIT_EnviaComando Lib "BemaSB32.dll" (ByVal Comando As String) As Integer

- Iniciando a Comunicação

Agora, vamos implementar em nossa aplicação de exemplo algumas funções para a comunicação com o microterminal FIT Básico.

O primeiro passo é implementarmos a função que irá iniciar a comunicação com o microterminal - a função Bematech_FIT_IniciaComunicação. Esta função inicia os sockets de comunicação da dll, abrindo a porta configurada no arquivo BemaSB32.ini para "conversar" com o microterminal via TCP/IP.

Então, vamos criar um botão no formulário para implementar esta função, chamando-o de "Iniciar Comunicação". Abrindo o botão para codificar, criamos a variável iRetorno do tipo inteira para receber o retorno da função, e a implementamos assim:

- Em Delphi

procedure TForm1.Button1Click(Sender: TObject);
var
iRetorno: integer;
begin

iRetorno := Bematech_FIT_IniciaComunicacao();

if ( iRetorno = 0 ) then
Application.MessageBox( "Erro de Inicialização!", "ERRO", MB_ICONINFORMATION + MB_OK );
end;

- Em VB

Private Sub Command1_Click()
Dim iRetorno As Integer

iRetorno = Bematech_FIT_IniciaComunicacao

If iRetorno = 0 Then "Verificação de retorno de erro da função"
MsgBox "Erro de Inicialização", vbInformation + vbOKOnly, "Atenção"
End If
End Sub

Após a implementação do código, executamos o formulário e testamos a comunicação. Se tudo estiver correto, podemos observar a mudança de mensagem no display do microterminal, indicando que a comunicação foi estabelecida:

->

Conforme o código acima, fizemos um teste na variável iRetorno para verificar se a execução foi bem sucedida, apresentando uma mensagem de erro caso não tenha conseguido iniciar os sockets de comunicação.

- Finalizando a Comunicação

Para finalizar a comunicação (sockets) é preciso usar a função Bematech_FIT_FechaComunicacao. Esta função irá apresentar no display do microterminal a mensagem de "Desconectado", conforme a imagem apresentada acima.

- Em Delphi

procedure TForm1.Button2Click(Sender: TObject);
var
iRetorno: integer;
begin

iRetorno := Bematech_FIT_FechaComunicacao();

if ( iRetorno = 0 ) then
Application.MessageBox( "Erro de Fechamento!", "ERRO", MB_ICONINFORMATION + MB_OK );

end;

- Em VB

Private Sub Command2_Click()
Dim iRetorno As Integer

iRetorno = Bematech_FIT_FechaComunicacao

If iRetorno = 0 Then
MsgBox "Erro na Finalização", vbInformation + vbOKOnly, "Atenção"
End If
End Sub

Neste código vemos que o procedimento é o mesmo que o de inicialização, até mesmo a forma de verificação da variável iRetorno.

- Selecionando o Protocolo de Comunicação

O microterminal FIT Básico permite trabalhar com dois tipos de protocolo: o VT-100 ESC e o VT-100 STX/ETX. Então, vamos implementar a função "Bematech_FIT_SelecionaProtocolo" que seleciona o protocolo para envio dos comandos, mas antes, usaremos no formulário uma regra para que possa ser escolhido qual protocolo se deseja utilizar.

Para isso, inserimos um "GroupBox" e dois "RadioButton", um para cada protocolo (conforme imagem abaixo).

Vamos implementar esta função dentro do botão "Iniciar Comunicação", assim o protocolo já é setado.

- Em Delphi

procedure TForm1.Button1Click(Sender: TObject);
var
iRetorno: integer;
begin

iRetorno := Bematech_FIT_IniciaComunicacao();

if ( iRetorno = 0 ) then
Application.MessageBox( "Erro de Inicialização!", "ERRO", MB_ICONINFORMATION + MB_OK );

if ( RadioButton1.Checked = True ) then
begin
iRetorno := Bematech_FIT_SelecionaProtocolo( 1 );
end
else
begin
iRetorno := Bematech_FIT_SelecionaProtocolo( 0 );
end;

end;

- Em VB

Private Sub Command1_Click()
Dim iRetorno As Integer

iRetorno = Bematech_FIT_IniciaComunicacao

If iRetorno = 0 Then "Verificação de retorno de erro da função"
MsgBox "Erro de Inicialização", vbInformation + vbOKOnly, "Atenção"
End If

If Option1.Value = True Then
iRetorno = Bematech_FIT_SelecionaProtocolo(1)
Else
iRetorno = Bematech_FIT_SelecionaProtocolo(0)
End If

End Sub

- Verificando a Versão do Firmware

Para termos a certeza de que tudo está funcionando corretamente, vamos implementar uma função que retorna do microterminal sua versão de software básico (firmware) - a função "Bematech_FIT_VersaoFirmware". Além disso, é necessário usar uma outra função que irá trazer a versão do software básico, então implementamos também a função "Bematech_FIT_LerBuffer".

Antes de implementarmos o código, vamos criar um novo botão chamado "Versão do Firmware", um "TextBox" para receber o número do terminal que iremos trabalhar e um campo "Memo" no caso do Delphi ou "ListBox" no caso do VB, para receber as informações da versão do firmware, conforme imagem:

No botão "Versão do Firmware" implementamos o código:

- Em Delphi

procedure TForm1.Button3Click(Sender: TObject);
var
tmp: Char;
buffer: String;
begin
iRetorno := Bematech_FIT_VersaoFirmware( strtoint( Edit1.Text ) );
if ( iRetorno = 0 ) then
begin
application.MessageBox("Erro na execução do comando!","ERRO",MB_ICONINFORMATION + MB_OK );
end
else
begin
while ( tmp <> #03 ) do
begin
sleep( 100 );
tmp := Bematech_FIT_LerBuffer( strtoint( Edit1.Text ) );
buffer := buffer + tmp;
end;
Memo1.Text := buffer;
end;
end;

- Em VB

Private Sub Command3_Click()
Dim iRetorno As Integer
Dim tmp As Byte
Dim buffer As String

iRetorno = Bematech_FIT_VersaoFirmware(CInt(Text1.Text))

If iRetorno = 0 Then "Verificação de retorno de erro da função"
MsgBox "Erro na execução do comando", vbInformation + vbOKOnly, "Atenção"
Else
buffer = ""
Do While (Chr(tmp) <> Chr(3))
Sleep (100)
tmp = Bematech_FIT_LerBuffer(CInt(Text1.Text))
buffer = buffer + Chr(tmp)
Loop
End If
List1.AddItem (buffer)
End Sub

A função "Bematech_FIT_LerBuffer" retorna byte-a-byte os dados. Então, a implementamos dentro de um laço de repetição que é quebrado quando o último byte for "ETX" (3), que corresponde ao final da transmissão. Além disso, usamos um "Sleep" de 100 milisegundos para garantir o tráfego de pacotes na rede, assim evitando a perda dos dados. Este timer pode ser modificado dependendo do fluxo da rede.

Iohannes Nakatani

Iohannes Nakatani - Analista de Suporte. Bematech - Marketing de Parcerias.
Visite o site:
http://www.bematech.com.br.