IntToHex 랑은 좀 다릅니다.
Hex값 0x30 을 만들려면 16*3= 48 즉 문자열 "48"을 입력해야 IntToHex로 0x30으로 변환이 가능하죠
님께서 하고자 하는것은
문자열 "30"을 Hex값 0x30으로 변환하고자 하는것이지 않습니까?
이럴땐 IntToHex가 아니라
HexToBin 이라는 함수를 사용하면 됩니다.
HexToBin의 반대는 BinToHex이구요
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=919
Edit에 문자열을 다음과 같이 붙여서 "303132333435" 식으로 입력하셨으면
다음과 같이 Length를 2로 나누어서 처리해야 합니다.
procedure TForm1.Button1Click(Sender: TObject);
var
buf: array [1..1024] of Char;
outbuf: array [1..1024] of Char;
str,outstr: String;
len: Integer;
begin
str:=Edit1.Text;
len:=Length(str) div 2;
HexToBin(PChar(str),@buf[1],len);
//buf에 값을 .. SerialPort등으로 전송...
end;
그러면 buf에 0x30 0x31 0x32 0x33 0x34 0x35 값이 담기게 될것입니다.
만약 Edit에 space를 주고 싶거나 0x나 $표시같은 것을 하고 싶다면
HexToBin함수 호출하기 전에 모두 제거한 후에 호출해주면 될것입니다.
아니면 다음과 같이 VCL의 HexToBin함수를 수정하여
사용하시면 될것입니다.
다음 HexToBinEx 함수는 space로 문자가 구분되어있다고 판단하고
기존 HexToBin함수에서 Inc(Text, 2); 를 Inc(Text, 3);으로 살짝 수정한 것입니다.
function HexToBinEx(Text, Buffer: PChar; BufSize: Integer): Integer; assembler;
const
Convert: array['0'..'f'] of SmallInt =
( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,10,11,12,13,14,15);
var
I: Integer;
begin
I := BufSize;
while I > 0 do
begin
if not (Text[0] in ['0'..'f']) or not (Text[1] in ['0'..'f']) then Break;
Buffer[0] := Char((Convert[Text[0]] shl 4) + Convert[Text[1]]);
Inc(Buffer);
Inc(Text, 3); //space 1개로 구분되는경우
Dec(I);
end;
Result := BufSize - I;
end;
위와같은 경우에는
Edit에 "3021334353"이런식으로 붙여쓸것이 아니라
다음과 같이 "30 21 33 43 53" 뛰워쓴후에 HexToBinEx를 호출해주면 될것입니다.
그럼...
오델로 님이 쓰신 글 :
: 일단 간략하게 설명드리겠습니다......
: cport통신이용할려고하는데요
:
: 에디트창을만들어서 입력받은값을 헥사로 바꿔서 쓸려고 하는데요 잘안되네요........
: 제가 장비로 보내고 싶은값은
: #$02#$30#$30#$42#$30#$30#$ㅁㅁ#$33#$67#$03;
: 또는#$02+#$30+#$30+#$42+#$30+#$30+#$30+#$ㅁㅁ+#$67+#$03;
: 입니다.....요걸 그냥 write써서 보내면 반응을 합니다. 문제는 이 값들이 바꿔주어야 한다는 겁니다.
:
: 예를 들어 텍스트창에 3을 입력하면 ㅁㅁ 자리에 hex값이 입력되게끔 구현하고 싶은데요
: 어찌하면될까요?
:
: 무작정물어보는건아니구요 제생각을 말씀드리면 일단 텍스트는 스트링으로 받으니 그걸 int로 변환한후 ㅁㅁ 자리에 넣주면 된다는 굉장히 어설푼 생각인데요 이리 하면 형변환문제가 발생하네요 pchar 이랑 안맞는다고......ㅡ.ㅡ;;; 소스 올려볼게요 수정이나 아니면 방법을 알려주세요...ㅡ.ㅡ
:
: var senddata: pchar;
: s:string;
: i:integer;
: begin
: s:=edit1.text; <--------2자리 정수로 입력받아요 1-99 까지
: mm:=strtoint(s);
:
: if com1.Connected=true then
: begin
: SendData:=#$02#$30#$30#$42#$30#$mm#$30#$33#$67#$03
: Com1.Write(sendData,Length(SendData));
: end;
:
:
: 이런식으로 하면될거같은데요....ㅡ.ㅡ mm을 헥사값으로 바꾸는거랑 inttohex(mm);<----맞나요
: 또 mm을 넣는 방법이랑 맞는지좀 봐주세요...ㅡ.ㅡ 너무 허접한걸로 질문드려 대단히 죄송합니다.ㅡ.ㅡ;;;;