안녕 하세요.
CPort를 이용해서 시리얼 통신을 하는데 궁금한게 있어서 이렇게
글을 올립니다.
CPort를 이용해서 데이터 수신시 ComPortRxChar() 이 함수가 호출되어서
내부적으로 ComPort.Read(Buffer, Count); 이런씩으로 데이터를 읽어 오더군요
여기서 제가 시리얼로 데이터를 주고 받기 위해서 간단히 프로토콜을 정했거든요.
TCP의 3번 악수 (?) 기법과 비슷하게요..
데이터를 보내기전에 "나 데이터 보낸다", "데이터 받을 준비 됐다", "데이터전송"
이런씩으로요..
먼저 "나 데이터 보낸다"를 전송후에..
ComPort.Read(Buffer, Count) 이 함수에서 "데이터 받을 준비 됐다" 가 올때까지
기다린다.
"데이터 받을 준비 됐다"라는 메시지가 왔을 경우에..
실질적인 데이터를 전송합니다.
여기서 Buffer의 내용을 디버깅해보니깐요..
이전에 읽어들인 내용까지 같이 들어가 있더군요..
물론 Read하기전에 ZeroMemory(@Buffer[0], sizeof(Buffer)); 이렇게 초기화를
시켰습니다...
그래서.. Read 하기 전에 강제적으로 수신버퍼의 내용을 초기화 할 수 없는지.
궁금해서.. 이렇게 글을 올립니다
글 뒤에는 간단히 소스 형식으로 적어 봤습니다.
그럼.. 답변 부탁드립니다..
좋은 하루 보내세요..
Ex)
ComPort.WriteStr("나 데이터 보낸다.")
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
begin
ZeroMemory(@Buffer[0], sizeof(Buffer));
ComPort.Read(Buffer, Count)
if Buffer가 "나 데이터 보낸다." 인지 조사.
//여기서 CPort를 이용해서 Write를 한경우, 항상 Read함수를 통해서 얻어진
//Buffer에는 Write시 보낸데이터가 그대로 존재하더군요.. 왜 그런지요???
{
while(1)
{
ZeroMemory(@Buffer[0], sizeof(Buffer));
ComPort.Read(Buffer, Count)
//여기서 Read시 Buffer에는 이전에 수신되었던 데이터 + 현재 수신데 데이터가 공존
//을 하고 있습니다.. 왜 그런지요.. Sleep()을 사용해서 시간 Delay를 주어도 마찬가
//지 더군요.. 그래서, 아예 수신 버퍼를 초기화 시키는 방법이 있는지요..
if Buffer가 "데이터 받을 준비 됐다" 이냐 ? 준비가 됐다면 데이터를 전송한다.
ComPort.Write(Data, Sizeof(Data));
}
}
end;
4바이트 일경우가 약 80% 이상이겠네요
buffer를 정의를 어떤식인지 모른 상황에서는 확실히 100% 4바이트라고 말씀
못드리겠고요 ^^
그리고 수신버퍼는 Custom assgined buffer라는 이야기이죠
CPort 내부버퍼가 아니라.. ^^ 답변주신 다른분들 이것땜시 혼돈이 된듯 합니다.