Página 1 de 4
LER CÓDIGO DE BARRAS DIRETO DO SCANNER NA SERIAL
Enviado: 30 Jul 2007 19:04
por rubens
Olá... pessoal
alguem tem alguma rotina que faça isso...
Uso o arquivo serial.exe baixado do site da sweda, o leitor é um psc 2200vs... quando estava com o DOS funcionava belezinha sem problemas... mas tive que instalar uma placa pci serial, e tava dando conflito no dos... daí instalei o wixp e resolveu o problema da placa mas ocasionou o erro no scanner... colocando o comando serial com1:9600,n,8,2 cr no prompt dos dos, e passando um codigo de barras no leitor... consegue fazer a leitura mas quando entra no programa nao consegue.. e funcionava perfeito no win98... entao imagino que seja erro do programa serial.exe com o winxp... o windows 98 se nao reservasse a irq4 tb, nao lia... no windows xp nao sei como reservar a irq.. tb..
Alguem ai pode dar uma ajuda...
Rubens
Enviado: 30 Jul 2007 19:11
por Maligno
Não sei se ajuda, mas você pode ir às "propriedades" do "meu computador", selecionar a "hardware" e clicar no botão "gerenciador de dispositivos". Encontre a serial e na "propriedades" da porta, tentar configurar a comunicação. Se não der por aí, deixo outra dica: procure no Google por algum programa que possa substituir esse que você está usando.
Outra dica: instale um programa de monitoramento de serial, como este
aqui, que é excelente. Tente bisbilhotar o que a serial está recebendo, se é que está recebendo alguma coisa.

