Q&A

  • comport 수신시....
아래와 같이 comport로 송수신할 수 있도록 프로그램을 짰는데

프로토콜은
1BH+02H+data(4)+0DH
이런식입니다.


그래서 아래와같이 프로그램을 짯을때는 수행이 잘되는데
프로토콜을 추가해서

1BH+02H+commend(2)+data(4)+0DH

송신은 잘 되는데 수신시 올바른 값을 계산하지 못했습니다.

앙... 질문을 올리는것도 쉽지가 않네요..

왜그럴까요...이틀동안이것저것 하루종일 만져봤는데두..

//=============프로그램 시작

unit Test1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  CPort, StdCtrls, Math;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    ComPort1: TComPort;
    Label1: TLabel;
    Label2: TLabel;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    Edit2: TEdit;
    Edit3: TEdit;
    Label3: TLabel;
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Button1Click(Sender: TObject);
    procedure ComPort1RxChar(Sender: TObject; Count: Integer);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  cc:integer;

implementation

{$R *.DFM}

//======송신===================================================

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
        cc  :string;
        sstr:integer;
begin
    if key = #13 then  //Enter Key 눌렀을때

        begin
        Key := #0;     //소리안남
        TEdit(Sender).SelectAll;  //text모두선택

   if RadioButton1.Checked then ComPort1.Port := 'COM1'
   else if RadioButton2.Checked then ComPort1.Port := 'COM2';

   sstr:=strtoint(edit1.text);
   cc:=#$1B+#$02+inttohex(sstr,4)+#$0D;    //통신프로토콜


//********이부분을  임시로 commend 추가해서
//********cc:=#$1B+#$02+inttohex(02,2)+inttohex(sstr,4)+#$0D;
//********이러케 바꾸구



   comport1.writestr(cc);

    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
        close;
end;

//=====수신====================================================

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
        s         : array[0..100] of char;
        rxbuf     : array[0..100] of char;
        i,j       : Integer;
        rxcnt     : Integer;
        flgRcvHed : Boolean;
//        rcv_ok    : Boolean;
        sum,aa,bb,cc,dd       : extended;

begin
        rxcnt     := 0;
        sum  :=0;
        flgRcvHed := false;
