6

VS2008 Express のフォーム ベースのプログラムを使用して、SerialDataReceivedEventHandler をセットアップしました。私のシリアルポートは次のように設定されています:

115200、8N1

Dtr と Rts が有効

ReceivedBytesThreshold = 1

BlueTooth、USB to Serial 経由で接続しているデバイスがあります。ハイパー ターミナルは、任意のデータ レートで問題なくデータを受信します。データは、22 バイト長のパケットで定期的に送信されます。このデバイスは、データの送信速度を調整できます。低いデータ レート (10 ~ 20 Hz) では、以下のコードはうまく機能し、問題はありません。ただし、データ レートを 25 Hz を超えて上げると、1 回の通話で複数のパケットを受信し始めます。これが意味することは、着信パケットごとにイベント トリガーが存在する必要があるということです。より高い出力レートで、イベントが呼び出されたときにバッファー サイズ (BytesToRead コマンド) をすぐにテストし、バッファーに複数のパケットが存在するようにしました。イベントがゆっくりと発生し、コードに到達するまでに、より多くのパックがバッファーにヒットしたと思います。私が行っているテストの 1 つは、1 秒間にイベントがトリガーされる回数を確認することです。10Hzで、10 個のイベント トリガーを取得できます。100Hz では、40 のイベント トリガーのようなものが得られますが、良くありません。私のデータ レートの目標は、100Hz が許容範囲であり、200Hz が推奨され、300Hz が最適です。300Hz でも 52800bps であり、設定された 115200 ボーレートの半分以下であるため、これは機能するはずです。私が見ているものはありますか?

    public Form1()
    {
        InitializeComponent();
        serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);            
    }


    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        this.Invoke(new EventHandler(Display_Results));
    }


    private void Display_Results(object s, EventArgs e)
    {
        serialPort1.Read(IMU, 0, serial_Port1.BytesToRead);
    }
4

4 に答える 4

7

USB シリアル コンバーターの遅延時間を調整しようとしましたか? FTDI USBからシリアルへのコンバーターでも同じ問題がありました。オシロスコープを使用して、デバイスからの IN および OUT データを確認すると、コンピューターの応答が常に遅いことがわかりました。デフォルトでは、デバイスの遅延時間は 16 ミリ秒に設定されています。2ミリ秒に変更したところ、大きな違いがありました。デバイス マネージャーで USB シリアル コンバーターに移動し、詳細設定で、レイテンシー時間を 2 ミリ秒に変更します。それはうまくいくはずです。それを試してみてください。

于 2011-06-27T13:36:21.937 に答える
3

DisplayResults への呼び出しを Invoke() するのはなぜですか?

これにより、メッセージが MessageLoop にプッシュされ、不要な遅延が発生します。

分離処理のために DataReceived() が (スレッドセーフな) キューにデータをプッシュした方がよいでしょう。

また、分割パッケージで問題が発生する可能性があると思います。

于 2010-06-01T07:20:28.890 に答える
1

ReceivedBytesThreshold = 22設定してみてください。これにより、読み取るバイトが少なくとも 22 バイトある場合にイベントが発生します。少なくとも22になることに注意してください。それ以上になる可能性があります。

個人的にこれを行うとは思いませんが、パケット サイズが将来、たとえば 12 バイトに変更された場合はどうなるでしょうか。バッファには 12 バイトが格納されますが、イベントはまったく発生しません。

1 に設定したままにしておくと、少なくとも1 バイトが使用可能になったときにイベントが発生します。Henk が既に投稿したように、受信したすべてのバイトをリストまたはキューにプッシュします。

もちろん、DataReceivedEvent は、データのパケットを何と見なすかを認識していないことに注意してください。利用可能なバイトがある場合にのみ起動します。これらのバイトを意味のあるメッセージまたはパケットに組み立てるのは、開発者次第です。

于 2010-11-20T11:10:15.657 に答える