Leitor Código de Barras Serial on Linux

719 views
Skip to first unread message

Uhilian Djeimen Finger

unread,
Jun 2, 2011, 9:15:55 AM6/2/11
to
Olá Amigos!
Seguinte, tenho um scanner (leitor de código de barras) serial Spectra Physis VS1200.
Preciso jogar o código de barras (lido pelo scpectra), onde estiver o foco do cursor, seja no terminal ou em qualquer aplicativo.

Acredito que deva ser um script que rode em background lendo a portal serial e assim que algum código de barras for "scaneado", jogue-o onde o curso estiver focado.

Alguém conhece e pode me ajudar?

PS: No RWindows XP  ele opera nos seguintes passos COM1: speed 9600,Parity n, Bits 8, StopBits 1, Flow Control p.

Obrigado desde já!
Abs

Everton Cardoso

unread,
Jun 2, 2011, 6:21:21 PM6/2/11
to tche...@googlegroups.com
Amigo compra um USB...

Bati tanta cabeça com o stoq uma vez que foi muito melhor comprar outro... ainda mais que se eu insistisse em ficar no serial teria muitos problemas depois para migrar, por hoje não ter mais tanto ferro compatível.

Qualquer 50 contos tu acha..

Só lembrando que leitor de código de barras é quase um teclado... então segue a mesma linha pra um e pra outro.

--
Mensagem enviada para <http://groups.google.com/group/tchelinux>.
Regras de Conduta para o grupo: <http://tchelinux.org/regras>.

Uhilian Djeimen Finger

unread,
Jun 3, 2011, 6:50:23 AM6/3/11
to tche...@googlegroups.com
Olá Everton!
Se fosse só um, beleza...
Problema que são muitos, de muitos supermercados e lojas agropecuárias.
Eu não posso descartar eles, ainda funcionando.
Ainda mais que temos ordens de economizar onde for possível.

Eu consegui ler o código de barras da porta serial perfeitamente.

Com o simples comando "cat /dev/ttyS0 :9600,n,8,1" ou "cat /dev/ttyS0".
Assim eu jogo ele no terminal...

Agora vou ter de fazer um script para que o cat jogue o código de barras na posição(foco) do cursor, independente
da tela ou aplicativo que esteja sendo executado.

Alguém tem uma idéia de como eu poderia fazer isso?
 Eu imagino tipo um "cat /dev/ttyS0 > /dev/xxx"

Obrigadooo 

Daniel Veloso

unread,
Jun 3, 2011, 8:36:35 AM6/3/11
to tche...@googlegroups.com
Tche.

No dealextreme tem conversor de usb para serial por U$ 1.99 =D

Fabio Olive Leite

unread,
Jun 3, 2011, 9:11:07 AM6/3/11
to tche...@googlegroups.com
Olá!

On 2011-06-03 Daniel Veloso wrote:
>
> No dealextreme tem conversor de usb para serial por U$ 1.99 =D

Ainda assim, o conversor vai se apresentar pro sistema como uma porta
serial, e não um teclado. Os leitores de código de barras USB funcionam
muito mais fácil exatamente por se apresentarem como teclados e
simularem a digitação do código lido. Assim o console e o X verão os
keycodes e tudo fica fácil.

No caso do leitor serial, alguma coisa tem que ler os códigos e inserir
no buffer do teclado, para que o console ou o X os interpretem como
keycodes.

Googlando por "serial barcode reader linux" eu achei alguns programas
velhos, como linbar, e um que aparenta ser mais novo, chamado
softwedge. Acho que o Uhilian vai ter que dar uma fuçada neles e
reportar aqui qual funcionou. :)

--
[[ Fábio Olivé Leite, olive, FabioOlive ]]
TcheLinux.org, OeSC-Livre.org, Chapecó, SC
ex sed lex awk yacc, e pluribus unix, amem

Uhilian Djeimen Finger

unread,
Jun 3, 2011, 9:49:15 AM6/3/11
to tche...@googlegroups.com
Olá Fábio!
Boa...Obrigado!
Vou pesquisar sim...

Só retificando...
O fato de ler os códigos da serial, está ok...

