도와주세요!!
글 수 15,339
2007.12.15 00:27:30 (*.237.221.77)
12408
포럼 사이트에서 여러모로 도움 많이 받으며 임베디드 공부하고 있는 학생입니다.
이번에 블루투스를 이용해서 시리얼 통신 파일 전송 프로그램을 만들고 있는데요.
하던 중 개념적으로 궁금한 것이 생겨서 이렇게 글남기게 되었습니다.
read() 함수가 호출된 상태에서 블록되어서 수신을 기다리고 있던 쪽에서
어떤 값이 들어와서 그 값을 검사하는 루틴이 실행 중에 있습니다.
하지만 이때 또다시 보내는 쪽에서 값을 보내게 되어 수신하는 쪽에서는 read() 함수가 호출된
상태가 아닌 어떤 다른 작업을 처리하고 있을 경우일때 그 전송해온 값들은 어떻게 되는지 궁금합니다.
TCP/IP 통신에서는 버퍼가 내부적으로 구현되어서 괜찮은 걸로 알고 있는데
시리얼 통신에서는 어떻게 처리해줘야 하는지 궁금합니다 +_+
뭐 멀티 스레드 개념으로 보면 쉽게 처리될 것 같긴 하지만 +_+ 개념적인게 궁금해서요.
또 궁금한 것이 있는데요.
stx 코드 값은 0x02, etx 코드 값은 0x03 은 표준으로 정해진 값인가요?
사이트에 시리얼 테스트 프로그램 가지고 값 주고 받고 있는데 stx 값을 포함해서 보내게 되면
받은 쪽에서 stx 값을 제외한 값을 읽어 드리던데요. stx 없이 그냥 data 값만 보낼때
0x02 값을 삽입해서 보내면 stx 로 보질 않고 그냥 데이터로 보던데 ;; 내부적으로 어떻게 구현 되었길래
0x02 를 그냥 써서 보내면 검사 안하고, 프로그램 내에서 stx 선택해서 보내면 되는지 궁금합니다...
길글 읽어 주셔서 감사합니다. 답변 기다리겠습니다~
TCP/IP 에 비해서는 단순하지만 시리얼 통신도 시리얼 포트에 대한 디바이스 프로그램이 존재하며
이 디바이스 드라이버 프로그램에 의해 버퍼가 준비되고
일반 프로그램은 이 버퍼의 값을 읽어 가도록 되어 있습니다.
당연히 버퍼의 크기는 디바이스 드라이버 프로그램에 의해 고정크기로 준비되며
수신하는 쪽의 프로그램이 이 버퍼값을 제때 읽어 가지 않으면
상대방에서 보내준 자료를 잃게 되는데 이렇게 버퍼가 꽉찬 경우
데이터의 손실 처리를 어떻게 하느냐는 역시 디바이스 드라이버 프로그램을 따르게 됩니다.
그래서 제때제때 버퍼의 자료를 읽어 가야하는데 그 중에 제가 권하고 싶은 방법이
poll 입니다. poll에 대한 자세한 내용을 본 포럼의 강좌 "시리얼 통신 - 자료 수신을 위한 poll"에 올렸습니다. ^^
0x02를 stx로, 0x03을 etx로 지정하여 사용하는 것이 1963년 미국표준협회(ASA)에서
결정되어 미국의 표준부호가 되었다라는 것으로만 알고 있습니다.
더 상세한 것은 모릅니다만 관례적으로 이렇게 많이들 사용해서 그냥 따르듯히 하고 있습니다. ^^
시리얼 통신 프로그램으로 [x02][Data][0x03]으로 전송했는데
데이터만 출력된다면 프로그램에서 0x02와 0x03에 대해서
화면으로 출력을 않하는 것 뿐입니다.
다른 시리얼 통신 프로그램을 이용하시면 0x02, 0x03뿐만 아니라
다른 화면으로 출력되지 않는 바이트값을 보실 수 있습니다.
시리얼 통신에 대한 프로토콜에 대해 더 자세한 글은 본 포럼의 강좌 중 "프로토콜에 대해서"를
참고하여 주십시오. ^^
모쪼록 도움이되는 글이었으면 좋겠습니다. ^^