2010-02-17 2 views
5

이벤트 기반 직렬 포트 통신 (직렬 포트 폴링과 비교)을 평가할 수있는 WPF 테스트 응용 프로그램이 있습니다. 문제는 DataReceived 이벤트가 전혀 실행되지 않는 것입니다..NET SerialPort DataReceived 이벤트가 실행되지 않음

저는 사용자 입력 용 TextBox, 출력 용 TextBlock 및 직렬 포트에 입력을 작성하는 버튼이있는 매우 기본적인 WPF 형식을 사용합니다. 여기

코드입니다 : 이제

public partial class Window1 : Window 
{ 
    SerialPort port; 

    public Window1() 
    { 
     InitializeComponent(); 

     port = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One); 
     port.DataReceived += 
      new SerialDataReceivedEventHandler(port_DataReceived); 
     port.Open(); 
    } 

    void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     Debug.Print("receiving!"); 
     string data = port.ReadExisting(); 
     Debug.Print(data); 
     outputText.Text = data; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Debug.Print("sending: " + inputText.Text); 
     port.WriteLine(inputText.Text); 
    } 
}

, 여기에 복잡한 요인 :

  1. 내가에는 시리얼 포트가없는 일하고 노트북은, 그래서 나는 조각을 사용하고 있습니다 가상 직렬 포트 에뮬레이터라는 소프트웨어는 COM2를 설정합니다. VSPE는 과거에 훌륭하게 작동 해 왔으며 .NET의 SerialPort 클래스에서만 오작동하는 이유는 분명하지 않지만 다만이를 언급합니다.

  2. 내 양식의 단추를 눌러 데이터를 보내면 내 하이퍼 터미널 창 (COM2에 연결됨)에서 데이터가 통과하고 있음을 알 수 있습니다. 예, 포트를 읽을 수있는 양식의 기능을 테스트 할 때 하이퍼 터미널을 연결 해제합니다.

  3. 이벤트를 연결하기 전에 포트를 열어 보았습니다. 변경 없음.

다른 게시물에서 비슷한 문제가있는 다른 게시물을 읽었습니다. 이 정보의 아무도는이 경우에 나를 도왔다.

편집 :

여기 (http://mark.michaelis.net/Blog/TheBasicsOfSystemIOPortsSerialPort.aspx에서 수정) 콘솔 버전입니다 : 이것은 스레딩 문제 (나는 생각한다)의 것을 모든 우려를 제거해야

class Program 
{ 
    static SerialPort port; 

    static void Main(string[] args) 
    { 
     port = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One); 
     port.DataReceived += 
      new SerialDataReceivedEventHandler(port_DataReceived); 
     port.Open(); 

     string text; 
     do 
     { 
      text = Console.ReadLine(); 
      port.Write(text + "\r\n"); 
     } 
     while (text.ToLower() != "q"); 
    } 

    public static void port_DataReceived(object sender, 
     SerialDataReceivedEventArgs args) 
    { 
     string text = port.ReadExisting(); 
     Console.WriteLine("received: " + text); 
    } 
}

. 이것도 작동하지 않습니다. 다시 하이퍼 터미널은 포트를 통해 전송 된 데이터를보고하지만 콘솔 앱은 DataReceived 이벤트를 발생시키지 않습니다.

편집 # 2 :

내가 보내고 직렬 포트에서 수신해야 모두 두 개의 응용 프로그램을 가지고 것을 깨달았다, 그래서 동시에 실행하기로 결정했습니다 ...

나는 경우, 콘솔 응용 프로그램에 입력하면 예상되는 스레딩 오류 (처리 방법을 알고있는)와 함께 WPF 응용 프로그램 DataReceived 이벤트가 발생합니다.

WPF 앱에 입력하면 콘솔 앱의 DataReceived 이벤트가 발생하고 데이터가 에코됩니다.

VSPE 소프트웨어를 사용하고 있는데, 직렬 포트 하나를 입력과 출력으로 처리하도록 설정되어 있다고 생각합니다. 그리고 SerialPort 클래스의 이상한 점을 통해 직렬 포트의 한 인스턴스는 송신자와 수신자가 될 수 없습니다. 어쨌든, 나는 그것이 해결되었다고 생각한다.

답변

0

난 단지 추측 할 수 있습니다 : 당신은 당신이 런타임에 사용할 수있는 포트를 선택 할 수 있도록 제어의 일종을 만들려면, 다음 명령은 사용 가능한 포트 당신에게 줄 것이다 직렬 포트 에뮬레이터 프로그램. 이 소프트웨어에 문제가 있다는 말은 아닙니다. VSPE는 지금까지 저에게 매우 잘 작동했습니다. 그러나 내 코드와 VSPE 커넥터를 어떻게 설정했는지간에 약간의 충돌이있었습니다.

3

확실히 말할 수는 없지만 스레딩 문제가있을 수 있습니다. WPF는 스레딩을 다르게 처리하며 가상 포트의 폴링은 비동기 적입니다. Windows Forms 또는 콘솔 응용 프로그램에서이 작업을 시도하여 전혀 작동 할 수 있음을 증명 했습니까?

+0

위의 콘솔 버전을 참조하십시오. 불운. – Klay