Agora preciso direcionar o resultado(código lido) para o buffer do teclado(como você escreveu). 
Ou seja, quero que o código de barras apareça no aplicativo que o cursor estiver posicionado(seja no gedit, no nosso ERP ou no nosso PAF-ECF).

Eu gostaria de fazer um shell script que rodasse como daemon na inicialização e toda vez que um código de barras fosse lido, ele jogasse o código de barras onde o cursor estiver focado, ou seja, no sistema que o usuário estiver utilizando.


Vou testar os programas que você passou Fábio e volto com o resultado..

Obrigado
Abraços

BarCode-Reader.png



BarCode-Reader.png

Vinicius Mello

unread,
Jun 3, 2011, 11:23:11 AM6/3/11
to tche...@googlegroups.com
On 06/03/2011 07:50 AM, Uhilian Djeimen Finger wrote:
> Agora vou ter de fazer um script para que o cat jogue o c�digo de barras
> na posi��o(foco) do cursor, independente

> da tela ou aplicativo que esteja sendo executado.
>
> Algu�m tem uma id�ia de como eu poderia fazer isso?

> Eu imagino tipo um "cat /dev/ttyS0 > /dev/xxx"

Ol� Uhilian,

Dependendo de como o teu programa funciona, o /dev/xxx poderia ser um
named pipe. D� uma olhada no comando mkpipe e na documenta��o sobre como
funcionam os named pipes.
http://beej.us/guide/bgipc/output/html/multipage/fifos.html


Sds,
vmm.

Leandro - ProfessionalIT

unread,
Jun 4, 2011, 2:57:58 PM6/4/11
to TcheLinux
Oi Uhilian,

Interessante, tu terias maiores informações para passar sobre este
teu ERP / PAF-ECF ? pode ser em PVT, pois tenho interesse.

Um abraço,
Leandro.

On 3 jun, 10:49, Uhilian Djeimen Finger <uhilian.fin...@gmail.com>
wrote:
> Olá Fábio!
> Boa...Obrigado!
> Vou pesquisar sim...
>
> Só retificando...
> O fato de ler os códigos da serial, está ok...
>
> Agora preciso direcionar o resultado(código lido) para o buffer do
> teclado(como você escreveu).
> Ou seja, quero que o código de barras apareça no aplicativo que o cursor
> estiver posicionado(seja no gedit, no nosso ERP ou no nosso PAF-ECF).
>
> Eu gostaria de fazer um shell script que rodasse como daemon na
> inicialização e toda vez que um código de barras fosse lido, ele jogasse o
> código de barras onde o cursor estiver focado, ou seja, no sistema que o
> usuário estiver utilizando.
>
> Vou testar os programas que você passou Fábio e volto com o resultado..
>
> Obrigado
> Abraços
>
> [image: BarCode-Reader.png]
>
> Em 3 de junho de 2011 10:11, Fabio Olive Leite <fabio.ol...@gmail.com>escreveu:
>
>
>
>
>
>
>
> > Olá!
>
> > On 2011-06-03 Daniel Veloso wrote:
>
> > > No dealextreme tem conversor de usb para serial por U$ 1.99 =D
>
> > Ainda assim, o conversor vai se apresentar pro sistema como uma porta
> > serial, e não um teclado. Os leitores de código de barras USB funcionam
> > muito mais fácil exatamente por se apresentarem como teclados e
> > simularem a digitação do código lido. Assim o console e o X verão os
> > keycodes e tudo fica fácil.
>
> > No caso do leitor serial, alguma coisa tem que ler os códigos e inserir
> > no buffer do teclado, para que o console ou o X os interpretem como
> > keycodes.
>
> > Googlando por "serial barcode reader linux" eu achei alguns programas
> > velhos, como linbar, e um que aparenta ser mais novo, chamado
> > softwedge. Acho que o Uhilian vai ter que dar uma fuçada neles e
> > reportar aqui qual funcionou. :)
>
> > --
> > [[ Fábio Olivé Leite, olive, FabioOlive ]]
> > TcheLinux.org, OeSC-Livre.org, Chapecó, SC
> > ex sed lex awk yacc, e pluribus unix, amem
>
> > --
> > Mensagem enviada para <http://groups.google.com/group/tchelinux>.
> > Regras de Conduta para o grupo: <http://tchelinux.org/regras>.
>
>
>
>  BarCode-Reader.png
> 418KExibirDownload

