Bagaimana menemukan port serial mana yang digunakan?

33

Pertanyaan:

Saya terhubung ke sebuah perangkat (yaitu modem GSM) melalui port serial (alias RS-232), dan saya perlu melihat dengan file mana di /dev/filesystem perangkat ini diikat, untuk dapat berkomunikasi dengannya. Sayangnya tidak ada file yang baru dibuat di /dev/atau tidak dapat dilihat apa pun di dmesgoutput. Jadi ini sepertinya pertanyaan yang sulit.

Latar Belakang:

Saya belum pernah bekerja dengan perangkat serial, jadi kemarin, ketika ada kebutuhan, saya mencoba Google tetapi tidak menemukan sesuatu yang bermanfaat. Saya menghabiskan beberapa jam mencari, dan saya ingin membagikan jawaban yang ditemukan karena dapat membantu seseorang.

Hai Malaikat
sumber
1
Saya suka menggunakan bit-bit itu untuk mendeteksi perangkat - saya mungkin akan menggunakannya, walaupun saya punya banyak perangkat yang hanya menggunakan pin Tx / Rx, saya mungkin bisa meretasnya untuk menahan garis CTS tinggi untuk itu.
Danny Staple
1
stackoverflow.com/questions/2530096/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

34

Sayangnya port serial non-PlugNPlay, jadi kernel tidak tahu perangkat mana yang dicolokkan. Setelah membaca tutorial HowTo, saya punya ide yang berfungsi.

The /dev/direktori unix seperti OS berisi file bernama ttySn (dengan n menjadi angka) . Sebagian besar tidak sesuai dengan perangkat yang ada. Untuk menemukan yang mana, lakukan perintah:

$ 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

Di atas adalah contoh output dari PC saya. Anda dapat melihat inisialisasi beberapa port serial:

ttyS0, ttyS1, ttyS4, ttyS5.

Salah satunya akan memiliki tegangan positif pada perangkat yang terhubung. Jadi dengan membandingkan konten file /proc/tty/driver/serialdengan dan tanpa perangkat yang terhubung, kita dapat dengan mudah menemukan ttyS yang terkait dengan perangkat kita. Jadi, sekarang lakukan:

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

(un) pasang perangkat

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

Selanjutnya periksa perbedaan antara kedua file. Di bawah ini adalah output dari PC saya:

$ 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

Dengan membandingkan tiga angka dengan output dmesg kita dapat menentukan yang mana adalah port:

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

Karenanya, perangkat kami adalah /dev/ttyS0, misi tercapai!

Hai Malaikat
sumber
1
Bagaimana jika saya tidak melihat perangkat apa pun di output dmesg?
user3019105
2
@ user3019105 maaf, saya tidak pernah menghadapi masalah seperti itu. Dari apa yang saya mengerti, dmesgharus memiliki pesan tentang menetapkan irq ke perangkat serial. Dan jika tidak, saya akan menganggap beberapa masalah perangkat keras. Itu hanya asumsi, dan mungkin salah, tetapi jika saya men-debug masalah seperti itu, saya akan memulai penelitian dengan gagasan bahwa port serial seharusnya sudah diinisialisasi.
Hi-Angel
1
Karena saya pindah dari mesin ke mesin, saya telah menetapkan alias untuk menunjukkan port serial pada mesin ini. Ini bekerja pada sistem keluarga Ubuntu dengan systemd. alias ports = 'udevadm info --export-db | grep -i "^ n: ttyu"'
DDay