AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 507349
Accepted
folibis
folibis
Asked: 2019-03-20 23:10:20 +0800 CST2019-03-20 23:10:20 +0800 CST 2019-03-20 23:10:20 +0800 CST

Enumeração de dispositivo Linux consistente

  • 772

Em nossa caixa Linux temos USB -> dispositivo serial que sempre foi identificado como /dev/ttyACM0. Então eu escrevi um aplicativo e até ontem, tudo funcionou bem. Mas de repente (sim, durante a apresentação remota...) o aparelho parou de funcionar. Após uma pesquisa rápida, descobri que a conexão mudou para /dev/ttyACM1. Foi um pouco prematuro, mas agora tenho um problema - como identificar inequivocamente meu dispositivo? Como, por exemplo, a unidade de armazenamento pode ser inicializada usando UUID, embora /dev/sd**tenha mudado. Existe alguma maneira de fazer isso para dispositivos seriais?

Agora eu uso uma solução estúpida:

for(int i = 0; i < 10; i ++)
{
    m_port = std::string("/dev/ttyACM") + (char)('0' + i);
    m_fd = open(m_port.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
}

O link para o dispositivo que usamos.

linux usb-device
  • 2 2 respostas
  • 3154 Views

2 respostas

  • Voted
  1. Best Answer
    thecarpy
    2019-03-20T23:58:48+08:002019-03-20T23:58:48+08:00

    Como estamos falando de dispositivos USB e supondo que você tenha o udev, você pode configurar algumas regras do udev.

    Eu acho, e isso é apenas um palpite, alguém ou algo desplugou/removeu o dispositivo e o conectou novamente/adicionou o dispositivo novamente, o que aumenta o número.

    Agora, primeiro você precisa dos IDs do fornecedor e do produto:

    $ lsusb
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 001 Device 011: ID 0403:6001 FTDI FT232 USB-Serial (UART) IC
    

    Em seguida, você precisa do número de série (caso tenha vários):

    # udevadm info -a -n /dev/ttyUSB1 | grep '{serial}' | head -n1
        ATTRS{serial}=="A6008isP"
    

    Agora, vamos criar uma regra udev:

    As regras UDEV geralmente estão espalhadas em muitos arquivos no formato /etc/udev/rules.d. Crie um novo arquivo chamado 99-usb-serial.rulese coloque a seguinte linha nele, tenho três dispositivos, cada um com um número de série diferente:

    SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A6008isP", SYMLINK+="MySerialDevice"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A7004IXj", SYMLINK+="MyOtherSerialDevice"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTDIF46B", SYMLINK+="YetAnotherSerialDevice"
    
    ls -l /dev/MySerialDevice
    lrwxrwxrwx 1 root root 7 Nov 25 22:12 /dev/MySerialDevice -> ttyUSB1
    

    Se você não quiser o número de série, qualquer dispositivo do fornecedor com o mesmo chip receberá o mesmo link simbólico, apenas um pode ser conectado a qualquer momento.

    SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="MySerialDevice"
    

    Tirado daqui

    • 20
  2. AlexBurk
    2020-05-05T23:50:08+08:002020-05-05T23:50:08+08:00

    As regras do UDEV são uma boa ideia, mas muitos dispositivos não têm serial ou têm o mesmo serial e isso não resolve o problema ttyACM0 to ttyACM1

    Tentar

    systemctl stop ModemManager systemctl desabilita ModemManager

    PS Não sou mágico, estou apenas aprendendo, mas a amizade nos ajuda a fazer verdadeiros milagres

    • 0

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve