2013-06-04 3 views
0

내 PC에 연결된 여러 직렬 장치가 있고 사용자가 원하는 포트를 선택할 수있는 프로그램에서 일하고 프로그램을 TabPage 동적으로 만들고 TabControl 추가합니다 .Dynamicaly 만든 SerialPort 오류없이 응답하지 않습니다

각 탭 페이지에는 지정된 직렬 포트에서 들어오는 데이터를 표시하는 여러 줄 TextBox가 있습니다. 나는 단지 하나의 SerialPort를 추가하는 경우

private void AddSerialPort(string portName) 
{ 
    var page = new TabPage(portName); 

    page.Text = portName; 

    var tb = new TextBox(); 
    tb.Name = portName; 
    tb.Dock = DockStyle.Fill; 
    tb.BackColor = Color.Black; 
    tb.ForeColor = Color.White; 
    tb.Multiline = true; 
    page.Controls.Add(tb); 
    tabControlActiveSerialPorts.TabPages.Add(page);  

    //Define serial port 
    var sp = new SerialPort(portName, 115200, Parity.None, 8, StopBits.One);     

    sp.DataReceived += delegate 
    { 
     if (tb.InvokeRequired) 
     { 
      tb.Invoke(new Action(() => 
      { 
       var incoming = sp.ReadExisting(); 
       tb.Text += incoming;     
      })); 
     } 
     else 
     { 
      var incoming = sp.ReadExisting(); 
      tb.Text += incoming; 
     } 
    }; 

    sp.Open(); 
} 

문제는, 잘 작동하고 텍스트 상자가 채워집니다 :

다음은 동적으로 이러한 컨트롤을 만들려고 내 코드입니다. 하지만 다른 SerialPort을 추가하자마자 몇 초가 지나면 첫 번째 또는 두 번째 추가 된 SerialPort가 작동을 멈추고 다른 하나는 여전히 작동합니다 (이것은 완전 무작위로 첫 번째 또는 두 번째 중 하나가 텍스트 상자에 데이터를 채우지 않으며 해당 없음 내 하드웨어!) 나는 그것이 무엇을 위해 지정된 텍스트 상자가 더 이상 채워지지 않을 것이라는 것을 의미한다.

디버거에서 오류가 발생하지 않습니다 ...이 작동하지 않습니다! 어떤 아이디어가 문제 일 수 있습니까?

내가 단 1 개의 시리얼 포트를 추가한다면, 괜찮습니다.

Invoke 대신 BeginInvoke을 시도했지만 아무 것도 변경하지 않았습니다.

답변

1

SerialPort 개체가 삭제 될 수 있습니다. 모든 새로운 개체를 목록에 추가하려고 시도하십시오.

class Class 
{ 
    List<SerialPort> ports = new List<SerialPort>(); 

    private void AddSerialPort(string portName) 
    { 
     ... 
     var sp = new SerialPort(portName, 115200, Parity.None, 8, StopBits.One); 
     ports.Add(sp); 
     ... 
    }  
} 
+0

문제를 해결하는 것 같습니다! 나는 실제로 같은 것을하고 싶었다 : 어쨌든 D 덕분에! –

관련 문제