Qual é a maneira correta de obter uma lista de todas as portas / dispositivos seriais disponíveis em um sistema Linux?
Em outras palavras, quando faço a iteração em todos os dispositivos /dev/
, como posso saber quais são as portas seriais da maneira clássica, ou seja, aquelas que geralmente oferecem suporte a taxas de transmissão e controle de fluxo RTS / CTS ?
A solução seria codificada em C.
Eu pergunto porque estou usando uma biblioteca de terceiros que faz isso claramente errado: parece apenas repetir /dev/ttyS*
. O problema é que existem, por exemplo, portas seriais sobre USB (fornecidas por adaptadores USB-RS232), e essas estão listadas em / dev / ttyUSB *. E lendo o Serial-HOWTO em Linux.org , tenho a idéia de que haverá outros espaços de nomes também, com o tempo.
Portanto, preciso encontrar a maneira oficial de detectar dispositivos seriais. O problema é que nada parece estar documentado ou não consigo encontrar.
Imagino que uma maneira seria abrir todos os arquivos do /dev/tty*
e chamar um específico ioctl()
sobre eles que está disponível apenas em dispositivos seriais. Isso seria uma boa solução, entretanto?
Atualizar
hrickards sugeriu olhar a fonte para "setserial". Seu código faz exatamente o que eu tinha em mente:
Primeiro, ele abre um dispositivo com:
fd = open (path, O_RDWR | O_NONBLOCK)
Em seguida, ele invoca:
ioctl (fd, TIOCGSERIAL, &serinfo)
Se essa chamada não retornar nenhum erro, então é um dispositivo serial, aparentemente.
Encontrei um código semelhante em Serial Programming / termios , o que sugeriu também adicionar a O_NOCTTY
opção.
Porém, há um problema com essa abordagem:
Quando testei esse código no BSD Unix (ou seja, Mac OS X), ele também funcionou. No entanto , os dispositivos seriais fornecidos por meio do Bluetooth fazem com que o sistema (driver) tente se conectar ao dispositivo Bluetooth, o que leva um tempo antes de retornar com um erro de tempo limite. Isso é causado apenas pela abertura do dispositivo. E posso imaginar que coisas semelhantes também possam acontecer no Linux - de preferência, não preciso abrir o dispositivo para descobrir seu tipo. Gostaria de saber se também existe uma maneira de invocar ioctl
funções sem um aberto, ou abrir um dispositivo de uma forma que não faça com que as conexões sejam feitas?
O que devo fazer?