//        rcv_ok    := false;

        for i:=0 to 100 do begin
                s[i] := #0;
                rxbuf[i] := #0;
        end;

        ComPort1.Read(s,count);

        for i:= 0 to count do
        begin
                if s[i]=#$1B then
                begin
                       j:=1;
                       if s[j]=#$02 then
                       begin
                           rxcnt:=0;
                           flgRcvHed := true;
                       end;
                end;


                if flgRcvHed = true then
                begin
                        rxbuf[rxcnt] := s[i];

                        if (rxbuf[rxcnt] = #$0D) and (rxcnt =6) then
//****** 이부분은  if (rxbuf[rxcnt] = #$0D) and (rxcnt =8) then

                        begin
                                rxcnt := rxcnt+1;
                                rxbuf[rxcnt] := s[i+1];
                                flgRcvHed := false;
//                              rcv_ok    := true;
                                break;
                        end;
                        rxcnt := rxcnt+1;
                end;
        end;

//        if rcv_ok=true then
//        begin
                for i:=2 to 5 do

//*******여기는   for i:=4 to 7 do

                begin
                        if (ord(rxbuf[i])<65) then
                                rxbuf[i] := char(ord(rxbuf[i])-48)
                        else
                                rxbuf[i] := char(ord(rxbuf[i])-55);

                        sum:=sum+(ord(rxbuf[i])*power(16,(5-i)));

//*******여기는            sum:=sum+(ord(rxbuf[i])*power(16,(7-i)));
  
                end;

               //case=>0,1,2,... commend가 어떤 값이면...아래수행.. 하게하장

                edit2.text:=Format('%4.0f',[sum]);
//        end;

//        rcv_ok := false;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
        ComPort1.Open;
end;

end.


//**************보느라 힘드셨죠?
//계속 노력해야겠지만 조금이라도 도움을 받을수 있을까 싶어서
//이렇게 남겨봅니다.^^
1  COMMENTS
    • 박상현
    • 2002.08.21 03:34
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.08.21 03:55
      안녕하세요. 최용일입니다. Drag 관련 속성과 이벤트를 사용하세요. 간단히 됩니다. 델파이 도움말에...
    • 이추형
      2002.08.24 20:38
      오렐리(O'rally)에서 나온책을 보시면 활용에 대한 많은 예제와 설명이 있습니다.
    • 델유저
      2006.12.12 02:47
      ...
    • 김의태
    • 2002.08.21 02:22
    • 5 COMMENTS
    • /
    • 0 LIKES
    • KDDG_Jo
      2002.08.21 02:37
      위쪽만 디자인및 코딩하신후 NeedData를 사용해보세여   private   &nbs...
    • 김의태
      2002.08.21 02:49
      죄송한데...안되는데요..ㅠ.ㅠ 똑같이 한번 해봤는데...그냥 똑같이 나와요..ㅠㅠ 에겅..어떻게 다시...
    • KDDG_Jo
      2002.08.21 02:54
      테스트를 먼저 한번해보세여 1. QuickRep1.HasDetail = True 2. DetailBand1에 QRLabel1을 하나...
    • 김의태
      2002.08.21 03:09
      되네요..ㅋㅋ 근데 디테일 밖에 안되네요... 페이지 헤더랑 풋터 모두 통째로 같이 두개 찍히게 하는...
    • ^ㅡ^
      2002.08.21 03:27
      도움이 될지 모르겠네요...... 그냥 페이지해더와 풋터를 없세고요 디텔에서 그냥 그리세요 반만...
    • byun
    • 2002.08.21 01:49
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 한하눌
      2002.08.21 06:55
      다음을 엑셀메크로에서 실행해보시면 힌트를 얻을수도 있겠네요 Sub Macro1()    &nb...
    • 장태원
      2002.08.21 01:26
      에구..바보시네용..ㅡㅡ; tmainmenu 올려놓고 디자인하고 xpmenu 올리시면 됨. xpmenu 의 autodete...
    • 장태원
      2002.08.21 01:10
      아마도. .inttostr( ) 사용하시면 될듯...맞나..에구..ㅡㅡ;
    • ㄴ ㅏ ㅁ ㅑ
      2002.08.21 01:40
      헤헤 실수형이니깐 FloatToStr 을 썼더니 되더라구여. 쫌더 생각해보고 질문하는 습관을 길러야겠어...
    • 이창환
      2002.08.22 02:17
      제가 볼때.. 로직상의 문제로 보이거든요.. 전에도 이런문제로 찾아 보았는데.. 무한 루프일 가능성.. 프...
    • 석재명
      2002.08.21 14:08
      Oracle의 파라미터 화일에서(init[sid].ora file) OPEN_CURSORS 라는 항목의 숫자를 늘려주면 됩니다.
    • 코난
    • 2002.08.20 23:46
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이추형
      2002.08.24 18:42
      오라클에서 그런메세지는 나옵니다. 이럴경우 서버의 상태가 Busy해서 많은 응답을 할수 없을때 입니다. ...
    • 하늘벌레
      2002.08.21 00:50
      edit2.text:=edit1.text  <==이렇게 하심 덮어 써지구요 edit2.text:=edit2.text+edit1.te...
    • ㄴ ㅏ ㅁ ㅑ
      2002.08.21 01:03
      제가 너무 생각을 하다보니 저두 정리가 잘 안되네요 딴데서 문제였던것 같습니다. ㅎㅎ... 아무튼 감...
    • 델사랑
    • 2002.08.20 23:34
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 장태원
      2002.08.21 01:12
      Tbatchmove 를 사용하세요.. mode 를 batAppendUpdate 로 하시고용. 그럼 추가 수정 자동으로 올라...
    • 델사랑
      2002.08.21 01:39
      처음에 데이타를 올릴때 어떻게 해야되요? 한달동안 저장된 데이타를 맨처음으로 서버에 올릴때 어떻하죠?...
    • 김재준
    • 2002.08.20 23:22
    • 1 COMMENTS
    • /
    • 0 LIKES
    • KDDG_Jo
      2002.08.21 01:45
      Align 속성을 alNone 되있는지 확인하신후 width 와 height 를 변경하면 크기를 조절할수 있습니다.
    • 천상천하
      2002.08.21 00:14
      Uses ..., Printers; // 미리보기 폼을 가지고 사용한 것 입니다. // PrintDialog 이용시 procedure...
    • 손광현
    • 2002.08.20 22:35
    • 2 COMMENTS
    • /
    • 0 LIKES
    • KDDG_Jo
      2002.08.21 01:25
          procedure FormCreate(Sender: TObject);   private   ...
    • 하늘벌레
      2002.08.21 00:46
      차라리 프로시저를 따로 정의하고 MouseDown 에서도 해당 프로시저를 호출하고 버튼클릭 이벤트에서...
    • 맑은물
    • 2002.08.20 07:09
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 장태원
      2002.08.21 01:24
      prepare 던가.. requestlive 던가... true 로 바꾸셈. 맞나몰겠네.
    • KDDG_Jo
      2002.08.21 01:52
      textOut을 이용하면 한셀에 여러줄을 나타낼 수 있습니다.
    • 김동욱
    • 2002.08.19 23:43
    • 1 COMMENTS
    • /
    • 0 LIKES
    • KDDG_Jo
      2002.08.21 02:28
      한번에 다 출력하기에는 힘들어 보이네여(메모리 문제일듯..) 2000건씩 나눠서 출력하시는게 좋겠네여