Enviado: 30 Jul 2007 19:14
por rubens
Maligno... fiz mais uns teste depois que postei aqui.. e percebi que para de ler o scanner depois que entra no programa... que tem fgl e ctp.lib e etc... Agora pensando aqui... nao testei nenhum programa puro para ver como se comporta.. só que agora nao dá mais só amanha porque o leitor fica no cliente.. amanha de manha farei este teste...
Obrigado
Enviado: 30 Jul 2007 19:22
por Maligno
Ah, difícil ter alguma coisa no programa que impeça a leitura da serial. Até porque, imagino eu, este programa "serial.exe" deve ser residente. É só executar o bixo e em seguida executar o programa Clipper. Deveria funcionar.
Mas tente amanhã. Se não der e quiser trocar alguma idéia, é só dizer.
Enviado: 31 Jul 2007 08:03
por rubens
Eu montei uma rotina, ainda nao deu para testar to postando ela aqui para voce dar uma olhada.
cCodigo := Space(13)
@ 10,10 say "Codigo:" GET cCodigo Valid LER_SCANNER(@cCodigo)
Read
//------------------------------------------------------------------------
Function LER_SCANNER()
Local nPorta := 1
Local cTrans := "N"
Local nBits := 8
Local nParad := 1
Local nVeloc := 9600
Local Retorno:= .T.
// Abrindo a porta
If Com_Open(nPorta,1024,1024) == .F.
Retorno := .T.
Else
// Inicializando a porta
nConf := Com_Init(nPorta,nVeloc,cTrans,nBits,nParad)
// Verificando dados na leitor
Com_Count(nPorta)
Inkey(0.10)
// Lendo dados do leitor
cCodigo := Com_read(nPorta,10)
// Tratando a vari vel
Com_Close(nPorta)
Endif
If !Retorno
BEEP()
ALERT("NAO FOI POSSIVEL LER O CODIGO DE BARRAS !!! TENTE NOVAMENTE...")
cCodigo := Space(13)
Endif
KEYBOARD CHR(13)
Return(Retorno)
O seguinte: é necessário fechar a porta depois de ler o codigo??? não poderia deixar ela aberta efechar somente quando finalizar o cupom??
Com esse abre e fecha nao pode atrasar o programa, deixa-lo mais lento??
O procedimento correto seria esse valid mesmo no get... ?
Rubens
Enviado: 31 Jul 2007 09:47
por Pablo César
Puxa... leitor de código de barras serial. Nunca trabalhei, penso que sendo serial complica um pouco, melhor teria sido aquele leitor que é ligado ao teclado. Sem dúvida essa é a melhor opção.
Mas pela lógica está me parecendo que não seria o VALID que deves usar e sim o WHEN. E a sua função de capturar os dados pela serial deveria ser implementada um tamanho fixo de caracteres a seremcapturados, porque pelo que eu sei essa captura após chegar o atamnho de caracteres deveria dar um KEYBOARD <conteúdo_capturado> e retornando .T. se o tamanho é o correto ou .F. se não conseguiu capturar nada. A saída desse GET deveria ser .T. quando pressionado <ESC> e tratar após o READ a sua saída do módulo de registro de compras.
Enviado: 31 Jul 2007 09:47
por rubens
Esse exemplo acima nao funciona porque o scanner tem que ativar, indicar para o programa que leu alguma coisa...
fiz uma rotina simples somente lendo o codigo, sem bibliotecas e com o programa residente, e consegue ler alguns codigos, outros nao... demora muito na leitura...
Problema no scanner nao é porque com o win98 funcionava redondinho... e no prompt do dos (wnxp) quando carrega o driver e passa os codigos ele lê também...
Vou formatar outro computador novo, pra fazer outro teste...
Enviado: 31 Jul 2007 09:52
por Pablo César
Rubens, coincidiu nós dois postarmos no mesmo minuto as nossas mensagens. Você leia, minha mensagem antes de formatar, talvez o que eu falei te ajude.
Enviado: 31 Jul 2007 10:07
por rubens
Pablo...
Li a sua sugestão e tentei materializar isso... aí me surgiu dois problemas... se eu forçar a entrada de um numero x de carateres, pode dar problemas porque nem todo codigo de barras tem 13caracteres.. tipo perfumaria, em especifico aquele rolon... tem sete ou oito codigos se nao me engano entao a resposta do leitor seria 78910012, ou algo assim.. desse jeito ficaria num loop infinito ou pegaria parte do outro codigo passado... e tem tambem os produtos por peso ou produtos por codigo regional que nao passa na balanca e nao gera codigo de barra... imagina o cliente vai na secao de verduras pega 1 kg de tomate e nao passa na balanca.. vai direto para o caixa.. daí lê o peso e tem que digitar o codigo, com essa clausual when ele nao deixaria fazer isso.. certo...
No ng da catools.. tem um modelo contatem do que esta na porta...
Do while Com_count(1) > 13
Enddo
Seria mais ou menos isso que voce sugeriu?
e o get ficaria
@ 10,10 say "Codigo" Get Ccodigo when Ler_Scanner(@Ccodigo)
Enviado: 31 Jul 2007 10:19
por Pablo César
Eu acho que deixar o tamanho para item FIXO, seria o conveniente mais ainda pela razão que você quer digitalizar peso de produto. As etiquetas são impressas pelo seu sistema ?. Se for, você simplesmente manda gravar o código de barras com STRZERO() para prencher com zeros. E nos casos de peso, você terá um GET próprio para trtar o peso. Então você estipularia o tamanho com as casas decimais de acordo peso maior possível.
Eu acho que tem que ter um limite de leitura senão como o sistema irá saber quando retornar ao GET ?. Eu nãoestou tão seguro do que eu estou propondo, ora porque não sei como está se comportando a leitura do scanner. Me diga, quando é pressionado o botão do leitor, emite algum som ?. Você conseguiu ler o conteúdo através da função READ da LIB ?. Nesse caso como veio a string ? Podias dar exemplo ?
Outra questão que eu mencionei e você não disse nada sobre isso: daria para trocar esse leitor por aquele tipo de leitor que é conectado ao teclado do PC ?
Enviado: 31 Jul 2007 10:23
por rubens
Quanto a trocar o leitor pelo de teclado acho que está fora de questão.. é mais fácil o cliente trocar o meu programa do que comprar outro leitor... hehe
A leitura do leitor fixo serial é diferente do leitor de mao... nao tem que apertar nada só passa o produto... e ele lê aí tem que ter um driver residente que captura o que ele leu e bufferiza.. ou o programa faz isso.. aí entra a questão que te falei.. para o programa ler o que foi lido pelo scanner ele vai ter que sempre estar monitorando a porta.... isso nao sei fazer e o driver residente do leitor está dando pau com o windows xp...
Enviado: 31 Jul 2007 10:35
por Pablo César
Ahhh sim entendí, não é leitor de mão. Então a questão de trocar está fora mesmo (sorry). Acredito que para fazer a leitura e capturar a bufferização terá que fazé-lo em looping então. A questão do tamanho, terá que ser como te disse. Pois senão estará sujeito a que um peso venha a coincidir com o código de algum produto. Lembre que 123 não é o mesmo que 0000000000123. Daí se tiver algo com respeito ao peso, terás que disponibilizar uma telca de função (digamos) para alternar outro GET que só permita peso (com tamanho limitado também).
O exemplo que você tentou, conseguiu algum resultado ?. Você disse "demora muito na leitura" será que não seria esse caso de ter que dar um ENTER para ver o código capturado ?. Se for isso o WHEN irá resolver, mas coloque um limite para ler e retornar ao GET. Você monitorou o conteúdo lido pela função da LIB ?
Enviado: 31 Jul 2007 11:17
por Maligno
como o sistema irá saber quando retornar ao GET ?
Cada código de barras, e eu imagino que ele trabalhe com EAN13 e EAN8, pode ser configurado para ser um prefixo ou sufixo. Tenho um aqui que posso colocar até 6 seqüências quaisquer e em quaisquer posições dos códigos. Normalmente os códigos já vêm com Chr(13) no final. Daí é fácil descobrir quando o código "acabou". Esses código extras são configurados por uma série de tabelas de barras especiais.
Aliás, o fato do leitor ser de mão não implica em nada, pois o modêlo do meu leitor poderia ter vindo serial. Mas eu preferi do tipo teclado. Ele também pode ser configurado para atuar sem gatilho. Portanto, a questão é o programa serial, que automaticamente deve receber os códigos e inserí-los no buffer do teclado.
Enviado: 31 Jul 2007 11:22
por Maligno
o driver residente do leitor está dando pau com o windows xp
Você tentou descolar algum outro programa serial para fazer funcionar no Window XP?
Enviado: 31 Jul 2007 11:22
por Pablo César
Normalmente os códigos já vêm com Chr(13) no final.
Ahhh pois é essa a incerteza que eu tenho quanto a isso. Por isso eu estava pedindo que colocasse o conteúdo capturado. pois se tiver CHR(13), com certeza já com isso iria funcionar. E quanto ao tamanho ou padrão, acho que aquele leitor de supermercado, trabalho com vários tipos.