2

정확히 동일한 설정을 사용했지만 완벽하게 작동하지만 거기에 도달하기 위해 많은 문제를 해결해야했습니다. COM 포트가 폐쇄 된 경우 내가 자주 확인 이후

comControl = new SerialPort(); 

//This is important - determine your min nb of bytes at which you will fire your event, mine is 9 
comControl.ReceivedBytesThreshold = 9; 

//register the event handlers 
comControl.DataReceived += new SerialDataReceivedEventHandler(OnReceive); 
comControl.PinChanged += new SerialPinChangedEventHandler(OnPinChanged); 

내가 열린 포트와 가까운 포트 방법을 구분 : 내 최초의 선언처럼 보이는 이유는 다음과 같습니다

이다.

public bool OpenPort() 
{ 
    try 
    { 
     //must keep it open to maintain connection (CTS) 
     if (!comControl.IsOpen) 
     { 
      comControl.Open(); 
      comControl.RtsEnable = true; 
     } 
    } 
    catch (Exception e) 
    { 
     //error handling here 
    } 
} 

마지막으로, 당신의 가상 COM 포트 드라이버가 제대로 설치되어 있는지 확인하고 당신은 바로 포트, 플러그를 사용하고 있는지 내 어댑터가 충분하지에 대해 재생할 수 있습니다. 문제가 가상으로 참이었다

System.IO.Ports.SerialPort.GetPortNames() 
+0

편집 한 후 일부 문제가 해결되었다는 것을 알았지 만 "직렬 포트 클래스의 이상한 점을 통해 직렬 포트의 인스턴스 하나가 송신자와 수신자가 될 수 없다"고 언급했습니다. 이것은 사실이 아닙니다. SerialPort 클래스는 송신자와 수신자가 될 수 있습니다. 당신은 일이 어떻게 든 운동하는 것처럼 보이기 때문에, 나는 정교하지 않을 것입니다 :) – Roast

+0

그럼 분명히 이상하게 들리는 것은 SerialPort 클래스에있는 것이 아니라 가상 직렬 포트 소프트웨어와 연결하는 것 같습니다. – Klay

+0

+1 - RTS 핀을 Enabled로 설정하는 것을 잊었습니다. 하드웨어 흐름 제어 기능을 잊어 버렸습니다. –

0

VSPE가 일반 SP 일지라도 Form에서 드라이버를 실행할 때 비슷한 문제가 발생했습니다. 충분히 고정 된 콘솔 앱에이를 포함시키는 것으로 옮겨가는 STA 모델 문제라고 생각합니다.

0

VSPE도 사용합니다! 그것은 똑같이 작동합니다 .. 나는 똑같은 문제를 안고있었습니다. 고정 된 방식으로 두 개의 COM 포트를 두 개의 가상 COM 포트를 만드는 대신 VSPE에서 페어링하는 것이 었습니다.

0

최근에 비슷하게 이상한 문제가 발생했습니다. 그러나 몇몇 기계에서만. Dave Swersky이 언급했듯이 특히 .NET 4.0 이상에서 실행중인 경우이 문제가 스레딩 문제 일 수 있습니다.

.NET 4.0에서 이벤트 핸들러는 ThreadPool 스레드에서 트리거되며 특정 상황에서는 발생하기 전에 상당한 지연이 발생할 수 있습니다. .NET 2.0에서 완벽하게 작동했던 제 코드에서 .NET 4.5로 업그레이드하자마자 문제가 발생했습니다. 이벤트 처리기는 예상보다 훨씬 늦게 트리거되고 때로는 트리거되지 않습니다. 모두!)

완료 스레드의 값이 더 큰 ThreadPool.SetMinThreads(...)을 호출하면 문제는 도착한 것처럼 빨리 사라집니다. 우리의 응용 프로그램의 맥락에서 ThreadPool.SetMinThreads(2, 4) 충분했다. (ThreadPool.SetMinThreads를 호출하여 얻은) 문제가 기본값을 관찰 기계에 그래서 데이터가 수신되지 않았다, 이것은 나를 위해 그것을 해결 모두 2

7
port.DtrEnable = true; 

의 DataTransmitReady 플래그가 활성화되지 않았습니다했다.

+1

이것은 태블릿에 연결된 저울로 5 시간을 고생 한 후에도 저에게 효과적이었습니다. 한 회사의 균형 (OHaus)은이 라인없이 잘 전달되었지만 다음 회사의 균형 (Sartorius)은 그렇지 않았습니다. – jaredbaszler

0

2 일 전 동일한 문제가 있었으며 오늘 앱을 제공해야하므로 큰 두통이있었습니다. 그래서 .. 너무 많은 googleashion 후에 나는이 문제가 내 코드가 아닌 또 다른 일이라고 생각했다.

내 솔루션은 입니다. McAfee 바이러스 백신 및 이와 관련된 모든 것입니다. McAfee의 로그를 볼 때 스레드 중지에 대한 레코드가 있었고 SerialDataReceivedEventHandler()이 스레드에서 실행되었다고 가정했습니다.

이 솔루션이 효과가 있기를 바랍니다. 문안 인사.

관련 문제