掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
CommX・WindowsXPで通信不可 (ID:10742)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
まずハッキリさせておきたいのですが受信できない環境というのは 手元にあるのでしょうか? 手元にある場合はOnReceive内にブレイクポイントを設けて受信でき るか調べることでTCommXが悪いのか使い方の問題か切り分けられる と思います。 手元にない場合は受信したデータをひたすらTListBoxなどに送る だけのプログラムを作成しそれを受信できない環境をお持ちの人に 配布しどのようなデータが送られてくるのかを確認することで解決 につながるかと思います。 次にソースを拝見しましたが、どちらかというとTCommXのプロパティ に代入している部分つまり初期設定を見たかったのですが無いよう なのでなんとも言えませんが まずCommX1Receiveイベント内で CommX1.ReceiveBlock(buf,28); for i := 0 to 27 do begin weightbufA := weightbufA + Buf[i]; end; と28バイトのデータがあることを期待して処理しておられるようですが Receiveイベントは最初の1バイト目でも発生することも十分考えられる ので、この処理方法は問題があると思います。 また何かの拍子にデータの受信に失敗し1バイトずれただけでもその後 同期がとれなくなると思います。 CRLFがデリミタということで似たような物を過去に作ったことがありま すので、そのときのサンプルソースを提示します。 受信クラス interface uses CommX,ExtCtrls,Classes,SysUtils; type TCommInReceiveEvent = procedure(Sender: TObject; ReceiveStr: string) of Object; //--------------------------------------------------------------------------// // プリンターからの受信クラス // //--------------------------------------------------------------------------// type TCommIn = class(TPersistent) private { Private 宣言 } FComm : TCommX; FRecStr : string; FOnReceive: TCommInReceiveEvent; procedure DoReceive(str : string); procedure OnCommReceive(Sender: TObject; ReceiveSize: Integer); public { Public 宣言 } constructor Create; destructor Destroy;override; procedure PortOpen(); procedure PortClose(); property OnReceive : TCommInReceiveEvent read FOnReceive write FOnReceive; end; implementation { TRdSchedulelItem } constructor TCommIn.Create; begin FComm := TCommX.Create(nil); FComm.OnReceive := OnCommReceive; end; destructor TCommIn.Destroy; begin FComm.Free; inherited; end; procedure TCommIn.DoReceive(str: string); begin if Assigned(FOnReceive) then FOnReceive(Self,str); end; procedure TCommIn.OnCommReceive(Sender: TObject; ReceiveSize: Integer); var i : integer; d : integer; Buf :array[0..2047] of char; // 受信バッファ begin FComm.ReceiveBlock(Buf,ReceiveSize); // 受信バイト数分まとめて取得 for i := 0 to ReceiveSize-1 do begin // 受信データバイト分ループ d := Integer(Buf[i]); // 1バイトずつ処理 case d of $0a: begin FRecStr := FRecStr + Char(d); DoReceive(FRecStr); FRecStr := ''; end; else begin FRecStr := FRecStr + Char(d); end; end; end; end; procedure TCommIn.PortClose; begin FComm.PortClose; end; procedure TCommIn.PortOpen; begin FComm.PortNo := 1; // ポート番号 FComm.BitRate := 115200; // 通信速度 FComm.CharSize := 8; // データ長 FComm.ParityBit := cpbEven; // パリティチェック FComm.StopBit := csb1; // ストップビット FComm.FlowCtrl := cfcRtsCts; // RtsCtsフロー制御 FComm.TimeOutTrans := 1000; // タイムアウトを1秒に設定 FComm.PortOpen; end; というクラスを作成しておき FormのPrivateに FCommIn : TCommIn; procedure OnCommReceive(Sender: TObject; ReceiveStr: string) ; という具合に定義した後、Formにはイベントとして FormCreate、FormDestroy、FormShow を作ります。 FormCreate内に FCommIn := TCommIn.Create; FCommIn.OnReceive := OnCommReceive; FormDestroy内に FCommIn.PortClose; FCommIn.Free; FormShow内に FCommIn.PortOpen; と定義すれば1データ受信の度に procedure TForm1.OnCommReceive(Sender: TObject; ReceiveStr: string); 内に処理がくるかと思います。 こういう使い方をしておけば先ほど言ったような不具合は起きないと思われます。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.