Christiano F. Haesbaert

unread,
Jun 5, 2011, 12:18:26 PM6/5/11
to tche...@googlegroups.com
cat /dev/ttyS0 :9600,n,8,1 > /dev/stdin

voila.

Fabio Olive Leite

unread,
Jun 6, 2011, 8:53:02 AM6/6/11
to tche...@googlegroups.com
Olá!

On 2011-06-05 Christiano F. Haesbaert wrote:
> cat /dev/ttyS0 :9600,n,8,1 > /dev/stdin

Hmmm isso está errado, pois o cat vai simplesmente escrever o que vier
da serial no stdin dele mesmo (provavelmente o terminal onde tu rodou o
comando). Mas isso vai escrever como se fosse saída, e não como se
fosse entrada pelo teclado.

$ ls -l /dev/stdin
lrwxrwxrwx. 1 root root 15 Jun 6 08:57 /dev/stdin -> /proc/self/fd/0

Pra inserir no buffer do teclado, como se o kernel tivesse lido de um
teclado físico, tem que se usar o ioctl TIOCSTI, mas mesmo esse insere
só no terminal em que foi executado. Pra inserir no X é diferente.

Talvez seja até mais fácil fazer um programa que fique lendo na serial
e copie pro clipboard do X, e aí a pessoa só precisa escanear o código
e apertar Ctrl+V onde quiser.

Abraço!

Uhilian Djeimen Finger

unread,
Jun 6, 2011, 9:07:31 AM6/6/11
to tche...@googlegroups.com
Realmente Fábio, o   cat /dev/ttyS0 :9600,n,8,1 > /dev/stdin joga no mesmo terminal.
A opção de jogar no clipboard do X é uma boa, ainda vou continuar tentando, mas se realmente não tiver como, vou aderir
a sua sugestão.

Baixei o softwedge estou tendo uns probleminhas com ele(isso ainda vai me tomar um certo tempo).
No caso do Linbar, encontrei várias paginas apontando para o mesmo link de download  ftp://argeas.cs-net.gr/Linux/linbar/linbar.tar.gz que no caso não possui mais o arquivo.

Abs




--

Fabio Olive Leite

unread,
Jun 6, 2011, 9:33:32 AM6/6/11
to tche...@googlegroups.com
Opa!

On 2011-06-06 Uhilian Djeimen Finger wrote:
> A opção de jogar no clipboard do X é uma boa, ainda vou continuar
> tentando, mas se realmente não tiver como, vou aderir
> a sua sugestão.

Tava quase escrevendo um programa simples em python pra fazer isso,
quando achei o comando xsel, que manipula o selection e clipboard
buffer do X. Tenta rodar esse comando em um terminal:

xsel -b -i < /dev/ttyS0

E depois escaneia algum código e aperta Ctrl+V em um editor gráfico
como o gedit. De repente só isso já resolve o que tu precisa. :)

Uhilian Djeimen Finger

unread,
Jun 6, 2011, 9:18:51 AM6/6/11
to tche...@googlegroups.com
Encontrei o Linbar-0.4

;)

Testando!

Fabio Olive Leite

unread,
Jun 6, 2011, 9:44:03 AM6/6/11
to tche...@googlegroups.com
On 2011-06-06 Uhilian Djeimen Finger wrote:
> Encontrei o Linbar-0.4
> Testando!

Acho que vale mais a pena testares o xsel mesmo! Eu testei aqui usando
um named pipe ao invés da serial, e funcionou bem certinho. O que eu
escrevo no pipe vai parar no clipboard imediatamente, é só dar Ctrl+V
onde quiser.

Felipe Ghellar

unread,
Jun 6, 2011, 10:29:17 AM6/6/11
to tche...@googlegroups.com
Buenas!

Nesta mensagem tem um relato de um usuário com um problema bem parecido:

http://lkml.indiana.edu/hypermail/linux/kernel/0612.3/0400.html

