paulo1205
(usa Ubuntu)
Enviado em 21/07/2015 - 19:22h
higinoduarte escreveu:
Eu preciso muito obter informações de periféricos seriais (impressora, balança e scanner) ligados à uma estação linux.
Se puder, me ajude (Apontar o Norte) a encontrar um jeito de obter informações sobre estes dispositivos..
Eu suponho que você esteja falando de comunicação serial em interfaces do tipo RS-232. RS-485, RS-422 ou RS-423 (para não falar de MIDI, USB, Ethernet, SATA etc.) são outras histórias.
Não sei seu nível de conhecimento atual, então vou responder de modo genérico.
A primeira fonte de informação que eu recomendo que você consulte é manual de cada equipamento. Acho improvável que todos os dispositivos que você mencionou entreguem seus dados de modo homogêneo e usando texto humanamente legível.
Quanto a saber lidar com comunicação serial no Linux, acho bom começar separando as coisas. Primeiro, você deve aprender alguma coisa sobre comunicação serial de modo geral. Isso vai ajudar muito quando, depois, você começar a estudar a implementação no Linux.
Quase tudo o que eu aprendi sobre comunicação serial foi com o livro “C Programmer's Guide to Serial Communications”, que eu definitivamente recomendo como leitura. Mesmo sendo um tanto antigo e, na parte de código, voltado para MS-DOS e uma variante de CP/M (falo da primeira edição, que é a que meu pai tinha -- e espero que ainda tenha --; não sei como é a segunda), a exposição da teoria, incluindo motivos históricos para que certas coisas fossem feitas do modo como foram feitas, é excelente.
Apesar de você ter aberto o tópico num fórum de shell, eu duvido que você realmente acharia uma boa ideia usar shell para mexer com comunicação serial. Eu recomendo C ou C++.
No Linux, lidar com serial é quase como lidar com arquivos abertos ao mesmo tempo para escrita e leitura. O fluxo básico mais o menos o seguinte:
descritor=open(porta_serial, O_RDWR);
while(pode_continuar_comunicando && quer_continuar_comunicando){
/* Processa alguma coisa. */
if(pode_receber && quer_receber)
qtd_recebida=read(descritor, buffer_recebimento, tamanho_maximo);
/* Processa alguma coisa. */
if(pode_enviar && quer_enviar)
qtd_enviada=write(descritor, buffer_envio, quantidade_a_enviar);
/* Processa alguma coisa. */
}
close(descritor);
Variações sobre o básico incluem ajustes dos parâmetros de comunicação (velocidade, tamanho do dado, paridade, tipo de controle de fluxo etc., o que geralmente é feito logo no início da comunicação), exame e ajuste de linhas de controle (necessidade e frequência dependendo do tipo do dispositivo com o qual está se comunicando), mecaninsmos de
timeout e tratamento de eventuais erros e/ou necessidades de retransmissão. Muitas dessas operações a mais se fazem por meio da chamada
ioctl () aplicada ao descritor, com uma das operações descritas na manpage
tty_ioctl (4) (ou apenas
tty (4), se você estiver num BSD).
Essa é a interface tipicamente UNIX e em C. Se você quiser outra linguagem ou algo que seja mais ou menos uniforme entre múltiplas plataformas (basicamente UNIX e Windows), existem várias bibliotecas por aí. Numa busca rápida, eu achei esta
http://www.teuniz.net/RS-232/ (em C) e Boost.Asio, que tem classes para comunicação serial (C++). Devem existir opções para Java, Python e outras linguagens, também.
Eu nunca usei nenhuma dessas bibliotecas nos poucos produtos que fiz (sempre fiz em baixo nível mesmo, usando o que o SO me entregava).