0

コマンドを開発者に送信しようとしています。ボードしてから返信を受け取る

例えば

(私) set attrib=yes

(開発委員会) OK

また

(開発委員会) ERR

しかし、それは何も跳ね返りません... OKでもERRでもありません

ボードの起動中にエコーがオンになっているため、ボードの起動中にコマンドを送信すると、「set attrib = yes」が返され、起動中にコマンドを送信できないため、「ERR」が起動されます。

私の最善の推測は、返信を時間内に読んでいないか、すぐに読もうとしているということです。

procedure TReaderProgrammer.Button2Click(Sender: TObject);
Var 
  Buffer: AnsiString; 
  RxData: string; 
  Count : integer;
begin
  if ComPort1.Connected then
  begin
    ComPort1.WriteStr(edtSendText.Text+#13);
    comport1.ReadStr(RxData,Count);
    Buffer := Buffer + Rxdata;
    memoRxData.Text := memoRxData.Text+Buffer+#13+#10;
  end;
end;
4

1 に答える 1

3

ここに未解決の質問がいくつかありますので、間違っているかもしれないいくつかの仮定を立てる必要がありますが、見てみましょう.

どの通信ポート ライブラリを使用しているかわかりませんので、SourceForge の CPort ライブラリだと思います。私はそれを自分で使用したことはありませんが、送信前にライブラリによって ansistring に変換される unicodestring パラメータを使用して書き込みメソッドを呼び出すことができるように、Unicode 対応になっていることを読みました。同様に、外部から ansistring を受け取ると、ライブラリは Read メソッドの unicodestring に変換します。

シリアル通信の非同期性のため、書き込みメソッドを使用して何かを送信すると、ライブラリと OS がボーレートで定義されたペースで一度に 1 つずつ文字を吐き出す間、メソッドはすぐに戻ることを理解することが重要です。その結果、外部デバイスが最初の文字を受信する前に通信ポートから読み取ろうとしていたため、最初のコードは何も受信しませんでした。OnRxChar (おそらくライブラリ イベント) のイベント ハンドラーを実装することで、成功への第一歩を踏み出したことがわかりました。

OnRxChar は、おそらく各文字 (または数文字) に対して起動します。これらのイベント間で永続的なバッファーが必要です。イベント ハンドラのローカル変数 (現在スタックに割り当てられているもの) は永続的ではなく、イベント ハンドラが終了するたびに失われます。Buffer 変数を TReaderProgrammer のフィールドとして宣言する必要があります。バッファを AnsiString に定義した理由はわかりませんが、文字列で試してみることをお勧めします (Unicode 認識に関する上記の説明を参照)。

type
  TReaderProgrammer = class
    ..
    RxBuffer: string;
    ..
  end;

コマンドへの応答として新しいデータを受信できるようにするには、外部デバイスに新しいコマンドを送信するときにバッファをクリアする必要があります。

編集:または、完全な応答を受信して​​処理したときにすぐに RxBuffer をクリアすることもできます。

TReaderProgrammer.ComPort1RxChar は次のソファのようになります。

procedure TReaderProgrammer.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  RxData : string;
begin
  (Sender as TComPort).ReadStr(RxData,Count);
  RxBuffer := RxBuffer + Rxdata;
  ...
end;

イベントハンドラーの残りの部分は、おそらく受信の進行状況を確認するためのものなので、それ以上のことはありません。

于 2014-11-15T20:03:40.510 に答える