|
안녕하세요 C++Builder 6 유저입니다.
sms 송수신을 하면서 문제가 생겨서 질문 드립니다.
수신을 하면 데이터 처리를 해주는 부분에서 문제가 생기는데요
수신 데이터는 <time>,<call back>,<ti>,<message encode>,<priority>,<data> 순서이며
실 데이터가 들어오면
20101220130546,00000000000,4098,16,0,54525452303030313031313134303031303130303030303030303030
이런식으로 들어옵니다.
,위치가 틀려질수 있기 때문에 strtok_r으로 , 를 찾고 ,와 , 사이의 데이터를 가지고 처리하려고 하는데
컴파일은 되지만 데이터 송신시에 문제가 발생하네요.
데이터는 2 Digit Hex라 처리하게 편하게 0x00과 같이 만들려고 합니다. 맨아래 for문 두개가 그 처리부분입니다.
예> 3030(ascii)(4byte) -> 00(2byte) -> 0x00(1byte)
비트연산을 해야될일이 많아서 for문으로 두번 묶었습니다.
두번째 for문은 데이터중 앞에16(5452545230303031)개는 빼고 묶어야 되서 8로 시작했습니다.
그리고 strtok_r은 string.h파일을 찾아보니 보이지 않아서 소스를 가져다 썼습니다.
혹시 잘못처리하고 있는 부분이 있는지 알려주시면 감사하겠습니다.
이틀째 보고 있는데 어디가 문제인지 모르겠네요.
---------------------------- 데이터 처리 ------------------------------------
void __fastcall TForm12::Comm1RxChar(TObject *Sender, DWORD Count)
{
unsigned int i,j;
static unsigned int serial_number;
char Buff[1024];
static char data[1024];
char serial_data[1024];
Comm1->Read(serial_data,Count);
for(i=0;i<Count;i++)
{
data[serial_number] = serial_data[i] ;
if( data[serial_number] == 0x0d )
{
if(strstr(data,"4098")!=NULL) // data가 메시지 텔레서비스일때
{
char *tok = NULL, *pHolder = NULL;
// Time parsing
tok = strtok_r (data, ",", &pHolder);
// Call Back Number parsing
tok = strtok_r(NULL, ",", &pHolder);
if(strcmp(tok,phone_num1)!=NULL)
{
RSV_NUM = RSV_ID1;
}
else if(strcmp(tok,phone_num2)!=NULL)
{
RSV_NUM = RSV_ID2;
}
// TID parsing
if (pHolder[0] == ',')
{
pHolder++;
}
else
{
tok = strtok_r(NULL, ",", &pHolder);
}
// Message Encode parsing
if (pHolder[0] == ',')
{
pHolder++;
}
else
{
tok = strtok_r(NULL, ",", &pHolder);
}
// Priority parsing
if (pHolder[0] == ',')
{
pHolder++;
}
else
{
tok = strtok_r(NULL, ",", &pHolder);
}
// Data parsing
tok = strtok_r(NULL, ",", &pHolder);
int len,retlen;
char chbyte[3];
char retbuff[512];
char process_buff[512];
len = strlen(tok);
for (i = 0; i < (len / 2); i++)
{
chbyte[0] = tok[i * 2];
chbyte[1] = tok[(i * 2) + 1];
chbyte[2] = '\0';
retbuff[i] = strtol(chbyte, (char **) NULL, 16);
}
retlen = (len / 2);
for (i = 8; i < (retlen / 2); i++)
{
chbyte[0] = retbuff[i * 2];
chbyte[1] = retbuff[(i * 2) + 1];
chbyte[2] = '\0';
process_buff[i] = strtol(chbyte, (char **) NULL, 16);
}
}
serial_number = 0;
}
else
{
serial_number++ ;
}
}
}
------------------ strtok_r ------------------------------------------------------
static char *strtok_r(char *s, const char *delim, char **last)
{
register char *spanp;
register int c, sc;
char *tok;
if (s == NULL && (s = *last) == NULL)
return (NULL);
cont:
c = *s++;
for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
if (c == sc)
goto cont;
}
if (c == 0) { /* no non-delimiter characters */
*last = NULL;
return (NULL);
}
tok = s - 1;
for (;;) {
c = *s++;
spanp = (char *)delim;
do {
if ((sc = *spanp++) == c) {
if (c == 0)
s = NULL;
else
s[-1] = 0;
*last = (char *)s;
return (tok);
}
} while (sc != 0);
}
/* NOTREACHED */
}
|