도와주세요!!
글 수 15,339
2008.04.11 10:02:15 (*.162.55.14)
7313
EP9312 보드에서 리눅스 어플리케이션을 작성해 보고 있는데요, 한가지 이해가 안 되는 점이 있어서 질문 드립니다.
리눅스 보드가 시리얼 통신으로 수신받을때, 한번에 받을 수 있는 데이터 수가 정해져 있나요? 아니면 수신 데이터가 조금이라도 텀이 생기면 바로 끊고 다시 받는 것인지....
제가 300 바이트가 조금 넘는 데이터를 송신하니까, 리눅스 보드에서는 3~4차례에 걸쳐서 나눠서 수신이 이루어 집니다.
물론 이것은 송신 데이터 길이를 읽어서 처리해주면, 극복할 수 있는 문제겠지만...
왜 그런 것인지 궁금해서 질문올립니다......^^;
그럼 즐거운 금욜들 보내세요~
리눅스 보드가 시리얼 통신으로 수신받을때, 한번에 받을 수 있는 데이터 수가 정해져 있나요? 아니면 수신 데이터가 조금이라도 텀이 생기면 바로 끊고 다시 받는 것인지....
제가 300 바이트가 조금 넘는 데이터를 송신하니까, 리눅스 보드에서는 3~4차례에 걸쳐서 나눠서 수신이 이루어 집니다.
물론 이것은 송신 데이터 길이를 읽어서 처리해주면, 극복할 수 있는 문제겠지만...
왜 그런 것인지 궁금해서 질문올립니다......^^;
그럼 즐거운 금욜들 보내세요~
네, 시리얼 통신은 비동기 통신 방식이라 상대쪽에서 전송하는 데이터를 미리 알 수 없습니다.
즉, 상대쪽에서 언제 보낼지 모르는 통신 방식이라 항상 귀를 귀울여야 하는 통신 방식이며,
또한 상대방이 몇 바이트를 보내는지 알 수 없는 통신이 바로 시리얼 통신이 되겠습니다.
그래서 상대가 300바이트의 데이터를 전송했다고 하더라도 수신하는 쪽은 무조건 받아서
버퍼에 쌓고 포트를 사용하는 프로그램 쪽에 알려 줍니다.
프로그램 쪽으로 알려 준다는 말씀은 실제 수신은 커널에서 하기 때문입니다.
즉, 커널이 자신의 버퍼에 일단 수신하고 포트를 사용하겠다고 열기를 한
프로그램에 받은 데이터가 있으니 받아라 하고 알려 준다는 말씀이 되겠습니다.
문제는 커널이 아픙로 상대 쪽에서 300바이트를 보내는지 500바이트를 보내는지 모르고
모조건 버퍼에 쌓고 프로그램 쪽에서 데이터를 요청하면( read() 함수) 그때 퍼 주고
다시 상대 쪽에서 보내 준 데이터를 버퍼에 쌓습니다.
다시 정리하면 커널은 상대에서 보내준 300바이트를 모두 받고서야 프로그램에 알려 주는 것이 아니라
한 바이트라도 버퍼에 쌓이면 프로그램에 알려 주는 방식이라
300바이트 뿐만 아니라 100 바이트도 2번이나 3번에 나뉘어 수신될 수 있습니다.
그래서 이런 문제를 해결하기 위해 다양한 프로토콜이 존재하며,
문제가 데이터 길이가 없어서 발생하지만 데이터 전송에 길이 정보를 첨부하여
전송하는 것을 가급적 사용하지 않고 있습니다.
왜냐하면 노이즈나 기타 문제로 바이트가 빠지면 알려준 길이 만큼 전송이 안될 수 있고,
길이 정보 자체가 손상이 될 수도 있기 때문입니다.
프로토콜에 대한 자세한 말씀은 아래의 글을 참고해 보십시오. ^^
http://forum.falinux.com/zbxe/?mid=network_programming&document_srl=406026