Ir para conteúdo
Fórum Script Brasil
  • 0

Delphi biometria via serial


Reisah

Pergunta

Possuo um controle de acesso com biometria em usb, mais devido a limitação do cabo usb de 5m, estou migrando para serial. No entanto não existe biblioteca ou sdk para desenvolvimento via serial, tudo tem que ser feito na mão mesmo. Estou utilizando o component Tcomport para comunicar com o leitor mais não tenho obtido nenhuma resposta. Confesso que estou totalmente perdido. O protocolo do leitor é o seguinte:

StartByte|Comand Byte|Param1|Param2|Error/Flag|CheckSum|StopByte

1byte 1byte 4byte 4byte 1byte 1byte 1byte

O inicio do pacote deve ser:

Start code: 1 byte. Indicates the beginning of a packet. 0x40, corresponding to ‘@.’

O final do pacote:

End code: 1 byte. LF (‘\n’, 0x0D). Indicates the end of a packet.

O comado para checar o leitor:

1.Check finger

Code of command|Param1| Param2 |Flag/Error

0x4B 0x00000000 0x00000000 0x00

Check and inform host if there is finger on the scanning window

Return to Host

0x00

Contrast value

0x00000000

0x40 (if finger is)

0x41(if there isn’t finger )

Agora minha duvida, como faço para mandar estes valores para o leitor utilizando o Tcomport??? Já tentei simplesmente escreve-los pelo writeStr, mais não tive nenhum sucesso. Vi um modelo feito em C++, estes valores 0x00, 0x40, 0x4B, etc., são escritos no tipo byte, mais tentei escreve-los como byte, mais o delphi so reconhece o '0' inicial. Tentei como char também, tive o mesmo problema.

Agradeço se alguém puder me ajudar.

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Agora minha duvida, como faço para mandar estes valores para o leitor utilizando o Tcomport???

Veja no final do artigo... vai encontrar o que está precisando

Código fonte do programa RComAccess escrito em DELPHI com funções da API do windows para testar o circuito.

http://www.rogercom.com/PortaSerial/Contro...omAccessAPI.zip

Código fonte do programa RComAccess escrito em DELPHI usando o componente TComport para testar o circuito.

http://www.rogercom.com/PortaSerial/Contro...sComponente.zip

http://www.rogercom.com/PortaSerial/Contro...ontrolePag4.htm

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

blza, obrigado pela ajuda....

Identifiquei meu problema, para enviar os valores hexadecimais em pascal eu deveria enviar $40 ao invés de 0x40, por exemplo. Agora estou com outro problema como tratar os valores recebidos na comport, estou lendo eles como String, mais gostaria de trabalhar com os valores em hexadecimal, sei que posso ler através do Read, ao invés do ReadStr, mais qual o tipo de variavel eu devo usar para armazenar o buffer da serial e como eu posso jogar o valor em um form apenas para visualização???.

procedure TForm1.CPRxChar(Sender: TObject; Count: Integer);

var

S:string;

begin

cp.ReadStr(S, 13);

cp.ClearBuffer(True, True);

memo1.Text:=memo1.Text+S;

end;

end;

Link para o comentário
Compartilhar em outros sites

  • 0

estou lendo eles como String, mais gostaria de trabalhar com os valores em hexadecimal

Use esta função

function StringtoHex(Data: string): string;
var 
  i, i2: Integer;
  s: string;
begin
  i2 := 1;
  for i := 1 to Length(Data) do
  begin
    Inc(i2);
    if i2 = 2 then
    begin
      s  := s + ' ';
      i2 := 1;
    end;
    s := s + IntToHex(Ord(Data[i]), 2);
  end;
  Result := s;
end;
mais qual o tipo de variavel eu devo usar para armazenar o buffer da serial e como eu posso jogar o valor em um form apenas para visualização???.
DWORD represents a four-byte integer.
procedure TForm1.CPRxChar(Sender: TObject; Count: Integer);
var
   S:string;
begin
   cp.ReadStr(S, 13);
   cp.ClearBuffer(True, True);
   memo1.Lines.Append(S);
end;

Para uma melhor compreensão olhe este tutorial

Leitura Bufferizada de Sensores

http://www.maxwellbohr.com.br/downloads/Tu...%20Sensores.pdf

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
O protocolo do leitor é o seguinte:

StartByte|Comand Byte|Param1|Param2|Error/Flag|CheckSum|StopByte

1byte 1byte 4byte 4byte 1byte 1byte 1byte

