|
14번째 데이타 값이 HEX로 0xD8 이고, 이걸 2진수로 바꾸면 1101 1000 입니다. 최상위 비트가 1이지요..
데이타가 타입이 char 이므로 최상위 비트가 1이면 당연히 음의 값이 되는 겁니다.
진법 변환에 대한 내용은 디지탈관련 책을 보시면 알 수 있을 겁니다.
그리고 제가 장비 프로토콜을 몰라서 뭐라 말씀 드리기 어려운데.. 그동안의 질문을 봤을 때 데이타값이 넘어올 때
2바이트로 넘어오는 듯 합니다. 그렇기 때문에 2바이트를 묶어서 1개의 데이타 값을 만드는 것입니다.
13,14번 데이타를 합쳐서 0x33D8 이 되면 이것은 2진수로 0011 0011 1101 1000 이 되고 최상위 비트가 0 이므로
양수값이 되는 것입니다.
Rkluv 님이 쓰신 글 :
: 안녕하세요... 답변 감사드립니다. 드디어 장비와 테스트를 진행하게 되었는데요..
:
: sMemo3->Lines->Add(sResult2);
:
: temp = 0x00FF & sResult2.c_str()[13];
: temp <<= 8;
: temp = temp | sResult2.c_str()[14];
:
: tpv = (temp / 100) - 100;
:
: 하지만 14번째에 들어오는 Data가 이상하게도 -Data가 나옵니다. 그러다 보니깐 올바른 연산을 하지 못하여,
: 애매한 Data를 리딩하게 됩니다.
: 33D8 이렇게 붙여서 한번에 10진수로 변환해보면 Data는 올바로 나오는데, 14번째 Data는 왜 -값으로 출력이 될까요.
:
:
: 정말 도움 많이 됫습니다. 감사합니다.
:
:
:
:
: 김시환 님이 쓰신 글 :
: : 아래 사용된 변수 중에서 sResult2 의 타입이 AnsiString 이네요..
: : AnsiString 이라서 당연히 에러가 발생하지요.. 문자열을 short 타입에 넣으므로 당연히 문제가 발생합니다.
: :
: : AnsiString 형이므로 아래처럼 수정하시던가
: :
: : temp = 0x00FF & sResult2.c_str()[14];
: : temp <<= 8;
: : temp = temp | sResult2.c_str()[15];
: :
: :
: : 아니면 Read2(void) 함수 내부를 보시면
: : buffer 의 내용을 sResult2로 넣으셨는데 그렇게 하지 마시고 buffer가 전역으로 선언하신듯 한데
: :
: : temp = 0x00FF & buffer[14];
: : temp <<= 8;
: : temp = temp | buffer[15];
: :
: : 그냥 이렇게 사용하시면 됩니다.
: :
: :
: : Rkluv 님이 쓰신 글 :
: : : 감사합니다. 하지만 제가 아래와 같이 CMD를 받고 읽는 함수를 쓰고 있습니다.
: : : GODSON님께서 말씀하신 코딩을 적용하면 첨부와 같은 형 에러가 발생합니다.
: : : 해결방법은 없는지요..? 아니면 다른 방법을 찾아봐야하는지요 ... 감사합니다.
: : :
: : : void __fastcall TForm1::WriteCmd2(AnsiString Write)
: : : {
: : : strcpy(stringinput,Write.c_str());
: : : status = viWrite (instr2, (ViBuf)stringinput, (ViUInt16)strlen(stringinput), &writeCount);
: : : ErorrCheck();
: : : }
: : : bool __fastcall TForm1::ErorrCheck(void)
: : : {
: : : if (status < VI_SUCCESS)
: : : {
: : : return false;
: : : }
: : : return true;
: : : }
: : : void __fastcall TForm1::Read2(void)
: : : {
: : : memset(buffer,0,sizeof(buffer));
: : : viRead (instr2, buffer, 5000, &retCount);
: : : ErorrCheck();
: : : sResult2 = AnsiString((char *)buffer);
: : : }
: : : void __fastcall TForm1::Chamberdata(void)
: : : {
: : : AnsiString CMD;
: : : float tpv;
: : : float hpv;
: : : short temp;
: : : short hum;
: : :
: : : CMD.sprintf("%c%s%c%c\n", 0x02, "002RCV", 0x03, 0x0D);
: : : WriteCmd2(CMD);
: : : Read2();
: : : temp = 0x00FF & sResult2[14];
: : : temp <<= 8;
: : : temp = temp | sResult2[15];
: : : tpv = (temp/100)-100;
: : :
: : : hum = 0x00FF & sResult2[20];
: : : hum <<= 8;
: : : hum = hum | sResult2[21];
: : : hpv = (hum/10);
: : :
: : : sLabelFX15->Caption = tpv;
: : : sLabelFX16->Caption = hpv;
: : : }
: : :
: : :
: : :
: : :
: : :
: : :
: : : 김시환 님이 쓰신 글 :
: : : : CMD.sprintf("%c%s%c%c\n", 0x02, "002RCV", 0x03, 0x0D); -> 이 부분은 문제가 없습니다.
: : : :
: : : : 16진수 데이타를 10진수로 변경하는 것은 제 경우 저는 아래처럼 사용합니다.
: : : :
: : : : short temp ;
: : : :
: : : : temp = 0x00FF & Buffer[14] ;
: : : : temp <<= 8 ;
: : : : temp = temp | Buffer[15] ;
: : : :
: : : : sLabelFX15->Caption = temp ;
: : : :
: : : : 사용하신 방법에는 문제가 많습니다. 컴파일은 되지만 실행하면 에러가 발생하게 됩니다.
: : : : 일단 사용한 변수가 전부 String Type 이기 때문에 사칙연산이 되지 않을 뿐더러 10진수로 바꿔지지도 않습니다.
: : : : 스트링은 스트링일 뿐 10진수 값은 아니기 때문입니다.
: : : :
: : : :
: : : : Rkluv 님이 쓰신 글 :
: : : : : 아아... 첫번째 인덱스에서 상대 길이 였군요... 감사합니다.
: : : : : 첨부파일은 컴아날라이저로 CMD를 날려서 데이터를 읽어 들였고, 결국 빨간 박스에 있는 값들을 받아 들여서 아래 코딩과 같이
: : : : : 작업을 한것입니다.
: : : : : 질문 1. 아래와 같이 CMD.sprintf("%c%s%c%c\n", 0x02, "002RCV", 0x03, 0x0D);를 변환 하였습니다.
: : : : : 이렇게 변환하여도 컴아날리이저에 02303032524356030D0A CMD를 날린 것과 같이 동일한 기능을 구현하는지...
: : : : : 질문 2. 들어온 Data들 중 빨간 박스의 값들을 취해 10진수로 제대로 바꾼 코딩인지,,,, 확인하고 싶습니다.
: : : : :
: : : : : 장비가 있어서 Test를 직접 하면 좋겠지만, 장비가 없어 제 생각만으로 코딩하기는 아직 실력이 너무 부족한것 같습니다 .
: : : : : 확인부탁드립니다.
: : : : :
: : : : :
: : : : :
: : : : : AnsiString CMD;
: : : : : AnsiString temp16;
: : : : : AnsiString hum16;
: : : : : AnsiString temp10;
: : : : : AnsiString hum10;
: : : : : AnsiString tpv;
: : : : : AnsiString hpv;
: : : : :
: : : : : CMD.sprintf("%c%s%c%c\n", 0x02, "002RCV", 0x03, 0x0D);
: : : : : WriteCmd2(CMD);
: : : : : Read2();
: : : : : temp16 = sResult2.SubString(14,2);
: : : : : hum16 = sResult2.SubString(20,2);
: : : : : temp10 = StrToInt(temp16);
: : : : : hum10 = StrToInt(hum16);
: : : : : tpv = (temp10/100)-100;
: : : : : hpv = (hum10/10);
: : : : :
: : : : : sLabelFX15->Caption = tpv;
: : : : : sLabelFX16->Caption = hpv;
: : : : :
: : : : :
: : : : :
: : : : :
: : : : : 송신영 님이 쓰신 글 :
: : : : : : SubString 의 두번째인자는 인덱스가아니라 첫번째 인자인 인덱스에의 상대 길이입니다.
: : : : : : 그리고 핵사값으로 "12"가 들어오면 앞에 "0x" 를 붙이고 StrToInt 하면됩니다.
: : : : : : 수신되는 데이터의 포멧이있어야 정확하게 알겠네요.
: : : : : :
: : : : : : Rkluv 님이 쓰신 글 :
: : : : : : : 안녕하세요 아래와 같이 문의드립니다.
: : : : : : :
: : : : : : : 장비에서 넘어오는 16진수 data를 10진수로 변환하려고 합니다.
: : : : : : :
: : : : : : : AnsiString CMD;
: : : : : : :
: : : : : : : AnsiString temp16;
: : : : : : : AnsiString hum16;
: : : : : : : AnsiString temp10;
: : : : : : : AnsiString hum10;
: : : : : : : AnsiString tpv;
: : : : : : : AnsiString hpv;
: : : : : : :
: : : : : : : CMD.sprintf("%c%s%c%c\n", 0x02, "002RCV", 0x03, 0x0D);
: : : : : : : WriteCmd2(CMD);
: : : : : : : Read2();
: : : : : : : temp16 = sResult2.SubString(15,16);
: : : : : : : hum16 = sResult2.SubString(21,22);
: : : : : : : temp10 = StrToInt(temp16);
: : : : : : : hum10 = StrToInt(hum16);
: : : : : : : tpv = (temp10/100)-100;
: : : : : : : hpv = (hum10/10);
: : : : : : :
: : : : : : : sLabelFX15->Caption = tpv;
: : : : : : : sLabelFX16->Caption = hpv;
: : : : : : :
: : : : : : : 컴파일 에러는 없는데 장비가 없어서 직접적으로 테스트는 못해보고 있습니다.
: : : : : : : 코드상 이상이 없는지 확인하고 싶습니다 . 감사합니다.
: : : : : : :
|