0

Kohlerアクティブメーターと通信しようとしています。半二重です。すべてのプロトコルを読みました。Kohler には、プロファイルを表示する独自のソフトウェアがあります。プロファイルを読んでいる間、私はそれがどのように起こっているかを見ようとしました. データの送受信。次に、C# でプログラムを作成しようとしました。最初のステップで通信するには、ボーレートを 300 に選択し、次に 4800 にする必要があります。

ここに私の問題があります:

  1. F5 を使用してプログラムをデバッグしようとすると、通信していません。しかし、モード F11 へのステップを使用すると、機能していますか? しばらく待つべきだと思います。何か案が?

  2. ボーレートを 300 から 4800 に変更しようとすると、モード F11 に入ることができません。変更されているかどうかソフトウェアで確認しましたが、問題ありません。これは何について考えていますか?

4

3 に答える 3

1
  1. これは、シリアル ポートを使用する場合によくある事故です。これらは、特に 300 ボーで非常に遅いデバイスです。これは 33 ミリ秒あたり 1 文字にすぎず、最新のマシンでは永遠です。デバッガーを使用すると、人為的にプログラムの速度が低下します。多くの。シリアル ポート ドライバーが完全なデバイス応答を受信する時間を与えます。シングル ステップまたはブレークポイントなしで実行すると、SerialPort.Read() 呼び出しは一度に 1 文字または数文字しか返しません。これを修正するには、適切に設定された NewLine プロパティを指定して ReadLine() を使用するか、完全な応答が得られるまで受信したバイトをバッファーに格納します。

  2. ボーレートを変更するだけではなく、常にデバイスのレートと一致する必要があります。

于 2011-08-18T13:30:59.877 に答える
0

リクエストを送信する前に、しばらくお待ちください。F5 でデバッグするときは、待機しません。しかし、F11ではやむを得ず待ちます。これはまた、待っているとプログラムがうまく機能することを示しています:)「無料のシリアルポートモニター」などの監視プログラムを使用して、最初にコーラー自身のプログラムを実行してこれらの待機時間を調べます。
ストリームリーダーとストリームライターを使用して、メーターと通信できます。お気に入り

 writer = new StreamWriter(((System.IO.Ports.SerialPort)serialPort).BaseStream);
 reader = new StreamReader(((System.IO.Ports.SerialPort)serialPort).BaseStream);

ユーザー書き込みコマンドの直後に writer.Flush() コマンドを使用することを忘れないでください。コマンドをメーターに送信する前に時々待機するには、 System.Threading.Thread.Sleep(250);code を使用します。250 はミリ秒です。リクエストを送信してから待つことはお勧めしません。新しいリクエスト、ACK メッセージなどを送信する前に待機します。kohler 自身のプログラムがコマンド間で待機しすぎる場合は、シリアルポートのタイムアウト値を設定します ...

(serialport).ReadTimeout = xxx;
(serialport).WriteTimeout = xxx;
于 2011-08-18T13:21:32.287 に答える
0

「Free Serial Port Monitor」このプログラムは本当に私の心を開いてくれました。どうもありがとう@ferda。そして私は問題を解決しました。待ち時間についてでした。最初に、そのプログラムを使用してリクエストの時間と回答を見ました。次に、Flush コマンドも使用しました。FreeSerial Port Monitor プログラムを再度使用して、プログラムの出力を監視しました。最後に、データを送信し、4800 ボーレートでデータを受信できました。Kohler では、C# でボーレートを変更するだけでうまくいきました。他には何も必要ありません。

于 2011-08-19T09:00:07.120 に答える