Como combinar um dispositivo ttyUSBX com um dispositivo serial USB


21

O driver opcional corresponde ao ID USB e carrega o driver para este dispositivo. Por exemplo

# lsusb
Bus 001 Device 002: ID 19d2:0031 ONDA Communication S.p.A. ZTE MF636
Bus 001 Device 003: ID 12d1:14ac Huawei Technologies Co., Ltd.

Ele também cria dispositivos ttyUSBX para gerenciar o hardware

crw-rw---- 1 root uucp 188, 0 Jul  4 13:48 /dev/ttyUSB0
crw-rw---- 1 root uucp 188, 1 Jul  4 13:49 /dev/ttyUSB1
crw-rw---- 1 root uucp 188, 2 Jul  4 13:35 /dev/ttyUSB2
crw-rw---- 1 root uucp 188, 3 Jul  4 13:37 /dev/ttyUSB3
crw-rw---- 1 root uucp 188, 4 Jul  4 13:37 /dev/ttyUSB4
crw-rw---- 1 root uucp 188, 5 Jul  4 13:37 /dev/ttyUSB5
crw-rw---- 1 root uucp 188, 6 Jul  4 13:37 /dev/ttyUSB6
crw-rw---- 1 root uucp 188, 7 Jul  4 13:37 /dev/ttyUSB7

No entanto, tenho mais de um dispositivo serial USB e quero saber qual ttyUSB é para qual USBID. Ex. / dev / ttyUSB1 -> 19d2: 0031

Você conhece algum ponto em que eu possa obter essas informações?


Se você sabe detalhes como fornecedor / produto, em seguida, esta resposta é grande
earcam

Respostas:


12

Dê uma olhada no sistema de arquivos sysfs. Um exemplo para o meu serial USB:

$ lsusb
Bus 003 Device 016: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
$ ls -l /sys/bus/usb-serial/devices
lrwxrwxrwx 1 root root 0 Jul  4 17:37 ttyUSB0 -> ../../../devices/pci0000:00/0000:00:1c.0/0000:02:00.0/usb3/3-1/3-1:1.0/ttyUSB0
$ $ grep PRODUCT= /sys/bus/usb-serial/devices/ttyUSB0/../uevent
PRODUCT=67b/2303/300

Como você pode ver, ttyUSB0mapeia para 067b:2303no meu computador. Outros locais que vale a pena explorar são /sys/class/tty/. Preste atenção aos links simbólicos.


você fez alguma coisa para listar também o PRODUCT?
Igor Stoppa

@IgorStoppa, Tente cato ueventarquivo a partir do resultado de find /sys -name ttyACM0, por exemplo. Substitua o nome do nó do seu dispositivo serial.
sherrellbc

9

Você pode tentar ver se os seus dispositivos estão registrados em / dev / serial / by-id /

ls -l / dev / serial / by-id

Esses nomes devem ser consistentes e apontarão (link simbólico) para o ttyUSBx correto


Você pode adicionar alguns esclarecimentos, exemplos etc. A resposta on-line não conta como boa no SE
Romeo Ninov

@RomeoNinov Ok, adicionei alguns esclarecimentos conforme solicitado. Isso não é exatamente mais difícil do que apenas procurar em outro diretório, então não consigo ver como tornar a resposta mais elaborada do que é possível melhorar alguma coisa. Me desculpe por isso.
Waxhead

Eu tenho dois adaptadores idênticos (dois Arduinos) conectados a um Raspberry Pi. ls -l /dev/serial/by-idretorna apenas um adaptador ../../ttyUSB1, enquanto ls -l /sys/bus/usb-serial/devicesme mostra os dois. Portanto, não acho que seja uma boa resposta.
Daniel F

6

Eu tive um problema semelhante .

Escreva para /etc/udev/rules.d/50-usb.rules

SUBSYSTEM=="tty", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="0031", SYMLINK+="ONDA"
SUBSYSTEM=="tty", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="14ac", SYMLINK+="HUAWEI"

até o fim. Reinicie.

Agora você pode usar /dev/ONDApara acessar o seu dispositivo ONDA.

Se você deseja que usuários não root possam usá-los, adicione

, MODE="0666"

até o final de cada linha.


Fiz isso e verifiquei os arquivos aos quais eles vinculam. o produto que tenho possui várias interfaces, como disco sólido, serial USB. Enquanto eu esperava a ligação para / dev / ttyACM0, mas foi para / dev / sda. alguma maneira de definir no arquivo de regras qual tipo de dispositivo a regra deve aplicar? Eu escrevi as regras em
/etc/udev/rules.d/99-ftdi.rules

ok encontrou: adicionou SUBSYSTEM == "tty" aos parâmetros da regra. esse valor pode ser encontrado na saída de udevadm info --name=/dev/ttyACM0
nurp 26/09/18

3

Eu usaria o udev e escreveria algumas regras que criam links simbólicos para os dispositivos.

Para obter informações suficientes para distinguir os dispositivos, tente algo assim para todos os dispositivos:

$ udevadm info --query all --name /dev/ttyUSB0 --attribute-walk

1

Os comandos a seguir me fornecerão uma lista dos nomes de dispositivos ttyUSB associados ao 19d2: 0016 (que é o ID do "modo modem" de um stick ZTE MF831 LTE, o seu pode diferir.):

    for i in $(find -L /sys/bus/usb/devices/ -maxdepth 2 -name "ttyUSB*"); do
        egrep -i "v19d2p0016(.*)in02" $i/../modalias >/dev/null && echo "/dev/${i##*/}"
    done

Isso percorrerá uma lista de arquivos com o nome de arquivo ttyUSB *, incluindo links simbólicos, em / sys / bus / usb / devices. Nos resultados, procuraremos um arquivo chamado modalias e procuraremos uma string contendo o ID do fornecedor "v" "19d2" e o ID do produto "p" 0016. Se a saída corresponder, ecoaremos uma string com o prefixo "/ dev / "na frente do USB? nome. Afaik o primeiro ou o geralmente o último (número mais alto) é a porta do modem para dispositivos ZTE. Você pode fazer eco dos resultados em um arquivo em / tmp / e head -n1 ou tail -n1 nas linhas de acordo. Se você tiver hubs, provavelmente precisará aumentar a profundidade máxima.

Esta não é a maneira mais elegante, mas funcionará em praticamente qualquer variante do Linux.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.