|
그게 궁금하신거군요.
하지만 그것은 통신 문제가 아닙니다.
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" 메시지가 출력이 안되더라구요..
: : :
: : : 제가 어떤 걸 놓치구 얘기하는 것일까요?
|