2013-04-22 94 views
2

我有一個C#程序可以同時從兩個串口讀取。串口設備是一個Prolific USD到4串口適配器,我將兩個硬件插在適配器的不同端口上。問題是,當我從每個端口讀取一個端口時,一切正常,但是當我嘗試從兩個端口同時讀取時,其中一個端口沒有響應。爲了解決這個問題,我啓動了應用程序的兩個實例,並能夠一次從兩個端口讀取(應用程序的每個實例都有一個)。有誰知道如何在一個應用程序中同時讀取兩個獨立的串行端口?謝謝。同時從兩個串口讀取

添加一些代碼:

端口1:

//按鈕來啓動或停止端口1閱讀因爲硬件要求我讀響應之前寫,寫的是在計時器完成

private void buttonPort1_Click(object sender, EventArgs e) 
    { 
     if (buttonPort1.Text == "Start Recording") 
     { 
      if (!port1.IsOpen) 
      { 
       port1.Open(); 
      } 
      timerPort1.Start();     
      buttonPort1.Text = "Stop Recording"; 
     } 
     else 
     { 
      timerPort1.Stop(); 
      buttonPort1.Text = "Start Recording"; 
     } 
    } 

//寫「d」硬件每次收到迴響應

private void timerPort1_Tick(object sender, EventArgs e) 
    {    
      port1.Write("D"); 
    } 


void port1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     try 
     { 
      string result = port1.ReadLine(); 
      oneParamDelegate dg = PHandCondResult; // send back the result to the main thread 
      this.Invoke(dg, result); 
     } 
     catch 
     { 
     } 

    } 

端口2

用於第二端口的代碼是與上述類似真,區別在於不同的端口,DataReceived事件檢索和定時器。

我會嘗試Grant Thomas建議的多線程選項:我以前沒有嘗試過,因爲我認爲串行端口已經在單獨的線程上工作:datareceived事件不會阻塞主線程, t在主線程上創建的訪問控制,但我仍然會使用後臺工作人員並稍後恢復。謝謝大家的快速回復。

+0

你可以添加一些代碼嗎? – 2013-04-22 12:43:53

+0

您是使用多個線程還是隻使用一個線程? – 2013-04-22 12:43:54

+0

你用這種方式實現了dataReceived事件: http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx ? 對我來說,目前還不清楚spPH是什麼。 – 2013-04-22 13:22:30

回答

5

你將需要做一些閱讀,特別是在Threading

如果你有,比如說,一些代碼,看起來像這樣:

ReadDataFromSomePort(); 
ReadDataFromSomeOtherPort(); 

然後第一個將執行同步(阻塞)和然後後者。這發生在同一個線程,主應用程序線程上。當你想做異步的事情時,包括只做一件事,同時保持UI交互/響應,那麼你需要將工作委派給其他線程。

所以,你最終的東西是這樣的:

var thread1 = new Thread(ReadDataFromSomePort); 
var thread2 = new Thread(ReadDataFromSomeOtherPort); 

thread1.Start(); 
thread2.Start(); 

還有更多比這一點,放心,所以我建議在繼續之前的概念,一些研究。

MSDN有tutorial/programming reference for threading這應該讓你開始。

+1

使用兩個後臺工作者解決了我的問題。這並不完全如上所述,但這足以讓我指出正確的方向,所以我接受了這個答案。非常感謝你。 – falopsy 2013-04-22 15:48:16

1

創建SerialPort兩個不同的對象和不同的DataReceived事件都應該工作。

+0

並使用線程。可能是一次讀取會阻塞所有端口的所有數據的問題。 – 2013-04-22 12:46:36

+0

@EricSmekens我曾在單個線程應用程序中使用多個串行端口。所以我不認爲這是事情。 – Virus 2013-04-22 12:47:33

+2

@falopsy您可以請允許我們查看代碼...以便我們可以更好地理解。 – Virus 2013-04-22 12:48:16