2013-03-11 55 views
5

有沒有一種檢測所有連接在Linux上的串行端口上的設備的好方法?我用C++編程,但也歡迎其他例子。C++ linux檢測所有的串行端口

你可以試着打開每個端口,當它成功時,將它添加到端口列表中,但這似乎不是一個很好的解決方案。

你可以進入開發主管,由於我的串口是USB端口,我可以檢查哪些ttyUSB ..文件已經制作完成。但是這對於非USB串行端口不起作用,因爲tty0到tty63的文件總是在這個目錄中。

我的例子:

std::string port; 
int fd 
std::vector<std::string>> list; 
for(int i = 0; i < 256; ++i) 
{ 
    port.clear(); 
    port.append("/dev/ttyUSB"); 
    port.append(std::to_string(i)); 
    fd = open(port.c_str(), O_RDWR | O_NOCTTY | O_DELAY); 
    if(fd != -1) 
    { 
     list.push_back(port); 
    } 
} 

謝謝!

+0

串口通常命名爲'ttyS0'等。 – Hasturkun 2013-03-11 15:51:52

+1

這給了我一個XY問題的感覺,你的實際問題是X,你認爲解決方案是Y,所以你問Y.爲什麼你想知道系統上的串行端口? – 2013-03-11 15:52:15

+0

在1個端口上連接了ZigBee設備。由於我想讓用戶友好,我想列出所有可能性,以便用戶可以選擇。通常情況下,如果你插入ZigBee設備,你應該只返回一個端口號。 @Hasturkun在我的情況下,因爲我的串行設備使用USB連接,它被命名爲ttyUSB0。 – Silver 2013-03-11 17:12:52

回答

7

在Linux中枚舉設備的標準方式是瀏覽/sys文件系統。在這種情況下,您可以到以下幾點:

  1. 枚舉/sys/class/tty
  2. 對於每個目錄/sys/class/tty/foo的所有文件,檢查是否存在/sys/class/tty/foo/device使用lstat()
    • 如果它不存在,那麼你正在處理某種虛擬tty設備(虛擬控制檯端口,ptmx等),你可以放棄它。
    • 如果存在,則保留串口foo

你應該留下的實際串行端口的列表。

+0

我通過這種機制得到32個設備。 2有效。你需要檢查它是不是指向'serial8250',這實際上只是驅動程序 – Petesh 2013-03-11 16:33:22

+0

在我的幾個系統中,我有真正有效的串口,'device'符號鏈接指向'serial8250' ...我不是肯定你爲什麼會得到這麼多無效的。 – Celada 2013-03-11 16:45:20

+0

32來自內核配置值'CONFIG_SERIAL_8250_RUNTIME_UARTS',我認爲它支持超過默認的'32'(這是一個x64 3.2內核)。 – Petesh 2013-03-11 17:18:27