2012-07-12 3 views
4

rs232 장치를 여러 개의 SerialPort.Write 명령을 서로 바로 보내려고합니다. 그러나, 나는 한번에 여러 개의 WRITE 명령을 처리 할 수 ​​있다고 생각하지 않는다.쓰기에 적당한 순간을 기다리는 방법?

현재 WRITE 사이의 지연을 위해 Thread.Sleep (500)을 사용하고 있지만 보내려는 시간을 감지 할 수있는 방법이 있습니까? 아니면 완충제로?

예제 코드

인터페이스

private void btn_infuse_Click(object sender, RoutedEventArgs e) { 
     cmd.SetTargetInfusionVolume(spmanager, double.Parse(tbox_targetvolume.Text)); 
     cmd.StartInfuse(spmanager);//cmd object of Command class 
} 

명령 클래스

public void StartInfuse(SPManager spm){ 
     spm.Write("RUN");//spm object of serialportmanager class 
    } 
    public void SetTargetInfusionVolume(SerialPortManager spm, double num) { 
     spm.Write("MLT " + num.ToString()); 
    } 

SerialPortManager 클래스

 public void Write(string sData) { 
     if (oSerialPort.IsOpen) {//oSerialPort object of SerialPort class 
      try { 
       oSerialPort.Write(sData + "\r"); 
      } 
      catch { MessageBox.Show("error"); } 
     } 
    } 
+2

SerialPort.Handshake 속성이 장치가 흐름 제어에 사용하는 것과 일치하는지 확인하십시오. –

답변

1

만약 한스 아빠로서 특히 직렬 포트 설정 (, sssant, flow control)이 정확하다면, 속도 문제는 사용자가 너무 빠른 메시지를 보낼 때 장치가 메시지를 충분히 빠르게 처리하지 못하거나 메시지 사이에 "자동"간격이 예상되는 경우가 많습니다 그들을 묘사하기 위해서.

이 경우에는 전송 지연을 도입하는 Sleep()이 매우 합리적인 방법입니다. 장치가 너무 오랫동안 응용 프로그램을 정지시키지 않고 메시지를 성공적으로 처리 할 수 ​​있도록 현명한 지연을 찾아야합니다.

너무 자주 시행 착오가 있지만 장치의 설명서를 참조하십시오. 대부분의 장치가 메시지 패킷의 끝을 나타 내기 위해 전송 간격을 사용하기 때문에 (예 : 종종 사용자가 예를 들어 2400 bps 링크에서 10 비트 상당의 "무음 시간"을 지정한 경우 10시/2400 초 또는 4 밀리 초 분량에 해당합니다. 그러나 데이터를 버퍼링하는 경향이 있으므로 (예 : 몇 밀리 초 동안 데이터를 전송할 필요가 있는지 알아보기 위해) 모든 데이터가 창에 의해 손상 될 수 있습니다. 따라서 더 많은 데이터를 전송하도록 요청할 수 있습니다. 이 작업을 수행하려면 엄격하게 요구되는 것보다 훨씬 더 긴 지연이 필요합니다 - 어쩌면 15-20ms. 그리고 물론, 나는 틀린 나무를 짖는 소리 일 수 있었고 당신은 그것을 작동 시키려면 500 밀리미터 정도의 큰 것이 필요할지도 모른다.