RS-232통신을 위한 TMSComm 컴포넌트에 대한 문제입니다.
Import ActiveX 기능을 이용하여 Microsoft Comm Control 6.0을 Import하였습니다.
데이타를 기기로 보낼때 Output속성을 사용하여 다음과 같이 코딩하였습니다.
Type
com1: TMSComm;
TXBUF: packed Array[1..110] of Byte;
...
Function TfrmDMFood.DataTrans(ctlPort: TMSComm; intLIM: Integer): Integer;
var
i: Integer;
begin
ctlPort.InBufferCount := 0;
For i := 1 To intLIM do // intLIM : Packet Size
*** ctlPort.Output := Chr(TXBUF[i]); <------------- 여기가 문제입니다.
Sleep(200);
End;
...
DataTrans(com1, 14); // 함수호출
위의 별표한 라인이 문제입니다.
패킷을 포트로 전송하는 부분입니다.
for loop를 돌면서 ctlPort.Output에 Byte를 Char로 바꾸면서 넣어주는데
Byte값이 128까지는 제대로 값이 들어가는데 129이상이 되면 포트에
00이 들어갑니다.
예를 들어, ctlPort.Output := 10; 했을때는 10이 Output 포트로 전달되는데
ctlPort.Output := 150; 했을때는 00이 Output 포트로 들어갑니다.
즉, 128부터 255까지는 00으로 되어서 쓸 수가 없는 거죠.
유니코드 문제라고 하는데...
어떻게 코딩하면 128부터 255까지의 값을 제대로 포트에 전달할 수 있을까요?
몇일간 인터넷을 헤맸습니다.
조금이라도 짐작이 가신다면 답변 꼭 부탁합니다. __;
MSComm을 이용하여 이진형식의 데이터를 보내려면
바이트배열을 가지고 있는 Variant를 보내야 합니다.
간단히 코딩해 보면
var
SendStr : Variant;
begin
SendStr := VarArrayCreate([0,9],varByte);
SendStr[0] := 3;
SendStr[1] := 32;
SendStr[2] := 33;
SendStr[3] := 48;
SendStr[4] := 60;
SendStr[5] := 97;
SendStr[6] := 128;
SendStr[7]:= 129;
SendStr[8] := 200;
SendStr[9] := 255;
MSComm1.Output := SendStr;
위와 같이 하시면 될것 같습니다.
부디 도움이 되었길.....
늦지 않았나 모르겠네요