Q&A

  • 시리얼통신에서 데이타를 받는 이벤트에서 에러가..
이것은 시리얼통신에서 데이타가 도착하면 데이타를받는 이벤트 핸들러에

정의한 코드입니다.

procedure TForm2.cp1RxChar(Sender: TObject; Count: Integer);



var

Str:String;

Vin,Iin,Vout,Iout,Vd,Vb :String;

i :integer;



begin



CPort1.ReadStr(Str, Count);//들어온 데이타를 읽습니다.



for i := 1 to Count do begin

Vin := Char(Ord(Str[1])) + Char(Ord(Str[2])) + Char(Ord(Str[3])) ;

//들어온 데이타중 1번째 2번째 3번째것을 VIn이라는 변수에 저장합니다.

들어온 데이타를 ASCII로 읽엇으므로 Char연산으로 문자형으로

만들어줍니다.



lab1.Value := Vin;

//lab1은 라벨의 일종인데 정수형,더블 실수형데이타를 value 속성에

입력할수 있습니다..

단 문자형은 입력할수 없습니다..프로그램을 실행시켜보면 lab1에 Vin의 값이

나타납니다..







If (StrToInt(Vin) < Meter1.ThresholdLow) or (StrToInt(Vin) >

Meter1.ThresholdHigh ) then begin

//이줄에서 에러가 나고있습니다.. Meter1,과 Meter2는 정수형만을

입력받습니다. ThresholdLow와 ThresholdHigh는 Meter의 property로 정수형

값을

갖습니다. vin이 문자형변수이므로 정수형으로 만들어주기위해

STrtoInt함수를 썼습니다.



Meter1.Value:= 0;

Meter2.Value := 0;

Meter1.Enabled := False;

Meter2.Enabled := False;

lab1.Value:= 0;

lab2.Value:= 0;

end



else begin

lab1.Value := StrToInt(Vin);

Meter1.Value := lab1.Value;

end;



cp1(이것은 시리얼통신용 콤포넌트입니다.)이 데이타를 받았을때 프로그램

자체가 서버립니다..

아마도 IntToStr(vin) < meter1.ThresholdLow ... 등등의 경우에서 뭔가

적절치 못한값이 meter1.Thresholdlow에 들어갔나봅니다..

에러메시지는뜨지 않습니다..단지 프로그램이 서버립니다..

부디 절 좀 도와주세요...



딱히 물어볼만한 사람이 없어서 이렇게 염치불고하고 질문합니다..

바쁘신중에 죄송합니다..







1  COMMENTS
  • Profile
    이준해 2000.06.20 02:12
    답을 드리지는 못합니다.

    Serial Component, Application Source, Serial Port Setting에 대해 알 수

    없으니까요.



    제가 전에 Serial 통신을 구현한 경험으로 보면 Serial Component 문제인것

    같습니다. Delphi Version, OS Version 별로 검증된 Component가 있고

    그렇지 않은 것이 있던 기억이 납니다.(Freeware중에서)



    제가 애를 먹었던 기억은

    1. Serial Component의 Buffer를 읽거나 쓰는중에 Application이 선다(??!!)

    2. Serial Component마다 Read, Write할때 대기시간등을 설정하는 게 있는데

    이것이 OS에(9X, NT) 따라 문제를 일으키기도 합니다.

    (Buffer sync 문제나, Serial 디바이스 Handling 하는 방법의 문제로 추측)



    제가 권하고 싶은 것은

    1. Component를 두어가지 구해서(직접 asm등으로 만들진 않으셨겠죠 ?)

    같은 작업을 해보세요(돈드는 거 아니니깐)

    2. Serial Port 관련 timeout등의 설정을 변경시키면서 작업해 보세요.



    3. 참고로 저는 DSP에서 아래 Component를 구해 썼습니다.



    // TComPort component ver. 2.00 for Delphi 2, 3, 4, 5

    // written by Dejan Crnila, 1998 - 1999



    도움이 되길..



    이준해





    최 소 영 wrote:

    > 이것은 시리얼통신에서 데이타가 도착하면 데이타를받는 이벤트 핸들러에

    > 정의한 코드입니다.

    > procedure TForm2.cp1RxChar(Sender: TObject; Count: Integer);

    >

    > var

    > Str:String;

    > Vin,Iin,Vout,Iout,Vd,Vb :String;

    > i :integer;

    >

    > begin

    >

    > CPort1.ReadStr(Str, Count);//들어온 데이타를 읽습니다.

    >

    > for i := 1 to Count do begin

    > Vin := Char(Ord(Str[1])) + Char(Ord(Str[2])) + Char(Ord(Str[3])) ;

    > //들어온 데이타중 1번째 2번째 3번째것을 VIn이라는 변수에 저장합니다.

    > 들어온 데이타를 ASCII로 읽엇으므로 Char연산으로 문자형으로

    > 만들어줍니다.

    >

    > lab1.Value := Vin;

    > //lab1은 라벨의 일종인데 정수형,더블 실수형데이타를 value 속성에

    > 입력할수 있습니다..

    > 단 문자형은 입력할수 없습니다..프로그램을 실행시켜보면 lab1에 Vin의 값이

    > 나타납니다..

    >

    >

    >

    > If (StrToInt(Vin) < Meter1.ThresholdLow) or (StrToInt(Vin) >

    > Meter1.ThresholdHigh ) then begin

    > //이줄에서 에러가 나고있습니다.. Meter1,과 Meter2는 정수형만을

    > 입력받습니다. ThresholdLow와 ThresholdHigh는 Meter의 property로 정수형

    > 값을

    > 갖습니다. vin이 문자형변수이므로 정수형으로 만들어주기위해

    > STrtoInt함수를 썼습니다.

    >

    > Meter1.Value:= 0;

    > Meter2.Value := 0;

    > Meter1.Enabled := False;

    > Meter2.Enabled := False;

    > lab1.Value:= 0;

    > lab2.Value:= 0;

    > end

    >

    > else begin

    > lab1.Value := StrToInt(Vin);

    > Meter1.Value := lab1.Value;

    > end;

    >

    > cp1(이것은 시리얼통신용 콤포넌트입니다.)이 데이타를 받았을때 프로그램

    > 자체가 서버립니다..

    > 아마도 IntToStr(vin) < meter1.ThresholdLow ... 등등의 경우에서 뭔가

    > 적절치 못한값이 meter1.Thresholdlow에 들어갔나봅니다..

    > 에러메시지는뜨지 않습니다..단지 프로그램이 서버립니다..

    > 부디 절 좀 도와주세요...

    >

    > 딱히 물어볼만한 사람이 없어서 이렇게 염치불고하고 질문합니다..

    > 바쁘신중에 죄송합니다..

    >

    >

    >