掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
CommXでバイナリ受信(2) (ID:38390)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
(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;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.