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?
sumber
Jawaban:
Sistem
/sys
file harus berisi banyak informasi untuk pencarian Anda. Sistem saya (2.6.32-40-generik # 87-Ubuntu) menyarankan:Yang memberi Anda deskripsi tentang semua perangkat TTY yang dikenal sistem. Contoh yang dipangkas:
Mengikuti salah satu tautan berikut:
Di sini
dev
file tersebut berisi informasi ini:Ini adalah simpul mayor / minor. Ini dapat dicari di
/dev
direktori untuk mendapatkan nama yang mudah digunakan:The
/sys/class/tty
dir berisi semua perangkat TTY tetapi Anda mungkin ingin mengecualikan mereka terminal virtual dan terminal semu sial. Saya sarankan Anda memeriksa hanya yang memilikidevice/driver
entri:sumber
/dev/zero
. Apakah menurut Anda, ini adalah perangkat serial?Di kernel terbaru (tidak yakin sejak kapan) Anda dapat membuat daftar konten / dev / serial untuk mendapatkan daftar port serial di sistem Anda. Mereka sebenarnya adalah symlink yang menunjuk ke / dev / node yang benar:
Ini adalah adaptor USB-Serial, seperti yang Anda lihat. Perhatikan bahwa ketika tidak ada port serial pada sistem, direktori / dev / serial / tidak ada. Semoga ini membantu :).
sumber
Saya melakukan sesuatu seperti kode berikut. Ia bekerja untuk USB-perangkat dan juga serial8250-devuices bodoh yang kita semua memiliki 30 - tetapi hanya beberapa dari mereka yang benar-benar berfungsi.
Pada dasarnya saya menggunakan konsep dari jawaban sebelumnya. Pertama-tama hitung semua tty-devices di / sys / class / tty /. Perangkat yang tidak berisi subdir / perangkat disaring. / sys / class / tty / console adalah perangkat semacam itu. Kemudian perangkat yang benar-benar berisi perangkat kemudian diterima sebagai port serial yang valid tergantung pada target dari driver-symlink fx.
dan untuk ttyS0
Semua driver yang digerakkan oleh serial8250 harus berupa probe menggunakan ioctl yang disebutkan sebelumnya.
Hanya port yang melaporkan jenis perangkat yang valid yang valid.
Sumber lengkap untuk menghitung serialports terlihat seperti ini. Penambahan dipersilakan.
sumber
Saya rasa saya menemukan jawabannya di dokumentasi sumber kernel saya: /usr/src/linux-2.6.37-rc3/Documentation/filesystems/proc.txt
Berikut ini tautan ke file ini: http://git.kernel.org/?p=linux/kernel/git/next/linux-next.git;a=blob_plain;f=Documentation/filesystems/proc.txt;hb = e8883f8057c0f7c9950fa9f20568f37bfa62f34a
sumber
saya menemukan
melakukan pekerjaan itu.
sumber
setserial dengan opsi -g tampaknya melakukan apa yang Anda inginkan dan sumber C tersedia di http://www.koders.com/c/fid39344DABD14604E70DF1B8FEA7D920A94AF78BF8.aspx .
sumber
Saya tidak memiliki perangkat serial di sini untuk mengujinya, tetapi jika Anda memiliki python dan dbus, Anda dapat mencobanya sendiri.
Jika gagal Anda dapat mencari di dalam
hwmanager_i.GetAllDevicesWithProperties()
untuk melihat apakah nama kemampuan "serial" yang saya tebak memiliki nama yang berbeda.HTH
sumber
Saya tidak memiliki perangkat serial USB, tetapi harus ada cara untuk menemukan port yang sebenarnya menggunakan pustaka HAL secara langsung:
Kode python-dbus yang diposting atau skrip sh ini mencantumkan perangkat bluetooth / dev / rfcomm *, jadi ini bukan solusi terbaik.
Perhatikan bahwa pada platform unix lainnya, port serial tidak bernama ttyS? dan bahkan di linux, beberapa kartu serial memungkinkan Anda memberi nama perangkat. Asumsi pola dalam nama perangkat serial salah.
sumber
Menggunakan / proc / tty / drivers hanya menunjukkan driver tty mana yang dimuat. Jika Anda mencari daftar port serial, periksa / dev / serial, ini akan memiliki dua subdirektori: by-id dan by-path.
EX:
Terima kasih untuk posting ini: /superuser/131044/how-do-i-know-which-dev-ttys-is-my-serial-port
sumber
Pendekatan saya melalui panggilan grup untuk mendapatkan setiap tty dengan 'dialout' pengguna
ls -l /dev/tty* | grep 'dialout'
hanya untuk mendapatkan foldernyals -l /dev/tty* | grep 'dialout' | rev | cut -d " " -f1 | rev
mudah mendengarkan keluaran tty misal saat arduino keluar serial:
head --lines 1 < /dev/ttyUSB0
dengarkan setiap tty out hanya untuk satu baris:
for i in $(ls -l /dev/tty* | grep 'dialout' | rev | cut -d " " -f1 | rev); do head --lines 1 < $i; done
Saya sangat suka pendekatan melalui mencari driver:
ll /sys/class/tty/*/device/driver
Anda dapat memilih tty-Name sekarang:
ls /sys/class/tty/*/device/driver | grep 'driver' | cut -d "/" -f 5
sumber
Pustaka manajer komunikasi serial memiliki banyak API dan fitur yang ditargetkan untuk tugas yang Anda inginkan. Jika perangkatnya adalah USB-UART VID / PIDnya dapat digunakan. Jika perangkat BT-SPP maka API khusus platform dapat digunakan. Lihatlah proyek ini untuk pemrograman port serial: https://github.com/RishiGupta12/serial-communication-manager
sumber
ya, saya tahu, saya terlambat (seperti biasa). Ini potongan kode saya (berdasarkan balasan dari mk2). Mungkin ini membantu seseorang:
sumber