C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[52743] 두분 모두 답변 감사드립니다... 아!! 이런 간단한 실수를.....
최명권 [jokacbal] 1187 읽음    2008-03-18 09:50
이런 기초적인 실수를 했네요..

머라 할 말이 없네요..

전에는 파일 관련 프로그램에서 . 을 , 로 찍어논걸 모르고 한참 헤맸었는데..

고맙습니다.. 꾸벅

크레브 님이 쓰신 글 :
: 그게 궁금하신거군요.
: 하지만 그것은 통신 문제가 아닙니다.
: Write나 Read함수 내용하고는 상관없고요
:
: 단지 char 에서 int로 캐스팅 될때의 변환 방법 때문에 그럽니다.
:
: 간단히 다음과 같이 테스트해보세요
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
:    AnsiString sBuf;
:
:    sBuf.sprintf("%X", int(char(E_Test->Text.ToInt())));
:
:    Memo1->Lines->Add(sBuf);
: }
: //---------------------------------------------------------------------------
: TEdit * E_Test ;
: TMemo * Memo1;
: //---------------------------------------------------------------------------
:
: 에디트 창에 0x7f 넣어보시고
: 0x80 넣어보세요 같은 현상이 나올겁니다.
:
: 아시겠지만
: char타입은 씨언어에서 한 문자를 나타내기도 하지만
: 1바이트의 부호있는 정수형 숫자를 나타냅니다.
: "부호있는"이 중요하죠
: 최상위 비트가 부호로 사용됩니다.
:
: 따라서  0x7f(127)까지는 양수이지만 0x80 ( -128 ) 부터는 음수가 됩니다.
: C언어에서 음수 표현하는 방법( 2의 보수형태 )은 아시죠?
:
: 따라서 1바이트 정수이며 음수인 (0x80)을 4바이트 정수로 캐스팅 하니까 그렇게 변환되는겁니다.
: 4바이트 정수도 음수를 표현하려면 2의보수에 따라 최상위 비트가 1이 되어야 하고요
:
: 마찬가지로 디버깅 Watch 창은 정수형으로 캐스팅해서 보여주는것이라 그렇게 보입니다.
:
: 어쨌든...
: szRead를 char형이 아닌 unsigned char로 선언하시면 원하시는 대로 될것 같은데요!
:
:
:
: 최명권 님이 쓰신 글 :
: : 답변 감사드립니다~ ^^
: :
: : 헌데 제가 여쭤본건 디버깅 Watch 창에서 데이터를 확인해보구 여쭤본거거든용.. ^^
: : 그정도는... 할줄 아는... ^^
: :
: : 데이터를 확인해 보면 0x7F 이하 일때는 *szRead의 값(szRead[0] 한 바이트니깐..)이 딱 0x7F 로 나타나는데
: : 0x80 이상의 데이터를 사용하면 szRead[0]의 값이 0xFFFFFF80 (앞의 3 바이트에 F 가..) 가 되더라구요..
: :
: : 이 이유를 모르겠더라구용.. 함수를 찾을 수가 없어서..
: :
: : 혹시 Write 나 Read의 함수의 원형을 볼 수 있는 방법이 있나요??
: : 찾기를 해서 CPort 관련 파일들을 찾아봤는데 못찾겠드라구용..
: :
: : 아시면 좀 부탁드리겠습니당.. 꾸벅
: :
: : 크레브 님이 쓰신 글 :
: : : 해답은 아니고요..
: : :
: : : 최명권님이 직접 테스트해보실만한 것들이 몇가지 있군요^^
: : :
: : : 이런 문제가 생기면 실제 받는 데이터를 찍어보고 확인하셔야 합니다.
: : : 대충 날코딩해보면..
: : :
: : : TMemo 하나 올려놓으시고
: : :
: : : AnsiString sBuf;
: : : :     for(int i = 0 ; i < Count ; i++)
: : : :     {
: : :           sBuf.sprintf("%02X", szRead[i]);
: : :           TMemo1->Lines->Add(sBuf);    
: : :          
: : : :         if(szRead[i] == ETX)
: : : :         {
: : : 
: : : :             ShowMessage("ETX");
: : : :             continue;
: : : :         }
: : :
: : : 이렇게만 해보셔도 보낸 데이터와 날라온 데이터가 어떻게  차이가 나서
: : : 조건으로 안들어가는지 확인할 수 있지 않을까요?
: : : 질문을 하거나 디버깅은 그 다음입니다.
: : :
: : : 혹시 RS232C통신이 8비트가 다 전송되는것이 아니라 7비트만 전송되는건지 의심해볼수도 있고요
: : : (결과만 본다면 말이죠 )
: : : 7비트만 전송되는거라면 ..옵션에 따라 1비트가 패리티 비트로 쓰이지 않을까하는 생각도 해보시고..등등
: : :
: : : 이것저것 많이 고민해보세요
: : : 그만큼 실력이 늘어나는것이니까요
: : :
: : :
: : : 최명권 님이 쓰신 글 :
: : : : 금목암 님이 쓰신 글 :
: : : : : 최명권 님이 쓰신 글 :
: : : : : : szBuf(0xFF) 를 Write(szBuf, 1);
: : : : : :
: : : : : : 이렇게 보내고 워치 창에서 szBuf[0] 을 봣는데요
: : : : : :
: : : : : : 왜 ' ' 공백이 찍히나용??
: : : : : :
: : : : : : 매크로 값이 0x7F 을 넘는 값을 보내면
: : : : : :
: : : : : : Read 할 때 값을 보니깐 0xFFFFFF7F 가 찍히나요??
: : : : : :
: : : : : : 7F를 안넘으면 딱 두자리로 들어오던데...
: : : : :
: : : : : 글자를 바이너리아니고 아스키로 받으신거 같네요
: : : : : 그리고 xFFFFFF7F 는  lobyte(buffer) 로 마스킹해야 합니다
: : : : : 보통 4바이트가 1문자 입니다
: : : :
: : : : 확실하게 하려면 마스킹을 꼭해야겟네요..
: : : :
: : : : 저.. 질문 한개만 더요.. 제가 마스킹을 안하고 그냥 해봤거든요
: : : :
: : : : 보내는 쪽에서는
: : : : ======================================================
: : : :     unsigned char szBuf[2];
: : : :
: : : :     szBuf[0] = ETX;
: : : :
: : : :     ComPort->Write(szBuf, 1);
: : : : ======================================================
: : : :
: : : : ComPortRxChar 에서는
: : : : ======================================================
: : : :     char *szRead = new char[Count + 1];
: : : :
: : : :     ComPort->Read(szRead, Count);
: : : :
: : : :     for(int i = 0 ; i < Count ; i++)
: : : :     {
: : : :         if(szRead[i] == ETX)
: : : :         {
: : : :             ShowMessage("ETX");
: : : :             continue;
: : : :         }
: : : :     ................ 뒷코드 생략 ....................
: : : :     }
: : : : ======================================================
: : : :
: : : : 이렇거든요..
: : : : 여기서 ETX는
: : : : #define ETX 0x7F
: : : : 를 할 경우에는"ETX" 메시지가 출력되는데
: : : : ETX가 0x7F 를 넘어서게 되면(0x80 ~ 0xFF) "ETX" 메시지가 출력이 안되더라구요..
: : : :
: : : : 제가 어떤 걸 놓치구 얘기하는 것일까요?

+ -

관련 글 리스트
52712 Comport 송신할 때 0xFF 를 보내면.... 최명권 1123 2008/03/17
52714     Re:Comport 송신할 때 0xFF 를 보내면.... 금목암 1312 2008/03/17
52716         Re:Re:Comport 송신할 때 0xFF 를 보내면.... 최명권 1234 2008/03/17
52739             Re:Re:Re:Comport 송신할 때 0xFF 를 보내면.... 물소리 1280 2008/03/18
52723             Re:Re:Re:Comport 송신할 때 0xFF 를 보내면.... 크레브 1293 2008/03/17
52732                 Re:Re:Re:Re:Comport 송신할 때 0xFF 를 보내면.... 최명권 1192 2008/03/17
52738                     Re:Re:Re:Re:Re:Comport 송신할 때 0xFF 를 보내면.... 크레브 1391 2008/03/18
52743                         두분 모두 답변 감사드립니다... 아!! 이런 간단한 실수를..... 최명권 1187 2008/03/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.