|
제가 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);
|