2010-02-09 2 views
1

오늘 들었던 가장 이상한 버그가있을 수 있습니다.직렬 포트 통신의 버그

나는 형식이 지정된 데이터를 RS232 LED 디스플레이로 전송하는 스레드 안에이 (매우 긴) 방법을 가지고 있습니다.

그것은 잘이

TITLE 
SUBTITLE 1 
ELEMENT 1 
ELEMENT 2 
SUBTITLE 2 
ELEMENT 1 
ELEMENT 2 
ELEMENT 3 

, 그것의 자신의 메시지에 각각 같은 것을 표시해야합니다.

각 메시지 다음에 Thread.Sleep (N)이 호출됩니다 (각 메시지가 N 번 표시되도록).

  • 는 N은

좋아, 모두가 지금까지 괜찮 초되고. 나는 메시지를 보낼 때

TITLE 
TITLE 
TITLE 
TITLE 
TITLE 
TITLE 
TITLE 
TITLE 

내가 경고음을들을 수 있습니다 : 문제는 (10 <= N <= 20) 만약 내가 다음과 같은 출력을 얻을 수 있다는 것입니다. 나는 심지어 내가 보낸 정보가 똑같은지 확인하기 위해 시리얼 포트 모니터를 설치했다.

그래서 단지 요약 :

쓰기를 직렬 포트에 N에 대한 < = 9 잘못된 출력을 생성합니다 사이에서 N> = 20 건을 실을 자고 후 출력 캐시 또는 뭔가했다 작동하는 경우처럼

이것은 무엇입니까?

업데이트

  • 좋아, 내가 System.Threading.Sleep 인수로 밀리 초 소요 알고있다. 그 숫자에 1000을 곱하면됩니다.
  • LED 디스플레이가 잘 형식화 된 새로운 메시지를 수신 할 때마다 경고음이납니다. 나는 그것을 분명히해야만했다. 여기

은 내가 LedScreen 클래스를 작성 (이것은 첫 타이틀을 전송)

  using (var ld = new LedScreen(COM)) 
      {      
       ld.AddEffect(LedScreen.Effects.Snow); 
       ld.AddText(LedScreen.Colors.Red, titulos[ThreadControl.Fase]); 
       ld.AddEffect(LedScreen.Effects.DSnow); 
       ld.Write(); 
      } 

      //Console.WriteLine(titulos[ThreadControl.Fase]); 
      //esperamos N tiempo (titulo) 
      Thread.Sleep(TiempoTitulo); 

코드 조각입니다. 쓰기 방법은 이것이다 : 나는 마침내 그것이 작동있어 2

public void Write() 
    { 
     //caracteres de terminacion 
     buffer.AddRange(new byte[] { 0xBF, 0xB1 }); 
     try 
     { 
      if (!sp.IsOpen) sp.Open(); 
      sp.Write(buffer.ToArray(), 0, buffer.Count); 
     } 
     finally 
     { 
      sp.Close(); 
     } 
    } 

업데이트 각 전에

직렬 포트에 쓰기, 내가 보내 (추한 수정하지만, MEH합니다.) 지체없이 "공백"메시지. 실제 메시지를 보내기 전에 화면을 지 웁니다. 만세! 그리고 그것은 내가 잠드는 시간 (초)에 상관없이 작동합니다.

+0

수면을 감추고 직렬 메시지를 보내는 코드 스 니펫을 게시 할 수 있습니까? –

+0

.NET 2.0 이후 직렬 통신 구성 요소에는 알려진 문제점이 있습니다 ... .NET 3.5에서 해결 될 것으로 기대되었지만 희망이 없습니다 ... – t0mm13b

+2

문제가 누구인지 진단 할 수있는 질문은 없습니다 아마도. "삐"가 무엇을 의미하는지 알아보십시오. SerialPort는 신호음을 내지 않습니다. –

답변

1

우선, 스레드의 휴면 시간을 명확히 할 수 있습니까? System.Threading.Thread.Sleep()은 '초'인수가 아니라 밀리 초의 인수를 사용합니다.

다음으로 직렬 포트 write()가 성공했음을 알고 있습니까?(10 ~ 20 밀리의 하드 코딩 지연은 반드시 항상 긴 충분하지 않습니다.)

이 초과하는 것을 방지하기 위해, 내가 좋아하는 뭔가를 할 :

아닌 당신의 상황에 영향을 미칠 수있는 여러 가지가 있습니다
public bool Send(byte[] bytes) 
    { 
     try 
     { 
      serialPort.Write(bytes, 0, bytes.Length); 
      return true; 
     } 
     catch (Exception ex) 
     { 
      // log or note the error: can be TimeoutException or InvalidOperationException, etc 
      return false; 
     } 
    } 
1

적어도 이미 언급 한 것은 "당신은 초를 말하고 있지만 Sleep()은 초가 아니라 수 밀리 초가 걸린다"는 것이다.

보낸 문자 사이의 길이를 확인해야합니다. 흐름 제어도. 직렬 포트 매개 변수 (전송 속도 등). 그리고 장치의 허용치가 무엇인지 알아야합니다. 직렬 전송에서 손실 된 데이터는 일반적으로 상대방 장치에 과부하가 걸렸다는 것을 의미합니다.

1

EOS (end-of-message) 감지 알고리즘을 알고 있습니까? 장치가 문자 내 시간 초과를 사용하는 것일 수 있습니다. 그것이 N> 20에서 작동하는 이유를 설명 할 수 있습니다. 그 시간에 새로운 문자가 버퍼에 나타나지 않으면 장치가 메시지가 종료되었다고 판단하고 버퍼를 표시 할 수 있습니다. 메시지 끝 부분에 ASCII 코드 10을 올리면 나머지 메시지가 한 줄 표시의 끝에서 스크롤되어 표시되지 않을 수도 있습니다.

그래도 N < 9는 작동하지 않습니다. 아마도 모든 장치에서 지연없이 데이터가 도착하면 연속적으로 표시 할 스크립트로 해석합니다. 메시지가 표시되는 속도가 N = 0에서 9까지 변화하지 않지만 모든 N> 20에서 달라지는 경우입니다. N이 밀리 초이면 사용자가이를 확인할 수 없습니다.