(D6P)何度もお世話になり申し訳ありません。
先日同じタイトルで質問させていただき完成したと思っていましたがよく見ると数%の割合で結果がおかしいことがわかりました。原因はPCharなどのポインターに関連する基本的な知識なしに細切れに出るデータを一群にまとめる方法が分からずにデタラメをやっていることにあると自覚しています。HELPなどではどうしても理解できまくて進みませんのでお尋ねさせていただきました。
今度はリクエストを送信して結果を(一文字受信で)受信しようとするものです。一群の文字列が確実であればLongIntなどなどのデータは前回教えてもらった方法で取れていると思います。
/// Global
US:string; //エラーが出るのでやむなくStringにしましたがどうしたらよいか分かりませんでした。
procedure TForm1.Button1Click(Sender: TObject);
var
tkeika:real;
i,i0,i1,i2,i3:integer;
t0,t1:tdatetime;
begin
comm_open; // オープン
Trans_Req; // 各種のデータ送信リクエスト
t0:=now;
i:=form1.commx1.getreceivelength;
while (i=0) and (tkeika<2) do begin //信号が来るまで待つ
application.Processmessages;
t1:=now;
tkeika:=(t1-t0)*24*3600;
i:=form1.commx1.getreceivelength;
end;
if tkeika>1.9then begin // タイムアウトの処理
dltimeout:=1;
end else begin
// バッファーに来る全データを受信
while form1.commx1.getreceivelength>0 do begin
i3:=i2;
i2:=i1;
i1:=i0;
i0:=form1.commx1.ReceiveChar;
if (i0=16) and (i1=3) and (i2=16) then begin
ana_disp;;
end;
us:=us + char(i0); //ここが問題ではないかと思います。これでも95%程度はOKなのですが・・・
end; //While
end; //tkeika
end;
Procedure ana_disp;
var
p,ID:integer;
i1:shortint;
i2:smallint;
i4:longint;
sgl:single;
begin
p:=0;
ID:=Pbyte(Integer(us)+p+1)^;
if ID=8 then begin
p:=p+3;
i4:=plongint(integer(us)+p)^;
form1.memo1.text:=inttostr(i4);
p:=p+4;
sgl:=psingle(integer(us)+p)^;
form1.memo12.text:=floattostr(sgl);
・
・
・
end;
(類似のもの各種あり)
end;
ちょっと待とうよ。
何が原因かもわからずにやみくもにやっても意味がないだろ。
>デタラメをやっていることにあると自覚しています。
自覚はいいんだが、本当にそこが原因なのか?
ささ様、どうもすみません。どんなことをやりたいかの例として出してしまいました。前回質問時にポインター型の変数を使えば各種の型のデータを抽出できることを知りました。でもここで書きましたように分割して送られてくる個々のデータをまとまった変数にまとめる方法がわからなくて書いてしまいました。
>ちょっと待とうよ。
わずかな本を頼りにDelphiを始めたのですがその本にはポインター型というものがある、という程度しか書いてありませんでしたので改めてネットで見てみるとポインターに関する入門記事がいくつか発見しました。この際ちょっと待ってポインターの勉強をしてなんとかモノにしたいと思います。
ツイート | ![]() |