원본 출처 : 여기 여기
시리얼통신할때 필요한 함수들이다
//BUFFER_SIZE는 배열이 가지는 최대값이다(예 #define BUFFER_SIZE 4096)
//hex값을 integer형으로 변경, 0xabcd ->43981, 2465 -> 2465
BOOL GetHexStringToInteger(__in CStringA strHex, __inout int& nValue)
{
strHex.Replace(" ", "");
strHex.Trim("\r\n ");
nValue = strtol(strHex, NULL, 16);
return TRUE;
}
//hex값을 float값으로
BOOL GetHexStringToFloat(__in CStringA strHex, __inout double& fValue)
{
strHex.Trim("\r\n ");
strHex.Replace(" ", "");
strHex.Replace("0x", "");
if(strHex.GetLength() != 8)
return FALSE;
int nCnt = 0;
for(int i = 0; i < strHex.GetLength(); i++)
{
if(!isdigit(strHex.GetAt(i)) && !isalpha(strHex.GetAt(i)))
return FALSE;
}
int iLen = strHex.GetLength(), iCnt, iDataCtr;
unsigned char bData;
union FloatHex
{
unsigned char uData[4];
float fValue;
}uConvert;
iDataCtr = (iLen / 2) - 1;
for (iCnt=0; iCnt<iLen; ++iCnt)
{
bData = strHex.GetAt(iCnt);
if (bData > '9')
bData -= 7;
bData <<= 4;
uConvert.uData[iDataCtr] = bData;
++iCnt;
bData = strHex.GetAt(iCnt);
if (bData > '9')
bData -= 7;
bData -= '0';
uConvert.uData[iDataCtr] |= bData;
--iDataCtr;
}
fValue = uConvert.fValue;
return TRUE;
}
//hex값을 double값으로
BOOL GetHexStringToDouble(__in CStringA strHex, __inout double& fValue)
{
strHex.Trim("\r\n ");
strHex.Replace(" ", "");
strHex.Replace("0x", "");
if(strHex.GetLength() != 16)
return FALSE;
int nCnt = 0;
for(int i = 0; i < strHex.GetLength(); i++)
{
if(!isdigit(strHex.GetAt(i)) && !isalpha(strHex.GetAt(i)))
return FALSE;
}
int iLen = strHex.GetLength(), iCnt, iDataCtr;
unsigned char bData;
union DoubleHex
{
unsigned char uData[8];
double fValue;
}uConvert;
iDataCtr = (iLen / 2) - 1;
for (iCnt=0; iCnt<iLen; ++iCnt)
{
bData = strHex.GetAt(iCnt);
if (bData > '9')
bData -= 7;
bData <<= 4;
uConvert.uData[iDataCtr] = bData;
++iCnt;
bData = strHex.GetAt(iCnt);
if (bData > '9')
bData -= 7;
bData -= '0';
uConvert.uData[iDataCtr] |= bData;
--iDataCtr;
}
fValue = uConvert.fValue;
return TRUE;
}
//30 41 30 31 30 30 52 45 50 4F 52 54 39 44 0D => 0A0100REPORT9D 로 변경
void StringToBytesArray(__in const char* pszSrcBuf, __inout BYTE* Result, __inout int& nLen)
{
char* pszStop = NULL;
char *token = NULL;
int nToken[BUFFER_SIZE] = {-1,};
char szBytesString[BUFFER_SIZE] = {0,};
if(!pszSrcBuf)
return;
if(strlen(pszSrcBuf) < BUFFER_SIZE)
strcpy_s(szBytesString, BUFFER_SIZE, pszSrcBuf);
else
{
memset(Result, 0, BUFFER_SIZE);
nLen = 0;
return;
}
token = strtok(szBytesString, " ");
char szBuf[2] = {0,};
int i = 0;
while(token!=NULL)
{
nToken[i] = strtol(token, &pszStop, 16);//HexToInt(token);
sprintf(szBuf, "%c", nToken[i]);
token = strtok(NULL," ");
memcpy(&Result[i], &szBuf[0], 1);
i++;
}
nLen = i;
}
//0A0100REPORT9D => 30 41 30 31 30 30 52 45 50 4F 52 54 39 44 0D 로 변경
void BytesToString(__in const BYTE* ByteSrc, __inout char* szBytes, __inout int& nLen)
{
char szTemp[3] = {0,};
char szSpace = ' ';
int nSpace = 0;
CStringA strBuf;
for(int i = 0; i < nLen; i++)
{
sprintf(szTemp, "%02x", ByteSrc[i]);
strBuf += szTemp;
strBuf += " ";
}
strBuf = strBuf.Trim(" ");
nLen = strBuf.GetLength();
if(nLen < BUFFER_SIZE)
strcpy_s(szBytes, BUFFER_SIZE, strBuf);
else
{
memset(szBytes, 0, BUFFER_SIZE);
nLen = 0;
}
}
'C & C++ > MFC Network' 카테고리의 다른 글
Window socket 오류 코드 값(펌) (0) | 2014.07.08 |
---|---|
[SendMessageCallback] 메시지(Message) 처리 (0) | 2013.11.14 |
간단한 FTP 프로그램 (0) | 2013.11.14 |
포털 사이트 및 웹페이지 자동 로그인 프로그램 (0) | 2013.11.14 |
[Windows IPC] 프로세스간 통신 (0) | 2013.11.14 |
댓글