O inicio do pacote deve ser:

Start code: 1 byte. Indicates the beginning of a packet. 0x40, corresponding to ‘@.’

O final do pacote:

End code: 1 byte. LF (‘\n’, 0x0D). Indicates the end of a packet.

Reisah, este "Start code" corresponde ao StartByte e o "End code" corresponde ao StopByte ou não há necessariamente a relação?

Conforme o caso, seria possível utilizar o componente TComDataPacket associado ao TComPort e usar o evento OnRxBuf. O componente TComDataPacket permite que você identifique strings de início e fim de pacote, facilitando a leitura dos mesmos. Supondo que existam vários pacotes possíveis, bastaria configurar um componente deste para cada pacote, ligá-lo ao único TComPort e usar o evento OnPacket de cada um deles para processar o pacote quando este está completo e pronto para ser processado.

procedure TForm1.CPRxChar(Sender: TObject; Count: Integer);
var
  S:string;
begin
  cp.ReadStr(S, 13);
  cp.ClearBuffer(True, True);
  memo1.Text:=memo1.Text+S;
end;
Dois comentários a respeito a leitura do buffer: 1) Vejo que você fixou o tamanho em 13, mas isto pode não ser correto. Será que você sempre receberá pacotes com 13 caracteres? (está praticamente associada a pergunta inicial) Observe que o correto seria você verificar e/ou usar a quantidade de bytes que está lhe sendo entregue e isto consta no parâmetro Count. Voce não deve correr o risco de ler coisa de menos ou tentar ler coisa de mais. 2) Não estou certo quanto ao funcionamento correto deste processo, uma vez que supostamente a porta poderia retornar algum byte com valor zero no meio da string e, como sabemos, as strings são tratadas normalmente com o zero terminador. Isto resulta que se de 13 bytes o 6º for um zero, sua string a ser concatenada estará incluindo apenas 5 caracteres ao memo e o resto dos bytes recebidos estariam sendo desprezados. Como diga, sugiro que trabalhe com constantes para a identificação dos comandos e status, como por exemplo:
Const
  cmStartCode   = $40;
  cmEndCode     = $0D;
  cmCheckFinger = $4B;
...

ajuda bastante na leitura do código como um todo, já que você os usa no lugar do número.

São coisas para você avaliar. Eu não tenho como fazer qualquer teste com porta serial e os comentários que faço são baseados em experiência passada. Apenas tenha eles em conta quando estiver fazendo seus testes.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia, como faço pra ler todo o conteúdo de retorno do ComTerminal e passar para um Memo?

Estou utilizando o componente ComPort para manipular comandos AT no modem do celular.

Ex:

Eu comando pra ler todas as ligações recebidas, o modem do celular me mostra os dados no HiperTerminal,

daí eu quero pegar esses dados e transferir pra um Memo.

Desde já agradeço.

Editado por geovanepc
Link para o comentário
Compartilhar em outros sites

  • 0

:rolleyes: Problema resolvido.

Estou usando o componente ComPort e seu ComTerminal,

Para ativar a escuta da porta serial e repassar para um Memo,

localize o evento OnStrRecieved do componente ComTerminal e comande:

procedure TForm1.ComTerminal1StrRecieved(Sender: TObject; var Str: String);begin

Memo1.Lines.Append(STR);

end;

Pronto, agora é só testar os comando AT do modem.

procedure TForm1.Button1Click(Sender: TObject);begin

ComPort1.WriteStr('AT+CLAC' + #13#10); // Mostra todos os comandos permitidos pelo celular Motorola V3

end;

Obrigado à todos e um forte abraço.

tive tanto cuidado pra colocar o exemplo, mais não teve jeito, o begin ainda saiu apregado no fim da linha procedure.

rsrsrsrsrs.

Link para o comentário
Compartilhar em outros sites

  • 0

Pra quem estiver precisando do componente ou apenas por curiosidade, segue o link pra baixá-lo, inclusive um tutorial de como instalar.

O componente para porta serial – TcomPort, pode ser baixado na página www.jclima.tk. Estando na página principal, selecione o link para a página downloads. Selecione então o link componentes (Biblioteca TComPort) na sessão “Minicurso de Delphi”. Crie então o diretório: C:\Programs Files\Borland\Delphi7\Components\PortaSerial e salve o arquivo comprimido (Serial.zip) neste diretório. Descomprima então este arquivo.

O restante está no tutorial.

Um forte abraço à todos.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...