Leitor de Cod Barras
22/09/2004
0
Tap_pedroso
Posts
22/09/2004
Aroldo Zanela
Veja no site do colega Cirilo: www.veloso.kit.net
23/09/2004
Dopi
Estou escrevendo uma biblioteca de componentes para Automação comercial, OpenSource e Multiplataforma (veja na minha assinatura)
Se quiser testar o componente posso enviar para o seu e-mail....
23/09/2004
Tap_pedroso
outro detalhe eu peguei o comp serialNG é +ou - igual ao ASync32 a única diferença é que ele não grava na porta serial eu achei o serialNG melhor mas o problema é que ele traz uns caracteres estranhos mas eu usei o leftstr e rightstr para contornar isso e o outro problema é que o leitor não pressiona o enter (não dá o evento onkeypress) e não dando o enter ele não dá o beep vcs conhecem alguma propriedade do comp. que faz isso.
23/09/2004
Dopi
O componente que vou mandar para voce usa uma classe chamada SynaSer para acesso direto a porta serial....
http://www.ararat.cz/synapse/
Como a classe é uma das propriedades do Componente que estou criando (ACBrLCB) não será necessário instalar nenhum outro componente para acesso a Serial....
A grande vantagem da synaser é que ela é multiplataforma (roda no Linux), consequentemente, todos os componentes do ACBr também rodam no Linux...
23/09/2004
Dopi
O Hiperterminal é um antigo programa para comunicação com BBS usando modem. ele vem com a instalação do Win98 (no XP eu nao sei).
É so configurar a porta serial, que os códigos lidos irão aparecer no prompt do Hiperterminal....
23/09/2004
Tap_pedroso
23/09/2004
Dopi
Como a synaser é somente uma classe e nao um componente, não há necessidade de instalar, apenas copie os arquivos .PAS para um diretorio do seu pathlib ou pra dentro do diretorio seu projeto e insira um [b:48f9544fe7]uses synaser[/b:48f9544fe7] na sua unit
Veja esse exmplo de como criar uma conexão serial (extraido no Help da Synaser)
var ser : TBlockSerial begin ser:=TBlockSerial.Create; try ser.Connect(´COM3´ ); ser.config(460800,8,´N´ ,0,false,true); ser.ATCommand(´AT´ ); if (ser.LastError <> 0) or (not ser.ATResult) then Exit; ser.ATConnect(´ATDT+420971200111´ ); if (ser.LastError <> 0) or (not ser.ATResult) then Exit; // you are now connected to a modem at +420971200111 // you can transmit or receive data now finally ser.free; end
23/09/2004
Tap_pedroso
23/09/2004
Dopi
Lembre-se que a programação Windows é focada em ´eventos´. Voce terá que criar um evento que seja disparado toda vez que um código for lido. Com a synaser isso pode ser feito programando o evendo OnStatus e verificar se a variavel Reason é HR_CanRead.
procedure TACBrLCB.HookSerial(Sender: TObject; Reason: THookSerialReason; const Value: string); var leitura : String ; begin if Reason = HR_CanRead then begin { faça sua leitura aqui } end; end;
O fato da synaser não ser um componente dificulta um pouco a programação de eventos... mas é só criar uma procedure com os parametros corretos e atribui-la ao Onstatus:
defina no private do seu form:
procedure HookSerial(Sender: TObject; Reason: THookSerialReason; const Value: string);
crie o código para a procedure como descrito acima, e logo apos criar o TBlockSerial programa o OnStatus...
serial.OnStatus := HookSerial ;
Isso fará que a procedure HookSerial seja chamada cada vez que um código seja lido.... Ai voce pode inserir o resultado da leitura no Text do seu Edit e disparar algum evento de Busca do produto...
23/09/2004
Aroldo Zanela
Colega,
Verifique no manual de configuração/programação de sua leitora, pois isso pode ser programado no leitor, ou seja, o próprio leitor envia o enter.
Abaixo, um fragmento de código que utilizo num sistema antigo (bem antigo - Delphi 4 + Asyn32 + Leitora Serial de Mesa ) de supermercado:
procedure TfrmCaixa_Sweda.PortaSerialRxChar(Sender: TObject; Count: Integer); type CharBuf = Array[ 0..9999 ] of char; var Buffer: ^CharBuf; Bytes, P: Integer; Begin GetMem( Buffer, PortaSerial.ReadBufSize ); try FillChar( Buffer^, PortaSerial.ReadBufSize, 0 ); Bytes := PortaSerial.Read( Buffer^, Count ); If Bytes = -1 Then ShowMessage( ´Erro de leirura nos dados de entrada...´ ) Else Begin For P := 0 to Bytes -1 do Begin Case Buffer^[P] of 0, 10:; 13: Begin PassarItem( LineData ); // Envia o código EAN-13 LineData := ´´; rxQtde.Value:= 1; End; Else Begin LineData := LineData + CharBuf( Buffer^)[P]; End; End; End; End; Application.ProcessMessages; Finally FreeMem( Buffer ); end; End;
27/09/2004
Dopi
Ainda estou trabalhando no componente. Estou testando se o uso de uma Thread fica melhor que um Timer interno...
Também elaborei um emulador de Leitores Cod.Barras Serial, que envia Strings (códigos) pela Serial. Útil se você não tem acesso a um leitor de verdade... Apenas ligue uma serial na outra, configure o Emulador para COM2 e o Programa de teste para COM1....
28/09/2004
Tap_pedroso
while ini > 0 do
begin
Result := Result + 1 ;
[b:1a40c5f671] ini := PosEx( SubStr, AString, ini + 1 ) ;[/b:1a40c5f671]
end ;
o que devo fazer?
28/09/2004
Dopi
Conforme e-mail que você me mandou, notei que você usa Delphi 6. Pode ser que o Delphi 6 não possua essa Funçao, ou ela esteja em outra unit que nao seja a StrUtils....
Entretanto, vou modificar o fonte para nao precisar mais da PosEx....
Volto a mandar novo e-mail para voce.... com o ACBr
28/09/2004
Aroldo Zanela
A função PosEx esta disponível a partir do Delphi 7:
function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer; var Tmp: PChar; begin Result := 0; if (Offset > Cardinal(Length(S))) then exit; if Offset = 1 then Result := Pos(SubStr, S) else begin Tmp := StrPos(PChar(@S[Offset]), PChar(SubStr)); if Tmp = nil then exit; Result := Cardinal(Tmp - PChar(@S[Offset])) + Offset; end; end;
28/09/2004
Leandro Amorim
Olá Dopi! Estou com a seguinte necessidade: Tenho um leitor de código de barras (serial) sem driver, sem nada! Preciso de um programa que fique ´varrendo´ a COM1 e ´pegue´ o conteúdo do código de barras e joque onde o cursor estiver (não importa o programa). Isto é possível?
Muito Obrigado
Clique aqui para fazer login e interagir na Comunidade :)