A discussão é de dezembro de 2006, mas talvez o problema ainda exista.
Algumas sugestões que aparecem na mensagem e nas respostas são o inputattach
e o kbde:

https://wiki.archlinux.org/index.php/Serial_input_device_to_kernel_input

http://kbde.sourceforge.net/

Talvez um deles ajude a resolver o problema.

T+
Felipe

Christiano F. Haesbaert

unread,
Jun 6, 2011, 10:44:03 AM6/6/11
to tche...@googlegroups.com
2011/6/6 Fabio Olive Leite <fabio...@gmail.com>:

> Olá!
>
> On 2011-06-05 Christiano F. Haesbaert wrote:
>> cat /dev/ttyS0 :9600,n,8,1 > /dev/stdin
>
> Hmmm isso está errado, pois o cat vai simplesmente escrever o que vier
> da serial no stdin dele mesmo (provavelmente o terminal onde tu rodou o
> comando). Mas isso vai escrever como se fosse saída, e não como se
> fosse entrada pelo teclado.
>
> $ ls -l /dev/stdin
> lrwxrwxrwx. 1 root root 15 Jun  6 08:57 /dev/stdin -> /proc/self/fd/0
>
> Pra inserir no buffer do teclado, como se o kernel tivesse lido de um
> teclado físico, tem que se usar o ioctl TIOCSTI, mas mesmo esse insere
> só no terminal em que foi executado. Pra inserir no X é diferente.
>
> Talvez seja até mais fácil fazer um programa que fique lendo na serial
> e copie pro clipboard do X, e aí a pessoa só precisa escanear o código
> e apertar Ctrl+V onde quiser.
>
> Abraço!
>

Hmmm fato, mas e se tu ficar "abrindo" e lendo de tempos em tempos ?
Pra pegar a stdin do processo corrente ?
Bom agora ja estou chutando, não sei como funciona os /proc/self

Uhilian Djeimen Finger

unread,
Jun 6, 2011, 10:47:18 AM6/6/11
to tche...@googlegroups.com
Gostei do xsel Fábio...
Mas ele não está capturando o valor da da serial!
Muito estranho.
Fiz o seguinde :

cat /dev/ttyS0 > barcode  #Gerou um arquivo com o código de barras

xsel -b -i < barcode #Inseriu o código de barras no clipboard 

E posso colar o código de barras em qualquer lugar.

Estranho, xsel -b -i < /dev/ttyS0 não captura o código de barras.




Fabio Olive Leite

unread,
Jun 6, 2011, 12:54:19 PM6/6/11
to tche...@googlegroups.com
On 2011-06-06 Uhilian Djeimen Finger wrote:
> Gostei do xsel Fábio...
> Mas ele não está capturando o valor da da serial!

Estranho mesmo. Acho que ele não é feito para ficar lendo em loop.

> cat /dev/ttyS0 > barcode #Gerou um arquivo com o código de barras

Diz uma coisa, quando tu rodou esse comando e depois clicou no leitor
de código de barras, o cat terminou sozinho, ou tu teve que interromper?

Se tu rodares algo assim e ler um código...

cat /dev/ttyS0 :9600,n,8,1 | hexdump -C

... ele termina sozinho e volta pro prompt do shell? E por curiosidade,
tens como postar o resultado desse comando acima aqui? :)

Talvez se possa fazer um script para ler simplesmente usando:

while :; do
cod=$(cat /dev/ttyS0 :9600,n,8,1)
# echo $cod # debug ;-)
echo $cod | xsel -b -i
done

Abraço!

Uhilian Djeimen Finger

unread,
Jun 6, 2011, 1:59:31 PM6/6/11
to tche...@googlegroups.com
Em 6 de junho de 2011 13:54, Fabio Olive Leite <fabio...@gmail.com> escreveu:
On 2011-06-06 Uhilian Djeimen Finger wrote:
> Gostei do xsel Fábio...
> Mas ele não está capturando o valor da da serial!

Estranho mesmo. Acho que ele não é feito para ficar lendo em loop.

> cat /dev/ttyS0 > barcode  #Gerou um arquivo com o código de barras

