그래서 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이 원하는 데이터 사이에 분산되어 있기 때문에 올바른 것입니다.
다른 예외도 catch하고 기록하면 어떻게됩니까? – rene
좋은 생각! catch (System.Exception se)를 추가하고 Console.WriteLine (se.Message)을 수행하면 아무 것도 볼 수 없지만 좋은 생각이었습니다! 또한 ReadExisting()에 대해 ReadByte()를 스왑 아웃 한 다음 문자열을 바이트 배열로 변환하고 성공없이 인쇄하려고했습니다. – user1772086