2010-05-17 4 views
2

직렬 (COM1) 데이터가 전송되지 않는 것으로 보이는 C# 응용 프로그램이 있습니다. 내 코드의 단순화 된 코드 조각 (텍스트 상자 쓰기에 대한 호출이 제거되었습니다) 다음과 같은 :직렬 데이터가 C# 응용 프로그램으로 전송되지 않음

InitializeComponent() 
    { 
     // 
     // serialPort1 
     // 
     this.serialPort1.BaudRate = 115200; 
     this.serialPort1.DiscardNull = true; 
     this.serialPort1.ReadTimeout = 500; 
     this.serialPort1.ReceivedBytesThreshold = 2; 
     this.serialPort1.WriteTimeout = 500; 
     this.serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived); 
    } 

     if (radioButtonUart9600.Checked) 
     { 
      serialPort1.BaudRate = 9600; 

      try 
      { 
       serialPort1.Open(); 
      } 
      catch (SystemException ex) 
      { 
       /* ... */ 
      } 
     } 

     try 
     { 
      serialPort1.Write("D"); 
      serialPort1.Write(msg, 0, 512); 
      serialPort1.Write("d"); 
      serialPort1.Write(pCsum, 0, 2); 
     } 
     catch (SystemException ex) 
     { 
      /* ... */ 
     } 

어떤 이상한 것은 포트가 115.2Kbps 통신을 위해 구성 할 때이 동일한 코드가 잘 작동한다는 것입니다. 그러나이 코드로 전송해야하는 9600bps 데이터를 전송하면 전송되지 않는 것 같습니다. 원격 장치의 수신 플래그를 모니터링하여이를 확인했습니다. try 문에서 예외가 발생하지 않습니다. 데이터가 전송되는지 확인하기 위해 수행해야하는 다른 작업 (플러시 등)이 있습니까? 어떤 생각이나 제안을 주시면 감사하겠습니다. Microsoft Visual C# 2008 Express Edition을 사용하고 있습니다. 감사.

답변

4

이러한 try/catch 블록을 제거하십시오. 그렇게하면 WriteTimeout 값을 너무 낮게 설정했기 때문에 TimeoutException을 볼 기회가 생깁니다. 9600 보오에서 516 바이트를 전송하는 데는 538 밀리 초가 걸립니다.

귀하의 다른 설정도 문제를 해결하는 방법입니다. ReceivedBytesThreshold 및 DiscardNull 제거하십시오.

+0

내 대답보다 훨씬 낫다. –

+0

고마워, 한스. WriteTimeout을 늘리면 트릭을 만들었습니다. ReceivedBytesThreshold 및 DiscardNull을 설정하는 것은이 특정 응용 프로그램에 대해 의도적이었습니다. 원격 장치는 항상 2 바이트 응답을 보내야하며 때로는 NULL을 보낼 수 있습니다. 따라서 NULL 값은 무시해야합니다. –