|
상록수.네오 님이 쓰신 글 :
: 제가 Cport를 사용하지 않아 무조건 8byte를 읽어 온다는 부분에 의문이 있습니다.
:
:
:
:
: 일반적인 Serial component들은 data가 receive butter에 도착하게 되면
: recieve event를 발생시키는 구조로 되어 있습니다.
:
: 이때, 수신해야 할 data량을 component가 미리 알 수 없는것은 당연하죠.
:
: 따라서, 일정 시간동안 들어온 data를 별도의 component가 사용하는 buffer에 옮겨놓게 되고
: 이 buffer를 초기화 해주지 않을 경우 그다음 들어온 data를 port buffer에 방치하게 됩니다.
:
: 사용자가 event 처리를 통해 component의 buffer를 clear해 주면 이때까지 수신된 buffer의 data를
: component의 buffer에 옮겨놓음과 동시에 다시 receive event를 발생하게 되는것입니다.
:
: 따라서, data량이 적은 통신의 경우 대부분 한번에 모든 data를 읽어들일 수 있으나,
: timing이 절묘하게 맞아 떨어지는 경우, 두번으로 나뉘어서 처리 될 수도 있습니다.
:
:
:
:
: Data량이 많은 protocol의 경우 대부분 두번 이상의 receive event를 발생하게 됩니다.
:
: Receive event 처리가 아주 빠른 경우 세번, 네번의 event 발생도 가능하나,
: 일반적인 component들의 thread 우선순위가 높지 않아서, 별도의 port access module을 만들지 않는한
: 긴 data는 두번에 나뉘어서 수신된다고 생각하시면 별다른 문제는 없을 것입니다.
:
: 이러한 이유로 인해, receive data를 재구성하여 수신 내용을 해석 처리하는 별도의 routine을
: 만들어 주시는 것이 바람직 합니다.
:
:
:
:
: 송신 측에서 다음과 같이 세가지 data를 연속하여 송신할 경우
: ABC
: DEF
: GHI
: 수신 buffer에 수신된 data는
: AB
: CDEFG
: HI
: 와 같이 될 수도 있다는 것입니다.
:
: 이러한 문제 발생을 방지하기 위해 protocol을 정의할때, header와 delimiter를 정의하는 것입니다.
:
:
:
:
: 첫번째 event에서 얻은 data가 일정하게 8byte가 된다면, 그것은 Setting된 refresh time에 수신되는
: data량이 일정하다는 것으로 풀이됩니다.
:
: field에서 이런경우는 거의 찾아보기 힘들지만, noise가 전혀없는 system에서 ideal하게 통신이 이뤄진다면
: 첫번째 읽히는 data량이 일정한것이 맞습니다.
:
:
:
:
: 간단한 내용인데, 글재주가없어 긴 설명글이 되었군요. 이해가 되셨기를 바랍니다.
: 혹시, 제가 문제를 잘못 이해했다면 다시 글 올려주시기 바랍니다.
:
:
:
:
:
: 초보... 님이 쓰신 글 :
: : 무조건 처음 8바이트 읽고 나머지를 읽어 오네여... .ㅜㅜ (두번에 나오어서 읽어옴 )
: : ( 데이터 전체 길이하고는 전혀 상관이 없는 듯 합니다. )
: : 두번째 읽어 올때는 데이터 갯수 상관 없이 마지막 부분까지 읽습니다....
: :
: : 두번에 나누어서 수신 하는 이유좀 알려 주세여..............
: :
: :
: : 소스는 아래 부분이구여..
: :
: : AnsiString Str;
: :
: : ComPort->ReadStr(Str, Count);
: : memoRxdata->Lines->Add(Str);
|