Q&A

  • 포인터(배열)과 시리얼통신...
시리얼 통신에 문제가 생겼어요..
그냥 배열에 데이타를 쭉 넣어서 보내면 데이타를 잘 받거든요..

그런대
이렇게 동적 생성을 하거나 포인터를 사용하면..
데이타를 전송해서 받으면 깨져서 나와요..
중간에 동적생성한 데이타가 50바이트가 아니라 4~5 바이트 정도이고..
또 그 내용도 엉망이군요...

시작바이트와 끝바이트는 제대로 들어오는데
중간에 있는 데이타가 문제가 되요..

살펴보고 답변주시겠어요?
부탁드립니다...(-.-)(_ _)

Type
        SendFrame = Record
                StartData : byte;
                SendData : array of Byte;
                EndData : byte;
        end;

var
       DataFrame : SendFrame;


...


       DataFrame.StartData := START_DATA;
        DataFrame.EndData := END_DATA;
        SetLength(DataFrame.SendData, 50);

        for i := 0 to 49 do
        begin
                DataFrame.SendData[i] := SendData;
        end;        
        
        count := CommPort.Write(DataFrame.StartData, 52);

.. 수신부는요..

      .....
       bytes := CommPort.Read(buffer^, cnt);

이렇게 받거든요....
1  COMMENTS
  • Profile
    강두헌 2002.02.08 01:01
    초보의 허접한 답변이니 그냥 참고만 하세요.


    이 부분이 문제인거 같은데요. 사용하시는 CommPort라는 Class의 내부를 알아야 겠지만, 제가 보기에는 DataFram.StartData의 메모리 번지 부터 시작해서 정해진 크기만큼 읽어서 전송을 하려고 하는걸로 보이네요.
    그럼 실제 메모리 상태는 어떨까요.
    처음 DataFrame이란 변수가 생성될때 Byte+Pointer+Byte형태로 메모리를 할당하지요. 그다음에 동적으로 SendData의 크기를 지정하면 그에 알맞는 메모리를 다시 할당하고 앞에 Pointer로 하여금 그 위치를 가르키도록 하겠지요.
    즉, 메모리의 상태가
    Byte+Pointer+Byte ....  Byte+Byte+.....+Byte
    이런 구조로 될거란 말입니다.
    그런데 전송은 첫번째 Byte부터 시작해서 52개를 읽어서 보내라고 하니 못보내고 겨우 pointer의 크기(아마 4byte일겁니다.)만큼만 보내지요.
    CommPort도 없고 해서 test는 못해보지만, 제 생각에 이렇게 Codeing해야 할거 같네요.

        count := CommPort.Write(DataFrame.StartData, 1);
        count := CommPort.Write((DataFrame.SendData)^, 50);
        count := CommPort.Write(DataFrame.EndData, 1);

    잘되길 바랍니다.