sio_write 함수를
sio_putb 함수로 바꿔 보실레요?
입문자 님이 쓰신 글 :
: 먼저 답변 달아주신점 무한히 감사드립니다..
:
: ////////////////////////////////////////////////////////////////////
: Send 함수 내부 구조
: bool CExTempCtrl::Send(int PortNo, BYTE *Msg, DWORD len)
: {
: if(g_bTempRunComm)
: {
: if(WaitComm()==false)
: {
: return false;
: }
: }
: g_bTempRunComm = true;
:
: EnterCriticalSection(&m_csTemp);
:
: g_bTempNewMsg = false;
:
: int ret = sio_write(PortNo, (char*)Msg, len);
:
: LeaveCriticalSection(&m_csTemp);
:
: if (ret < 0) { g_bTempRunComm = false; return false;}
:
: // if(WaitReturn()==false)
: // return false;
:
: g_bTempRunComm = false;
: return true;
: }
: ////////////////////////////////////////////////////////////////////
: 위에 처럼 바로 전송하게 되어있습니다.
: Pcomm 라이브러리 사용중에 있구요.
:
:
: 디버그 인스펙터 이용해서 함수 값이 어떻게 들어있는지 캡쳐해서 파일을 올렸습니다.
: 흑....
:
:
:
: 정성훈.해미 님이 쓰신 글 :
: : 문자열 처리에서는 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 값 앞의 값만 복사가 됩니다...크흑..
: : :
: : : 도와주십쇼~~~
: : :
: : :