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
One comment