|
사용하는것으로 볼때
요구르트님이 사용하는 시리얼 통신콤포넌트는 자료실에 있는 TComPort이군요?
아니면 말씀해주시고..
1. 일단 시리얼통신으로 받고자 하는 데이터가 무엇인지 확인 할 필요가 있습니다.
데이터가 바이너리 방식으로 한 바이트에 0x11같이 하나씩 들어온다면
헥사코드 10개는 바로 10바이트를 의미할 수도 있겠고요
데이터가 이런 문자열방식 "404040421C1120333323" 으로 들어온다면
20바이트가 될수 있습니다.
"0x400x40..... 0x23" 이런 문자열이라면 40바이트 겠지요
질문의 의도로 봐서는 바이너리 방식으로 10바이트만 받으면 될거 같은데...
일단 이런 가정으로 풀어나가죠
2. 두번째로 ReadStr이나 Read 메소드 사용방법을 알아야죠
요구르트님이 쓴 아래코드 정말 사용하는 코드 그대로 가져온 건가요?
그렇다면 심각한 문제가 있습니다.
: AnsiString buf;
: int count;
: ComPort1->ReadStr(buf, count);
:
: if(buf[1] == 0x10 && buf[10]==0x20) // <-- 자꾸 에러가 뜨고 여기라고 나오거든요..
TComPort에서 ReadStr또는 Read메소드에 들어가는 count값은 입력 값입니다.
몇 바이트를 또는 문자를 읽을때까지 기다리라는 말이죠
그런데 int count;선언만 하고 바로 써버리면 쓰레기 값이 들어가겠죠
님이 원하는게 10바이트라면 이렇게 사용해야 합니다.
ComPort1->ReadStr(buf, 10);
이 함수는 10바이트를 읽을때까지 기다립니다.
Read 메소드도 마찬가지로 입력한 Count수 만큼 다 읽을때까지 기다립니다.
데이터가 다 안오면 프로그램이 죽은 것처럼 보일수도 있으니 주의하시길..
그리고 에러가 뜬다는 말은 컴파일 에러는 아닌거같고 실행중 예외가 발생하는거죠?
count값에 쓰레기값이 들어가는것과 같은 원인인거 같습니다.
그래도 만약을 위해
int readBytes = ComPort1->ReadStr(buf, 10);
if(readBytes==10)
{
if(buf[1] == 0x10 && buf[10]==0x20)
}
이런식으로 실제 읽은 데이터 바이트 수를 한번 확인해 보는게 바람직하죠
그럼.. 도움이 되셨길 바랍니다.
요구르트 님이 쓰신 글 :
: 간단한 예제에..
:
: ComPort 있는데..???
:
: ComPort 컴포넌트를 이용해서.. 시리얼 통신을 하려고 하는것이거든요...
:
: 0x11 ----- 0x19 등의 헥사값 10개를 받는 코드만...?
: 몇줄 안되잖아요..?
:
:
: 지금..
:
: AnsiString buf;
: int count;
:
: ComPort1->ReadStr(buf, count);
:
: if(buf[1] == 0x10 && buf[10]==0x20) // <-- 자꾸 에러가 뜨고 여기라고 나오거든요..
: {
: ShowMessage("complete"); // 코드가 올바르게 들어왔다면 그 데이타를 처리할려고요..
: }
:
: 델파이 예제가 있어서 그거랑 좀 비슷하게도 해봤거든요..
:
: char buf[4096];
: int count;
:
: memset(buf, 0, 4096);
: ComPort1->Read(buf, count);
:
: if(buf[0] == 0x10 && buf[9]==0x20) // <-- 또 똑같은 에러가 뜨고 여기라고 나오거든요..
: {
: ShowMessage("complete"); // 코드가 올바르게 들어왔다면 그 데이타를 처리할려고요..
: }
:
:
: 많이도 필요없습니다..
: 딱 위에 같은 부분만,,
: 그러니깐 comport를 통해 들어오는 핵사값을..
: 받는 코드만 좀 가르쳐주세요..--;
|