Como encontrar qual porta serial está em uso?

30

A pergunta:

Eu pluguei um dispositivo (por exemplo, modem GSM) através de uma porta serial (também conhecida como RS-232), e eu preciso ver com qual arquivo no sistema de arquivos /dev/ este dispositivo estava ligado, para poder se comunicar com ele . Infelizmente não há arquivo recém-criado em /dev/ nem pode ser visto em dmesg output. Então, isso parece ser uma pergunta difícil.

Histórico:

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

    
por Hi-Angel 17.04.2014 / 09:50

1 resposta

30
Infelizmente as portas seriais não são PlugNPlay, então o kernel não sabe qual dispositivo foi plugado. Depois de ler um HowTo tutorial Eu tenho a idéia de trabalho.

O diretório /dev/ de SOs semelhantes a unix contém arquivos nomeados como ttySn (com n sendo um número) . A maioria deles não corresponde aos dispositivos existentes. Para descobrir quais, envie 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. comparando o conteúdo do arquivo /proc/tty/driver/serial com 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

(un) conecta 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

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

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

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

    
por 17.04.2014 / 19:20