|
Serial Port에서 데이터를 받으려면 이벤트를 연결해야 합니다.
이벤트 이름이 정확히 기억은 안나는데..
OnRxChar인가.. 데이터 받으면 호출되는 이벤트가 있습니다.
이건 아시는거죠?
암튼..
그리고 ack를 주면 pc로 전송하다고 했는데...
data가 어디가 끝인지 알 수 있어야 합니다.
예를 들어 모든 데이터를 다 보내고 나면 ETX같은 특수한 문자를 마지막에 보낸다든가..
콤마(,)로 구분되는 데이터 개수가 몇개라든가..
어떤 통신이든지.. 무작정 죽어라 데이터를 기다릴 수 는 없거든요.
그러니까 마지막을 알 수 있는 기준이 필요하죠..
장비에서 보내는 데이터가 어떤 방식인지 매뉴얼을 보면 알 수 있을겁니다.
또한 문제가 되는 상황이..
장비에서 "100,1,1088,2.284,-5.783,57.12,0.048,0.217,1.078 " 와 같은 데이터를 보냈을때..
실제 위 이벤트 함수에서 데이터를 읽으면 데이터가 어떻게 날라 올지 모른다는 겁니다.
순서만 같다고 생각하시면 될듯..
이렇게 두번에 받을 수도 있고
"100,1,1088,2.284" ",-5.783,57.12,0.048,0.217,1.078 "
아래 처럼 3번에 나누어 날라올 수도 있습니다.
"100,1,1088," "2.284,-5.783,5" "7.12,0.048,0.217,1.078 "
지맘대로죠..
따라서 버퍼를 하나 만들어서 데이터를 다 받거나 원하는 데이터를 받았을때까지
그 버퍼에 계속 데이터를 넣어 두었다가 처리해주는 방법이 필요합니다.
AnsiString으로 버퍼하나 말들고 계속 받은 데이터 더해주면 되겠죠..
static AnsiString buf;
buf += CPort->ReadStr(); // 계속 저장
// 함수 사용 방법은 약간 다를겁니다. 소스를 보고 하는게 아니라..
if 데이터를 다 못 받았다면..
return;
else // 데이터를 다 받은거라면..
{
ProcessData(buf) ; // <---- 이런 함수 만드셔야죠.. 뭔가 처리는 해야 할테니까..
buf = ""; // 버퍼 비우기
}
그리고 데이터를 다 받았을때 콤마로 구분된 데이터를 처리하는것은
TStringList의 CommaText 라는 프로퍼티를 사용하면 아주 간단히 파싱이 됩니다.
모든걸 가르쳐주면 재미 없으니까.. TStringList는 도움말 찾아보시길..
장비쪽이라면 괜히 도와주고 싶어서.. ^^
그럼 좋은 프로그램 만드세요..
초보멋진빌더 님이 쓰신 글 :
: 많은 분이 도와 주셔서 이 초짜가 장비에 명령을 내리는 것은 완료 했습니다.
: 이제 수신과 저장이 남아 있는데..
: 일단 수신만 해서 값을 memo 에서 보려고 합니다.
: 일단 장비는 데이터 수신 ack 를 주면 pc로 전송하게 되어있습니다.
: 한번 보내는 data 수는 256 byte 이상 이구요.
: data는 100,1,1088,2.284,-5.783,57.12,0.048,0.217,1.078 이런 식으로 , 를 기준으로 분리되어 들어온다고
: 메뉴얼에 써 있더군요..
:
: cpor3.0 을 사용하려 하는데..
:
: 도와 주세요.. 이것과 데이터 저장만 하면 끝납니다. help me.....~~~
|