Apa cara yang tepat untuk mendapatkan daftar semua port serial / perangkat yang tersedia di sistem Linux?
Dengan kata lain, ketika saya mengulang semua perangkat di /dev/
, bagaimana cara mengetahui mana yang merupakan port serial dengan cara klasik, yaitu, yang biasanya mendukung baud rate dan kontrol aliran RTS / CTS ?
Solusinya akan diberi kode dalam C.
Saya bertanya karena saya menggunakan pustaka pihak ketiga yang jelas melakukan kesalahan ini: Tampaknya hanya berulang /dev/ttyS*
. Masalahnya adalah bahwa ada, misalnya, port serial melalui USB (disediakan oleh adaptor USB-RS232), dan itu terdaftar di bawah / dev / ttyUSB *. Dan membaca Serial-HOWTO di Linux.org , saya mendapat ide bahwa akan ada ruang nama lain juga, seiring waktu.
Jadi saya perlu menemukan cara resmi untuk mendeteksi perangkat serial. Masalahnya adalah tidak ada yang tampaknya didokumentasikan, atau saya tidak dapat menemukannya.
Saya membayangkan salah satu cara adalah membuka semua file dari /dev/tty*
dan memanggil file tertentu ioctl()
yang hanya tersedia di perangkat serial. Namun, apakah itu solusi yang bagus?
Memperbarui
hrickards menyarankan untuk melihat sumber untuk "setserial". Kodenya melakukan persis seperti yang saya pikirkan:
Pertama, ini membuka perangkat dengan:
fd = open (path, O_RDWR | O_NONBLOCK)
Kemudian memanggil:
ioctl (fd, TIOCGSERIAL, &serinfo)
Jika panggilan itu tidak mengembalikan kesalahan, maka itu adalah perangkat serial, tampaknya.
Saya menemukan kode serupa di Serial Programming / termios , yang menyarankan untuk juga menambahkan O_NOCTTY
opsi.
Namun, ada satu masalah dengan pendekatan ini:
Ketika saya menguji kode ini di BSD Unix (yaitu, Mac OS X), itu berhasil juga. Namun , perangkat serial yang disediakan melalui Bluetooth menyebabkan sistem (driver) mencoba menyambung ke perangkat Bluetooth, yang membutuhkan beberapa saat sebelum kembali dengan kesalahan batas waktu. Ini disebabkan hanya dengan membuka perangkat. Dan saya dapat membayangkan bahwa hal serupa dapat terjadi di Linux juga - idealnya, saya tidak perlu membuka perangkat untuk mengetahui jenisnya. Saya ingin tahu apakah ada juga cara untuk menjalankan ioctl
fungsi tanpa membuka, atau membuka perangkat dengan cara yang tidak menyebabkan koneksi dibuat?
Apa yang harus saya lakukan?