2012-06-25 32 views
3

我正在開發一個應用程序,與8個COM端口一起工作,當從一個COM端口接收數據時,調用事件處理程序,應用程序爲通過COM端口接收的消息創建封裝器,並通過TCP將其發送到遠程主機。事實上,在包裝之後,它成爲基於以太網的網絡中某個設備的命令(開始測量命令)。審訊組織,超時

我正在使用SerialPort和SerialDataReceivedEventHandler處理COM端口。問題是我有一個超時(0-1000毫秒)通過窗體爲每個COM端口指定不同。在這個超時之後,我必須發送另一個命令從設備獲取一些數據(獲取數據命令)。

  • 該命令僅通過COM端口接收數據和發送第一命令之後是每8個COM端口
  • 該命令應當sended不同
  • 兩個命令之間超時是針對每個COM端口不同

您是否對超時組織有任何建議?謝謝。

我有一個想法,但我不知道是否有可能: 我有8個事件處理函數爲每個COM端口。

...something 
sendFirstCommand(); 
Thread.Sleep(comPortNTimeout); 
sendSecondCommand(); 

我可以在他們每個人中使用相同的結構嗎?例如,如果在第二個端口的處理程序中調用數據Thread.Sleep(),將不會凍結第一個端口的處理程序?

回答

2

1)引入某種CommandSourceContext類,它封裝與每個COM端口的所有參數(見下文)

2)要查看處理器是否會結冰,而在其他端口事件已經提升 - 只是測試它調試器並查看是否所有端口事件都在同一個線程中調用。您可以使用Visual Studio 2010線程窗口,只需在COM端口事件處理程序中放置一個斷點,並查看當前線程標識是什麼。如果您使用較舊的Visual Studio - 只需通過Thread.CurrentThread.ManagedThreadId登錄線程Id即可訪問它。因此,如果來自不同端口的事件在同一個線程中調用 - 顯然處理程序會阻塞每個端口,否則將在不同線程中調用它們並行運行。至少MSDN表示(參見本答案的底部),數據收到的事件不在主線程中引發,因此訪問UI控件時必須小心。

interface ICommandSourceContext 
{ 
    // Since each port has own specific command 
    // we can encapsulate it in the context as well 
    ICommand Command { get; } 

    int PortNumber { get; } 
    long TimeIntervalMilliseconds { get; } 
    Action<SerialDataReceivedEventArgs> Callback { get; }  
} 

// setup and add all contexts 
IList<ICommandSourceContext> contexts = new List<ICommandSourceContext>(); 

// ideally your main code block should looks like below (this is only pseudo code) 
foreach (var context in contexts) 
{ 
    // to execute it asyncronously you can use TPL Task.Start() 
    // so it would not block other handlers in case of single thread 
    context.Command.Execute(); 
    Thread.Sleep(context.TimeIntervalMilliseconds); 
} 

SerialPort.DataReceived Event remarks

DataReceived事件上的副螺紋凸起當數據是從所述的SerialPort對象接收 。由於此事件在 輔助線程(而不是主線程)上引發,因此嘗試在主線程(例如UI元素)中修改某些 元素可能會引起線程異常 。如果有必要修改元素在主 窗體或控件,使用回調用,後變更請求,這將做 適當的線程

+0

謝謝你的工作,它是真正偉大的,有用的帖子。不幸的是,我的工作站沒有機會獲得至少一個額外的串行端口。我將來只能測試這個問題。 – vard

+0

您可以創建一個很好的測試工具來模擬多個端口,並確保您的實現正常工作,這對您長期以來也會有用 – sll

+0

實際上,如果我有8個用於這種應用程序的COM端口設備,我會使用這些rs232到以太網設備,所以你的SW可以直接處理以太網,而不會混淆串口。 http://www.perle.com/products/RS232-to-Ethernet.shtml?utm_source=ppc&utm_medium=cpc&utm_campaign=server – TJD