Ouvir porta serial

1. Ouvir porta serial

Daniel Borges de Oliveira
DanielBO

(usa FreeBSD)

Enviado em 18/11/2012 - 18:57h

Fala galera,

Preciso de algum shell script que escute a porta serial e se ouver algum trafego de informação nessa porta, deve-se executar algumas instruções. Se não ouver trafego de informação na porta por mais que 10 minutos deve executar outra instrução.
Não sei se consegui explicar bem o que eu pretendo, mas segue um esboço de script para tentar explicar a primeira parte do que preciso.

#-------------------------------------------------------------------------------#
#!/bin/sh
parametro=$(cat /dev/tts/1) &
if ! [ -z $parametro ]; then
echo "Ouve trafego de informação na porta"
hora0=$(date)
fi

#Compara se a hora de execução tem mais de 10 minutos em relação a hora atual
hora1=$(date)
if [ ($hora1 - $hora0) < 600 ]; then
echo "Não ouve trafego por mais de 10 minutos"
fi
#-------------------------------------------------------------------------------#


Obrigado.


  


2. Re: Ouvir porta serial

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/11/2012 - 14:37h

Se você só quer saber se houve atividade, basta ficar examinando as datas de acesso e/ou modificação dos arquivos referentes ao terminal (ex. /dev/tty1, dev/ttyS0 etc.).

Se você quiser interceptar os dados trafegados; bem, aí já existe um lado ético que VOCÊ precisa considerar, pois é, em muitos casos, ilegal interceptar comunicação para obter dados sem o conhecimento do verdadero dono.

Existem vários aplicativos que interceptam dados trafegados num tty, seja ele ligado a serial, seja um pseudo-tty, como por exemplo o ttysnoop, o watch do FreeBSD e o próprio strace. Também dá para rodar programas que se colocam entre a aplicação final e o dispositivo real, à semelhança do que fazem, legitimamente, script, screen e byobo.


3. Porta serial

Eder Higino Duarte
higinoduarte

(usa Outra)

Enviado em 16/07/2015 - 19:43h


Paulo,

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..

Grato
Eder


4. Re: Ouvir porta serial

Paulo
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).


5. paulo1205

Eder Higino Duarte
higinoduarte

(usa Outra)

Enviado em 28/07/2015 - 11:41h


Paulo,

Muito obrigado pela ajuda.

Abração,
Eder






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts