c# 시리얼통신 중 데이터가 끊겨서 들어오는 문제 문의드립니다.

안녕하십니까.

현재 c#으로 시리얼통신을 만들고있는데,
리시브할때 데이터가 끊겨서 들어오는 현상이 발견되었습니다.

예를들어 EE 11 22 33 44 55 66 77 88 99 라는 값을 보내면
받을때 FF 11 22 33 44 55 66 77 88 99 값으로 받고싶지만, 중간에 끊겨서
FF 11 22 33 44 / 55 66 77 88 99 이런식으로 끊겨서 들어오더라구요…

데이타 받을때의 바이트 수는 일정하지가 않은데, 이럴경우 어떻게 해결을 해야하는지
선배님들의 조언 부탁드립니다…

혹시 관련 장치 SDK 문서에
패킷 구조 문서가 없나요?

보통 고정 사이즈인 헤더에 데이터 길이정보가 있어서

헤더를 읽어서 실제 데이터 길이 만큼

while (Buffer < DataLen)
{
}
식으로 수신처리 합니다.

또는 캐리지리턴 문자 등으로 데이터의 끝을 알리는 ETX 정보가 있어서

ETX 까지 반복 수신 처리 하는 경우도 있습니다.

sdk 문서가 있는지 확인해 보세요

좋아요 5

시리얼통신은 원래 끊겨서 수신됩니다. UDP 처럼 보내는 패킷 그데로 받는것이 아니라 TCP 처럼 끊기거나 합쳐서 들어오기때문에 처음 패킷 프로토콜 정할때 헤더에 길이정보를 포함하던가 고정길이를 사용하는 방식으로 통신해야합니다.

데이터의 처음과 끝을 확인 할 수 있는지를 확인 해 보셔야 하구요.
질문하신 예를 보면 바이너리 형태로 통신하고 있는데,
이럴 경우에는aroooong님 말씀처럼 데이터 길이가 고정되어 있거나,
데이터 선두에 데이터 길이를 포함하는 형태를 취하게 됩니다.
어떤 방법이든 정해진 데이터 길이만큼 수신 대기하고, 타임아웃이 발행하게 되면
재시도하도록 해야겠죠.

통신대상이 되는 장치의 문서를 보게되면 응답 대기 시간이 명시된 경우도 있으니,
그걸 참고 하시면 되겠고요.

통신속도 9600bps 기준 대략 한 바이트 수신에 약 1ms 정도 걸리니,
(실제 시리얼 통신에서는 한 바이트 전송하는데 10비트입니다. stop bit = 1, data bit =8, parity = none 일때)
수신하고자 하는 데이터 길이 + 여유시간으로 하시면 될 것으로 생각됩니다.
예를 들어 수신하고자 하는 데이터 10바이트 일 경우 실제 데이터 전송시간(10 x 1ms) + 장치측 지연시간 (200ms)을 고려하여 대략 300ms 시간 이상 타임아웃을 설정합니다.

좋아요 3