2012-01-27 55 views
1

我在使用串口的Ubuntu下編寫控制檯應用程序。它需要以60 Hz的頻率讀取和寫入串行端口。POSIX串行端口上的read()可能會很慢的原因是什麼?

我發現read()的調用通常很慢,但並不總是很慢。我已經設置了O_NDELAY,所以經常返回(很好)。有時需要花費50毫秒才能完成,而且對於我的應用程序來說太慢了。在調用read()之前,我檢查可用的字符數,所以它不應該等待數據。

什麼是read()這樣做需要這麼長時間?我如何加快速度?在端口上

選項包括:

options.c_cflag |= (CLOCAL | CREAD); 
options.c_cflag &= ~PARENB; 
options.c_cflag &= ~CSTOPB; 
options.c_cflag &= ~CSIZE; 
options.c_cflag |= CS8; 

options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); 
options.c_iflag &= ~IXON; 

options.c_oflag = 0; 

編輯:我一直在使用select()前面,但它竟然是正交的問題。用我的最新信息更新。

+0

什麼是串口的波特率?也許內核需要讀取至少一個完整的字節...... – 2012-01-27 18:29:44

+0

它可能只是您的特定硬件要求(例如,硬件規格這樣說)或在OS上施加(例如,不良USB設備)以獲得其狀態。 – 2012-01-27 18:38:22

+0

@Basile:115200 – amo 2012-01-27 18:42:26

回答

0

這不是select正在做什麼,這是系統正在做的事情。您的線程最終會耗盡其時間片,並且系統允許其他代碼運行。如果您使用明智的超時,而不是立即返回,系統應該將您的過程視爲互動,並且延遲應該消失。

如果有一個指向select ing的單一描述符與0超時,我無法弄清楚它是什麼。爲什麼不嘗試操作,看看你是否得到了EWOULDBLOCK錯誤?

爲什麼不使用一個合理的超時時間,以便系統在其他任何進程運行時都可以運行?

+0

我刪除了select(),因爲你是正確的,所以沒有必要。你看不到的是我在代碼中的其他地方有一個處理器。我正在使用usleep(),但我正在研究高分辨率計時器是否更好。我無法阻止閱讀,因爲無論有沒有東西需要閱讀,我都有廣播。 – amo 2012-01-27 19:20:16

+0

因此,找出多久,直到你的下一個廣播和塊在'選擇'那麼長。這比'usleep'要好得多。 – 2012-01-27 19:28:45

+0

read()調用只要我的睡眠時間長達3倍。 – amo 2012-01-27 22:01:52

相關問題