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.
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:
Em seguida, você precisa do número de série (caso tenha vários):
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 chamado99-usb-serial.rules
e coloque a seguinte linha nele, tenho três dispositivos, cada um com um número de série diferente: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.
Tirado daqui
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
PS Não sou mágico, estou apenas aprendendo, mas a amizade nos ajuda a fazer verdadeiros milagres