Como descobrir qual porta serial está em uso?

33

A questão:

Conectei um dispositivo (por exemplo, modem GSM) através de uma porta serial (também conhecida como RS-232) e preciso ver com qual arquivo no /dev/sistema de arquivos este dispositivo foi amarrado, para poder me comunicar com ele. Infelizmente, não há nenhum arquivo criado recentemente, /dev/nem pode ser visto nada na dmesgsaída. Portanto, essa parece ser uma pergunta difícil.

Fundo:

Como nunca havia trabalhado com um dispositivo serial, ontem, quando apareceu uma necessidade, tentei pesquisar no Google, mas não encontrei nada útil. Passei algumas horas em busca e quero compartilhar uma resposta encontrada, pois pode ser útil para alguém.

Olá anjo
fonte
1
Gosto de usar esses bits para detectar um dispositivo - provavelmente vou usá-lo, embora tenha muitos dispositivos que usam apenas os pinos Tx / Rx, provavelmente poderia cortá-los para manter a linha CTS alta por isso.
Danny Staple
1
relacionada stackoverflow.com/questions/2530096/...
Ciro Santilli新疆改造中心法轮功六四事件

Respostas:

34

Infelizmente, as portas seriais não são do PlugNPlay, portanto o kernel não sabe qual dispositivo foi conectado. Depois de ler um tutorial do HowTo, eu tenho a ideia de trabalhar.

O /dev/diretório de sistemas operacionais unix como OS contém arquivos nomeados como ttySn (com n sendo um número) . A maioria deles não corresponde aos dispositivos existentes. Para descobrir quais, emita um comando:

$ dmesg | grep ttyS
[    0.872181] 00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    0.892626] 00:07: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
[    0.915797] 0000:01:01.0: ttyS4 at I/O 0x9800 (irq = 19) is a ST16650V2
[    0.936942] 0000:01:01.1: ttyS5 at I/O 0x9c00 (irq = 18) is a ST16650V2

Acima está um exemplo de saída do meu PC. Você pode ver a inicialização de algumas portas seriais:

ttyS0, ttyS1, ttyS4, ttyS5.

Um deles terá uma voltagem positiva em um dispositivo conectado. Portanto, comparando o conteúdo do arquivo /proc/tty/driver/serialcom e sem o dispositivo conectado, podemos encontrar facilmente os ttyS relacionados ao nosso dispositivo. Então, agora faça:

$ sudo cat /proc/tty/driver/serial> /tmp/1

(des) conectar um dispositivo

$ sudo cat /proc/tty/driver/serial> /tmp/2

Em seguida, verifique a diferença entre os dois arquivos. Abaixo está uma saída do meu PC:

$ diff /tmp/1 /tmp/2
2c2
< 0: uart:16550A port:000003F8 irq:4 tx:6 rx:0
---
> 0: uart:16550A port:000003F8 irq:4 tx:6 rx:0 CTS|DSR

Comparando os três números com a saída dmesg, podemos determinar qual é a porta:

[    0.872181] 00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A

Portanto, nosso dispositivo é /dev/ttyS0, missão cumprida!

Olá anjo
fonte
1
E se eu não vir nenhum dispositivo na saída dmesg?
user3019105
2
@ user3019105 desculpe, eu nunca enfrentei esse problema. Pelo que entendi, dmesgdeve ter uma mensagem sobre a atribuição de irq a um dispositivo serial. E se não, eu assumiria algum problema de hardware. Isso é apenas uma suposição e pode estar errado, mas se eu depurar esse problema, começaria a pesquisar com a ideia de que a porta serial deveria ter sido inicializada.
Hi-Angel
1
Desde que mudo de uma máquina para outra, defini um alias para me mostrar as portas seriais dessa máquina. Ele funciona nos sistemas da família Ubuntu com systemd. alias ports = 'udevadm info --export-db | grep -i "^ n: ttyu"'
DDay