아래와 같이 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.
//**************보느라 힘드셨죠?
//계속 노력해야겠지만 조금이라도 도움을 받을수 있을까 싶어서
//이렇게 남겨봅니다.^^