Diz uma coisa, quando tu rodou esse comando e depois clicou no leitor
de código de barras, o cat terminou sozinho, ou tu teve que interromper?


Não precisei interromper, ele terminou sozinho assim que rodei o comando. Então fiz o script abaixo, e ele não interrompeu mais:
#!/bin/bash
cat /dev/ttyS0 > barcode

Em outro terminal (ou depois de encerrar o comando anterior) dei o comando 
xsel -b -i < barcode

Assim posso dar CTRL+V em qualquer lugar, pois o código de barras está no clippboard.


 
Se tu rodares algo assim e ler um código...

cat /dev/ttyS0 :9600,n,8,1 | hexdump -C

... ele termina sozinho e volta pro prompt do shell? E por curiosidade,
tens como postar o resultado desse comando acima aqui? :)

Ele não termina sozinho, fica em loop no cat, aparecendo os resultados após cada vez que é scaneado.
 

Tive de scanear o código 2 vezes para aparecer o resultado abaixo!
 
root@ET-01-004:~# cat /dev/ttyS0 :9600,n,8,1 | hexdump -C
00000000  37 38 39 31 30 32 31 30  30 32 31 32 37 0a 37 38  |7891021002127.78|
 
Talvez se possa fazer um script para ler simplesmente usando:

while :; do
       cod=$(cat /dev/ttyS0 :9600,n,8,1)
       # echo $cod # debug ;-)
       echo $cod | xsel -b -i
done

Ao rodar o script, ele fica parado no shell e não manda o código para o clippboard depois de scaneado.
Eu acredito que o problema seja com o comando cat, o processo fica parado nesta parte.
Rodei até no debug (hehe)... A variavel $cod não recebeu o resultado do cat /dev/ttyS0 :9600,n,8,1

Abs


 
Abraço!

--
[[ Fábio Olivé Leite, olive, FabioOlive ]]
TcheLinux.org, OeSC-Livre.org, Chapecó, SC
ex sed lex awk yacc, e pluribus unix, amem

Fabio Olive Leite

unread,
Jun 6, 2011, 2:19:49 PM6/6/11
to tche...@googlegroups.com
Opa!

On 2011-06-06 Uhilian Djeimen Finger wrote:
> Ele não termina sozinho, fica em loop no cat, aparecendo os
> resultados após cada vez que é scaneado.

Hmm ok, então temos que quebrar ele a cada linha. Tente esse script
agora:

while :; do
read cod
echo Lido: $cod


echo $cod | xsel -b -i

done < /dev/ttyS0

Acho que esse vai ficar bala. :) O "echo Lido: $cod" é "debug" e podes
remover quando estiver em produção.

> Tive de scanear o código 2 vezes para aparecer o resultado abaixo!
>
> root@ET-01-004:~# cat /dev/ttyS0 :9600,n,8,1 | hexdump -C
> 00000000 37 38 39 31 30 32 31 30 30 32 31 32 37 0a 37 38
> |7891021002127.78|

Sim, dá pra ver que ele manda o código e um \n (0x0a), e o hexdump
ficou esperando pra completar a linha de 16 bytes. :)

Uhilian Djeimen Finger

unread,
Jun 6, 2011, 3:00:07 PM6/6/11
to tche...@googlegroups.com
Perfeito Fábio!
Funcionou!

Vou mudar um pouco o script para não imprimir o resultado no terminal, e deixar ele rodando na inicialização do sistema como daemon.

Agora é só fazer alguns usuários(xaropes) aceitar o fato de dar CTRL-V para scanear...

Muito Obrigado

Abraços



Fabio Olive Leite

unread,
Jun 6, 2011, 3:42:55 PM6/6/11
to tche...@googlegroups.com
Olá!

On 2011-06-06 Uhilian Djeimen Finger wrote:

> Perfeito Fábio!
> Funcionou!

Massa! TcheLinux++ :)

> Vou mudar um pouco o script para não imprimir o resultado no
> terminal, e deixar ele rodando na inicialização do sistema como
> daemon.

