|
시리얼 통신은 데이터가 한번에 다 들어오는 것이 아닙니다.
데이터가 죽~ 들어오는 도중에 수신 이밴트가 발생합니다.
만약 Sleep을 주지 않으면 잘려서 읽히고 Sleep을 주면 전부 읽는다면
Sleep을 주지 않은 경우는 수신 이밴트가 여러번 발생하여 이전에 발생된 이밴트에서
읽었던 값들을 유지하지 않는 경우 이전 값으 다 사라지고 가장 마지막에 읽은 값만 보이게 됩니다.
Sleep을 주면 다 읽는 것은 Sleep을 주는 동안 이미 데이터들이 다 들어와 있고
단 한번만 읽으면 되기 때문입니다.
수신 이밴트가 발생할 때마다 읽은 값을 계속 유지하고 다음 이밴트에서 읽은 값을 더해주는 방식을 검토해보세요.
코드는 자세하게 보지 않았지만 문의 내용으로 봐서 위 문제일 가능성이 큽니다.
김호범 님이 쓰신 글 :
: 안녕하세요.
:
: 현재 MFC로 시리얼 통신 프로그램을 짜서 ATMEGA128이라는 마이크로프로세서와 통신을 하는 중입니다.
:
: 시리얼 통신에 관한 클래스는 인터넷에 많이 쓰이는 걸로 찾아서 만들었습니다.
:
: 통신이 잘 되는 지 확인하려고 시리얼 RS-232 포트의 Rx와 Tx를 서로 연결하고 MFC에서 문자열을 보내고, 다시 되돌아온 문자열을 화면에 출력했습니다.
:
: 8바이트까지는 잘 보내지고 받아와지는데, 보내는 바이트 수가 8바이트를 넘어가면 잘려나가네요.
:
: 포트 설정이 잘못된 것 같지는 않습니다. 속도나 패리티 같은 걸 바꿔바도 똑같은 현상이 발생합니다.
:
: 포트에 내보내는 건 CommTread.cpp에 있는 WriteComm 함수를 이용하여 WriteComm("abcdef",6); 처럼
:
: 문자열과 문자열의 길이로 보냅니다. "1234567890" 이렇게 10문자를 보내면 화면에는 "90"만 출력됩니다.
:
: 앞에 "12345678" 8바이트는 어디로 버려졌는지 알 수가 없네요...
:
: 통신이 잘 된다면 보낸 바이트 수만큼 되돌아와야 하는데, 어째서 8바이트로 잘라지는 걸까요...
:
: [추가내용]
: CommThread.cpp에서 ThreadWatchComm 메소드 내에서 Sleep(700); 처럼 값을 크게 주면 많이 보내도 읽어오네요.
: Sleep을 대체할 수 있는 방법은 없을까요? Timeout을 조정해야 하나요...
|