2013-04-01 22 views
2

我有一臺通過串行通信(即物理或仿真串行端口的RS-232/RS-422)與外部設備連接的計算機。它們通過頻繁的數據交換(30Hz)相互通信,但只有小數據包(每個包少於16個字節)。具有最小延遲的串行通信

通信的最關鍵的要求是發送和接收之間的低延遲或延遲。

數據交換模式是握手狀。一臺主機設備啓動通信並不斷在客戶端設備上發送通知。客戶端設備需要儘快回覆來自主機設備的所有通知(這正是需要實現低延遲的地方)。通知和回覆的數據包定義良好;即數據長度是已知的。 基本上數據丟失是不允許的。

我已經使用以下共同運API函數來執行I/O以同步的方式讀/寫: 的CreateFile,ReadFile的,WriteFile的

的客戶端設備使用的ReadFile於來自主機設備讀取的數據。一旦客戶端讀取長度已知的完整數據包,它將使用WriteFile通過相應的數據包回覆主機設備。讀取和寫入始終是順序的,沒有併發性。

不知何故通訊速度不夠快。即數據發送和接收之間的時間間隔過長。我想這可能是串口緩衝或中斷的問題。

這裏我總結了一些可能的改進延遲的操作。 請給我一些建議和更正:)

  1. 調用CreateFile與FILE_FLAG_NO_BUFFERING標誌?我不確定這個標誌在這方面是否相關。
  2. 在每個WriteFile之後調用FlushFileBuffers?或者任何可以通知/中斷串口立即傳輸數據的動作?
  3. 爲處理串行通信的線程和進程設置更高的優先級
  4. 爲模擬設備(及其驅動程序)設置延遲計時器或傳輸大小。但物理串行端口如何?
  5. Windows上的任何等價物,比如Linux下的setserial/low_latency?
  6. 禁用FIFO?

在此先感謝!

+0

您是否嘗試調整[超時](http://msdn.microsoft.com/en-us/library/windows/desktop/aa363437%28v=vs.85%29.aspx)?究竟是「不夠快」?重疊IO,事件驅動...? – dyp

+0

這將取決於硬件。您是否使用USB串行端口,串口卡或位於主板上的卡? –

+0

設置超時可能無助於我的情況。我的設備需要做非常低的延遲一些握手般的數據交換,不允許任何數據丟失。 「沒有足夠快的」是指從一個設備發送數據和由其它一個接收之間的時間間隔的時間太長。 – elgcom

回答

1

我遇到過類似的串口問題。 在我的情況下,我解決了減少串口延遲的問題。 您可以使用控制面板更改每個端口的延遲(默認設置爲16毫秒)。 你可以在這裏找到方法: http://www.chipkin.com/reducing-latency-on-com-ports/

祝您好運!!!