Na verdade ele não vai funcionar na inicialização do sistema, pois ele
precisa rodar na sessão gráfica do usuário depois que ele já foi
autenticado, para que o xsel possa manipular o clipboard. Mas podes
colocar de alguma forma na inicialização da sessão do usuário, ou
colocar um ícone do tipo "Inicia Scanner" na barra do gnome/kde/sei lá.

Uhilian Djeimen Finger

unread,
Jun 6, 2011, 3:57:19 PM6/6/11
to tche...@googlegroups.com
Em 6 de junho de 2011 16:42, Fabio Olive Leite <fabio...@gmail.com> escreveu:
Olá!

On 2011-06-06 Uhilian Djeimen Finger wrote:
> Perfeito Fábio!
> Funcionou!

Massa! TcheLinux++ :)

> Vou mudar um pouco o script para não imprimir o resultado no
> terminal, e deixar ele rodando na inicialização do sistema como
> daemon.

Na verdade ele não vai funcionar na inicialização do sistema, pois ele
precisa rodar na sessão gráfica do usuário depois que ele já foi
autenticado, para que o xsel possa manipular o clipboard. Mas podes
colocar de alguma forma na inicialização da sessão do usuário, ou
colocar um ícone do tipo "Inicia Scanner" na barra do gnome/kde/sei lá.

Sim....é gnome "Like XP" hehe...
Vou adicionar nos "aplicativos de sessão" do gnome!
Ele irá iniciar junto com a sessão do usuário! 
Depois passo as confs para o skel,assim será padronizado para qualquer novo usuário!

Obrigado
Abraços

 
--
[[ Fábio Olivé Leite, olive, FabioOlive ]]
TcheLinux.org, OeSC-Livre.org, Chapecó, SC
ex sed lex awk yacc, e pluribus unix, amem

Fabio Olive Leite

unread,
Jun 6, 2011, 8:49:24 PM6/6/11
to TcheLinux, OeSC-Livre
Olá!

On 2011-06-06 Fabio Olive Leite wrote:
>
> while :; do
> read cod

> echo $cod | xsel -b -i
> done < /dev/ttyS0

Eu tava pesquisando aqui, pois sabia que tinha que existir uma maneira
pronta já de simular a digitação na interface gráfica. E tem mesmo,
instale o pacote xvkbd, e use a opção "-text" do xvkbd naquele script.

Fica assim:

while :; do
read cod
xvkbd -text $cod 2>/dev/null
done < /dev/ttyS0

Esse vai ler uma linha por vez e enviar essa linha como se fosse um
teclado usando o xvkbd. Aqui o xvkbd deu uns errinhos bestas quando
rodei, então achei melhor jogar os erros pro /dev/null. :)

Testa e comenta aí, Uhilian! :)

Christiano F. Haesbaert

unread,
Jun 8, 2011, 11:47:14 AM6/8/11
to tche...@googlegroups.com
2011/6/6 Fabio Olive Leite <fabio...@gmail.com>:
> Olá!
>
> On 2011-06-05 Christiano F. Haesbaert wrote:
>> cat /dev/ttyS0 :9600,n,8,1 > /dev/stdin
>
> Hmmm isso está errado, pois o cat vai simplesmente escrever o que vier
> da serial no stdin dele mesmo (provavelmente o terminal onde tu rodou o
> comando). Mas isso vai escrever como se fosse saída, e não como se
> fosse entrada pelo teclado.
>
> $ ls -l /dev/stdin
> lrwxrwxrwx. 1 root root 15 Jun  6 08:57 /dev/stdin -> /proc/self/fd/0
>
> Pra inserir no buffer do teclado, como se o kernel tivesse lido de um
> teclado físico, tem que se usar o ioctl TIOCSTI, mas mesmo esse insere
> só no terminal em que foi executado. Pra inserir no X é diferente.
>
> Talvez seja até mais fácil fazer um programa que fique lendo na serial
> e copie pro clipboard do X, e aí a pessoa só precisa escanear o código
> e apertar Ctrl+V onde quiser.
>
> Abraço!
>


Demorei um pouquinho^W muito, mas finalmente entendi, realmente, minha
suposição foi estúpida.

Reply all
Reply to author
Forward
0 new messages