2010-08-19 3 views
0

이번에는 아주 간단한 질문입니다. 다른 컴퓨터에서 다른 응용 프로그램 복사본과 통신하는 응용 프로그램이 있습니다. 한 응용 프로그램은 꽤 일정한 데이터 스트림을 보내고 다른 응용 프로그램은 데이터를 수신합니다.SerialPort 연결 개선

private void bgDataWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e){ 
    try{ 
     string tempStr = Convert.ToString(String.Format("{0:0.000000}", data)); 
     serialPort.Write(tempStr); // Write "data" out to 6 decimal places 
    } 
    catch (TimeoutException){ } 
    catch (InvalidOperationException err){ // Port is obstructed or closed 
     this.Invoke((MethodInvoker)delegate{ 
      MessageBox.Show(this, "Couldn't send wireless data:\n\n" + 
          err.ToString(), "NanoMETER - Wireless Error (Data)", 
          MessageBoxButtons.OK, MessageBoxIcon.Error); 
      Global.remoteEna = false; 
      serialPort.Close(); 
      usingBT = false; 
     }); 
    } 
} 

그것은 타이머에라고 (serialPort는 C# 닷넷 2.0의 System.IO.Ports.SerialPorts 클래스의 인스턴스 임)

데이터를 전송하는 코드는 다음과 같습니다. 수신 코드는 더욱 간단하다 : 데이터 전송 및 처리하고 그것을 잘 멋쟁이 모든하지만이 중 하나를 안정적으로 일정한 속도로 데이터를 전송 아니에요 원하지 않는 물결이 거침이, 또는이 모든 것을 따기 아니에요됩니다

private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { 
    string buffer = serialPort.ReadExisting(); 
    HandleInput(buffer); 
} 

. 내 코드에서이 문제를 해결할 수 있는지, 아니면 느린 컴퓨터와 흔들릴 수있는 블루투스 연결을 사용하는 것만 큼 확실하지 않습니다. 어떤 제안?

+0

왜 타이머에서 호출됩니까? 이벤트에 의해 트리거되지 않아야합니까? – Fosco

+0

Bgw DoWork()가 타이머에서 호출 되었습니까? –

+0

@Fosco : 타이머의 이벤트로 인해 데이터가 계속 변경됩니다. 하지만 데이터 값이 업데이트되는 즉시 호출해야한다는 제안을 받고 있다고 생각합니다. 덧붙여 말하자면, 그것은 여전히 ​​타이머에있을 것이고 아마도 많은 차이를 만들지는 않을 것이다. 그러나 나는 그 논리를 이해한다. 참고 : 저는 오래된 VB6 프로그램을 인턴쉽을 위해 C# (2 개월 전에 모르는 언어)에 적용하고 있습니다 ... 그래서 WTF가 기대 될 수 있습니다. – KChaloux

답변

1

인턴이 이전 코드를 최신 플랫폼으로 변환하는 일은 드물지 않습니다.

몇 가지 개선 사항이 있습니다.

1) 다음 전략은 포트를 통해 전송 된 바이트가 명령과 같은 블록으로 해석 될 때 유용합니다. 어떤 종류의 프로토콜이 있습니까? 보내는 메시지의 형식을 지정하는 것. 예를 들어 다가오는 명령의 시작과 길이를 나타내는 특정 구분 기호. 이렇게하면 명령을 절반 만 전송했는지 또는 누락 된 바이트가 있는지 신속하게 확인할 수 있습니다. 끝에 CRC를 추가하는 것이 더 좋습니다.

2) 타이머를 읽는 대신 직렬 포트 개체가 표시 한 이벤트를 기반으로하십시오. 여기에 내가 무엇을 사용의 예 : 위의 코드에서

//OnReceive event will only fire when at least 9 bytes are in the buffer. 
    serialPort.ReceivedBytesThreshold = 9; 
    //register the event handlers 
    serialPort.DataReceived += new SerialDataReceivedEventHandler(OnReceive); 
    serialPort.PinChanged += new SerialPinChangedEventHandler(OnPinChanged); 

, 난 9의 문턱을 설정, 당신은 당신의 상황에 맞는 무엇에 그 변경해야합니다. 또한 Pinchanged 이벤트는 모니터링하기 좋은 것이므로 케이블 연결이 끊어 졌는지 빠르게 확인할 수 있습니다. 이 점에 관해서는 CTSChanged와 관련하여 더 많은 내용이 있지만 관심이 있다면 찾아 볼 수 있습니다.

마지막으로 이것이 도움이되지 않는다면 문제가 발생했음을 보여주고 여기서 peolpe가 도움을 줄 수 있습니다.

+0

도움에 감사드립니다. 물론 대답에 대한 크레디트가 맞지만, 불행히도 너무 늦어서보고 싶었습니다. 인턴쉽은 솔루션을 게시 할 때 종료되었습니다. 관계없이 입력 해 주셔서 감사합니다. – KChaloux