Fixar nome de dispositivo e script de aquisição de dados

O udev é um gerenciador dinâmico de dispositivos, cujos nós estão presentes no diretório "/dev". Quando o computador inicia, o udev pode direcionar o dispositivo para algo do tipo "/dev/ttyUSB". No entanto, o sistema pode referenciar com outro código e pode haver a necessidade de atualizar scripts de leitura dessa porta. Nesse caso, deve-se verificar o novo código através do comando "dmesg | grep tty" e realizar a alteração no código.

Para fixar um número (ou um novo nome qualquer, personalizado), entre no diretório "/etc/udev/rules.d/" e edite (ou crie um novo) arquivo "99-usb-serial.rules", que possui uma (ou mais) linha(s) com regras "persistent" para cada dispositivo USB.

A nova linha deve conter o parâmetro SYMLINK="ttyUSB1" (por exemplo) para fazer a ligação com o dispositivo e a sua indicação. As outras informações podem ser obtidas por algum dos seguintes comandos:

1ª opção: dmesg | grep tty

A saída para dois dispositivos em duas entradas USB ficaria assim:

[ 5.172398] usb 1-1.3: FTDI USB Serial Device converter now attached to ttyUSB0
[ 6.359546] usb 1-1.5: pl2303 converter now attached to ttyUSB1

Dá pra saber o "tty" e o nome de cada dispositivo.

2ª opção: lsusb

A saída para o mesmo caso de cima, tem vários itens, mas pelo nome de cada um, é possível selecionar as linhas que interessam:

Bus 001 Device 004: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 001 Device 006: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port

Os caracteres antes do dois pontos (067b, por exemplo) é o "idVendor" e o depois (2303) é o "idProduct". Com eles, já é possível identificar o dispositivo.

3ª opção: udevadm info --name=/dev/ttyUSB1 --attribute-walk ou lsusb -v | more

Mostra todos os atributos de uma lista de dispositivos USB - caso precise do serial number (iSerial), ele será listado aí se o possuir.

Por fim, a linha (desse exemplo) a constar do arquivo é a seguinte:

SUBSYSTEM=="tty", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", SYMLINK+="ttyUSB1"

Obs.: SYSFS{}= foi removido do udev, sendo utilizado atualmente ATTR{}= (para combinar com o dispositivo de evento) ou ATTRS{}= (para combinar com um dispositivo pai).

Para carregar as novas regras e testá-las, use os seguintes comandos respectivamente:

sudo udevadm trigger
sudo udevadm test -a -p $(udevadm info -q path -n /dev/ttyUSB1)

Script em python

Segue script para ler e gravar dados recebidos através da conexão "ttyUSB1", a ser executado como "sudo" - o loop "while 1" é usado para ficar infinitamente realizando a leitura:

#!/usr/bin/env python
# Script para aquisicao de dados serial via USB
import datetime
import serial
 
# Diretorio de registro dos dados
dir_dados="/home/receiver/"
# Especificar o dispositivo serial
ser=serial.Serial('/dev/ttyUSB1', 9600,  timeout=1)
 
while 1:
        line=ser.readline()
        #.decode('utf-8', "ignore")
        filename=str(datetime.datetime.utcnow())[:10]
        print line
        campos=line.split(";")
        saida=open(dir_dados+"instrumento_"+str(filename)+".dat",'a')
        saida.write(str(datetime.datetime.utcnow())[:19]+"\n")
        saida.write(str(line))
        saida.flush()
ser.close()

Veja mais sobre interface serial como configurar a aquisição de dados usando o minicom (para testes) clicando no link.

Fontes

Compartilhe o link desse texto, mas se for copiar algum trecho, cite a fonte. Valorize nosso trabalho.
Mais informações na licença de uso do site.

Um Pingback/Trackback