Q&A

  • RS-232통신을 위한 TMSComm 컴포넌트에 대한 문제입니다.
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까지의 값을 제대로 포트에 전달할 수 있을까요?
몇일간 인터넷을 헤맸습니다.
조금이라도 짐작이 가신다면 답변 꼭 부탁합니다. __;
2  COMMENTS
  • Profile
    KDDG_Check 2003.03.14 21:40
    안녕하세요 여유로움입니다.
    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;

    위와 같이 하시면 될것 같습니다.

    부디 도움이 되었길.....
    늦지 않았나 모르겠네요
  • Profile
    ERP 2003.03.15 02:35
    여유로움님~
    정말 감사합니다. ^-^;

    몇일동안 짧은 지식으로 이것저것 시도하며 한숨만 쉬었는데...
    이런 방법이 있었네요.
    그동안 회원가입하고 도움만 받았는데 앞으로 한델의 가족으로 활동할 겁니다.

    모든 한델인에게 저같은 좋은 소식이 있기를 바랍니다. __;