Cách thích hợp để lấy danh sách tất cả các cổng / thiết bị nối tiếp có sẵn trên hệ thống Linux là gì?
Nói cách khác, khi tôi lặp lại tất cả các thiết bị trong đó /dev/
, làm cách nào để biết cái nào là cổng nối tiếp theo cách cổ điển, tức là những thiết bị thường hỗ trợ tốc độ truyền và điều khiển luồng RTS / CTS ?
Giải pháp sẽ được mã hóa bằng C.
Tôi hỏi vì tôi đang sử dụng thư viện của bên thứ ba, điều này rõ ràng là sai: Nó dường như chỉ lặp đi lặp lại /dev/ttyS*
. Vấn đề là có, ví dụ, có các cổng nối tiếp qua USB (được cung cấp bởi bộ điều hợp USB-RS232) và những cổng đó được liệt kê trong / dev / ttyUSB *. Và khi đọc Serial-HOWTO tại Linux.org , tôi có ý tưởng rằng sẽ có những không gian tên khác, khi thời gian đến.
Vì vậy, tôi cần phải tìm cách chính thức để phát hiện các thiết bị nối tiếp. Vấn đề là dường như không có tài liệu nào được ghi lại, hoặc tôi không thể tìm thấy nó.
Tôi tưởng tượng một cách sẽ là mở tất cả các tệp từ /dev/tty*
và gọi một tệp cụ thể ioctl()
trên chúng mà chỉ khả dụng trên các thiết bị nối tiếp. Đó có phải là một giải pháp tốt không?
Cập nhật
hrickards đề nghị xem nguồn cho "setserial". Mã của nó thực hiện chính xác những gì tôi đã nghĩ đến:
Đầu tiên, nó mở một thiết bị với:
fd = open (path, O_RDWR | O_NONBLOCK)
Sau đó, nó gọi:
ioctl (fd, TIOCGSERIAL, &serinfo)
Nếu cuộc gọi đó không trả về lỗi, thì rõ ràng đó là một thiết bị nối tiếp.
Tôi tìm thấy mã tương tự trong Lập trình nối tiếp / thuật ngữ , điều này đề xuất thêm O_NOCTTY
tùy chọn.
Tuy nhiên, có một vấn đề với cách tiếp cận này:
Khi tôi kiểm tra mã này trên BSD Unix (tức là Mac OS X), nó cũng hoạt động. Tuy nhiên , các thiết bị nối tiếp được cung cấp qua Bluetooth khiến hệ thống (trình điều khiển) cố gắng kết nối với thiết bị Bluetooth, điều này sẽ mất một lúc trước khi thiết bị sẽ quay lại với lỗi hết thời gian chờ. Nguyên nhân là do bạn vừa mở máy. Và tôi có thể tưởng tượng rằng những điều tương tự cũng có thể xảy ra trên Linux - lý tưởng nhất là tôi không cần phải mở thiết bị để tìm ra loại của nó. Tôi tự hỏi liệu có cách nào để gọi các ioctl
chức năng mà không cần mở hoặc mở một thiết bị theo cách mà nó không gây ra kết nối không?
Tôi nên làm gì?