2015-01-03 3 views
0

그래서 C#/Gtk #의 직렬 포트 개체에서 실시간 데이터를 읽으려고합니다. 나는 RF를 통해 컴퓨터와 통신하는 제품을 가지고 있으며, 명령을받을 때마다 ACK를 보낸다. AccessPort를 사용하고 500ms마다 자동으로 명령을 보내면 ACK가 발생합니다. 몇 시간 동안 AccessPort를 실행했고 모든 단일 명령을 ACK에 일치시킬 수 있었기 때문에 이것이 실제로 작동하고 있음을 알았습니다.C#/GTK # 직렬 포트 읽기 문제

C#/Gtk #의 작은 프로그램을 작성하여 X 밀리 초에 직렬 포트로 데이터를 보내고 되돌아 오는 바이트의 직렬 포트를 읽는 위임 된 스레드가 있습니다. 내 문제는 직렬 읽기 방법을 어떻게 작성하든 상관없이 내가 실제로 알고있는 모든 바이트를 실제로 캡처하지 않는다는 것이다. 때 연결

writeThread = new Thread (writeSerial); 
    readThread = new Thread (readSerial); 

그리고 그것을 시작 :

private void readSerial(){ 
    byte readByte = 0x00; 

    Gtk.Application.Invoke (delegate { 
     try { 
      readByte = (byte)serialPort.ReadByte(); 
      Console.WriteLine(readByte.ToString("X2")); 
     } catch (System.ArgumentException sae) { 
      Console.WriteLine(sae.Message); 
     } 
    }); 
} 

내가 메인 함수에서 스레드 방법이 있음을 할당 :

는 지금까지 내가 가지고있는 "가벼운"코드 버튼이 writeThread와 함께 눌러집니다. writeThread는 매 xms마다 올바른 명령을 실행하는 제품을 볼 수 있으므로 잘 작동합니다 (현재 500ms에서 테스트 중입니다). ACK는 X ms + 35 ms * 모듈 ID마다 컴퓨터에 도착해야합니다. 따라서 최종 제품의 모듈 ID가 2 인 경우 응답은 70ms 지연되므로 컴퓨터는 570ms 또는 X + 70ms로 응답해야합니다.

더 좋은 방법이 있나요? 내가 뭔가 잘못하고있는거야?

내가 사용한 다른 몇 가지 코드는 직렬 포트에서 0x0E 바이트를 읽고 버퍼에 버퍼를 저장하는 것이고, 이것은 또한 내가 알고있는 많은 바이트를 놓친 것입니다.

누구에게 도움을 줄 수 있습니까? readSerial 메서드가 실제로 시작되는 것을 알 수 있습니다. 콘솔에서 0x00이 튀어 나오는 것을 볼 수 있습니다. 0x00이 원하는 데이터 사이에 분산되어 있기 때문에 올바른 것입니다.

+0

다른 예외도 catch하고 기록하면 어떻게됩니까? – rene

+0

좋은 생각! catch (System.Exception se)를 추가하고 Console.WriteLine (se.Message)을 수행하면 아무 것도 볼 수 없지만 좋은 생각이었습니다! 또한 ReadExisting()에 대해 ReadByte()를 스왑 아웃 한 다음 문자열을 바이트 배열로 변환하고 성공없이 인쇄하려고했습니다. – user1772086

답변

0

알아 냈어!

정확한 문제는 무엇인지 모르겠지만 위임을 제거하고 그 메서드 내에서 잠시 (실제) 모양을 사용하면 문제가 없습니다.