문자열 처리에서는 0x00이 들어가면 거기가 문자열 끝이로 인식하여
이후 데이터는 안나옵니다만
char 배열에 그냥 값을 넣는 것은 무관한 부분입니다.
제가 보기엔 msg에 값이 안들어가는게 아니고
msg 배열에 들어간 데이터를 전송하는
Send 함수 내부가 잘못 코딩 되었을 가능성이 큽니다.
Send 함수 인자 받는 형태로 봐서는
원하는 데이터가 잘 나가야 정상입니다.
DWORD len 인자가 있다는 것은
함수 내부가 문자열 처리가 아니고
길이만큼 데이터를 강제로
보내는 방식으로 되어 있는게 맞으니까요.
CExTempCtrl::Send(int PortNo, BYTE *Msg, DWORD len) 함수 내부에서
시리얼 함수를 호출하는 부분이 잘못 되었을 것입니다.
보통 시리얼 전송 함수는 문자열 인자만 받아서 보내는 함수와
(예, PutString(const AnsiString S) )
데이터 포인터와 길이를 받아서 보내는 함수가 존재합니다.
(예, PutBlock(const void *Block, Word Len) )
Send 함수 내부에서
BYTE *Msg, DWORD len 를 그대로 시리얼 함수중에 같은 형태로 된 함수를
이용하여 보내면 될 것입니다.
입문자 님이 쓰신 글 :
:
:
: 안녕하세요. 수고가 많으십니다.
:
: 다름이 아니라..
:
: 시스템.
: Windows XP
: C++ Builder 6.0
:
: ///소스 코드...
: char msg[32], msg1[32];
: DWORD dwIndex = 0;
: AnsiString szData;
:
: ZeroMemory(msg, 32);
: //국번..
: msg[dwIndex++] = wChNo;
:
: //명령어 코드..
: msg[dwIndex++] = wCodeNo;
:
: //설정값 주소지..
: wData.wData = wAddr;
: msg[dwIndex++] = wData.byData[1];
: msg[dwIndex++] = wData.byData[0];
:
: //데이터 갯수..
: msg[dwIndex++] = 0x00;
: msg[dwIndex++] = 0x01;
:
: //Check Sum CRC16..
: wData.wData = GetCheckSum_CRC16(msg, dwIndex);
: msg[dwIndex++] = wData.byData[0];
: msg[dwIndex++] = wData.byData[1];
:
: 이부분이 중요...!
: Send(m_nPortNum, msg, ++dwIndex);
:
: 함수 원형..
: bool CExTempCtrl::Send(int PortNo, BYTE *Msg, DWORD len)
:
: msg : "0x01 0x04 0x03 0xE8 0x00 0x01 0xB1 0xBA" <--요걸 그대로 복사하고 싶습니다...
:
: 문제는 중간에 " msg[dwIndex++] = 0x00; " 이값이 꼭 들어가야 하는데..
:
: 값이 포인터 변수로 복사 될때에 0x00 앞의 값(msg : "0x01 0x04 0x03 0xE8")만 전달이 됩니다...ㅜ
:
: 이 값을 전체적으로 전달 할수 있는 방법 없을까요 ?
: 문자열 복사를 해도 0x00 값 앞의 값만 복사가 됩니다...크흑..
:
: 도와주십쇼~~~
:
: