나는 SerialPort 응용 프로그램에서 일하고 있는데 그 중 하나는 아주 간단한 부분으로 나에게 문제가되고있다. 나는 항구에서 일정한 데이터 스트림을 읽고 그것이 들어올 때 바이너리 파일에 쓰기를 원한다. 문제는 속도가 빠른 것 같다 : 나의 코드는 나의 9600 보드 테스트 장치에서 잘 작동했지만, 115200bps 라이브 장치, 나는 데이터를 잃어 가고있는 것 같습니다. 가변적 인 시간이 지나면 데이터의 나머지 부분을 버리는 1 바이트를 놓친다.SerialPort 데이터 손실 - C#
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
bwLogger.Write((byte)serialPort1.ReadByte());
}
또는
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] inc = new byte[serialPort1.BytesToRead];
serialPort1.Read(inc, 0, inc.Length);
bwLogger.Write(inc);
}
과 몇 가지 변화 : 나는 몇 가지를 시도했습니다. 나는 일정한 데이터 스트림으로 작업 할 때 ReadLine()을 사용할 수 없다. 버퍼 크기 (serialPort1.ReadBufferSize 및 하드웨어 FIFO 버퍼 모두)를 사용하여 보았습니다. 이상적으로는 유용성을 위해 소프트웨어 측면에서이를 처리하고 사용자가 Windows 드라이버 설정을 변경하지 못하게하는 것이 좋습니다.
아이디어가 있으십니까?
이것은 통신 프로토콜에 규칙과 체크섬이있는 이유입니다. 그러한 이벤트를 감지하고 이벤트를 복구 할 수있는 유연성을 제공하는 프로토콜을 코딩해야합니다. 시간 초과를 사용하여 버퍼를 지우고 필요에 따라 다시 보낼 수 있습니다. 때때로 데이터가 손실됩니다. 기간. 이야기의 끝. 이러한 상황을 정상적으로 복구하려면 각 최종 장치를 가져와야합니다 (즉, 나머지 데이터를 버리지 않아야 함). –
이것은 훌륭한 조언입니다. 내 특정 장치의 고유 한 기능으로 인해 데이터를 선형 적으로 보간하여 누락되거나 "나쁜"패킷을 채울 수 있습니다. 대부분의 통신 상황에서,이 유형의 이벤트 처리는 언급 한 것처럼 적절한 프로토콜에 대해 개발함으로써 가장 확실하게 강력 해집니다. 어떤 형태의 의사 소통으로도 일하는 사람에게 좋은 충고. – Slim
사과드립니다. 다시 읽은 후 하드 리얼 타임 요구 사항을 언급하고 있으며 누락 된 데이터가 누락되었다는 것을 알게되었습니다. 다가오는 스레드에 관한 답변을 참조하십시오. 이미 답변을 수락 했더라도 조사 할 가치가있을 수 있습니다. –