0

私が書いたC#アプリケーションとBluetooth(bluesmirf goldデバイス)を介して通信するArduinoメガがあります。Arduino は常に 32 文字のシリアル信号を送信しています。最初は常に「S」で最後は「E」です。パテを使用して、この信号が 99% の確率で正しく送信されていることを確認できます。

ここで、次のコードを使用して、C# アプリケーションでこの信号を読み取りたいと考えています。

    public string receiveCommandHC()
    {
        
        string messageHC = "";
        if (serialHC.IsOpen)
        {

            while (serialHC.ReadChar() != 'S')
            {

            }
            messageHC = serialHC.ReadTo("E");
            serialHC.DiscardInBuffer();
        }
        return messageHC;
         
    }

serialHC はシリアル クラスです。

これは完全に機能する場合もありますが、問題が発生する場合もあります。

私が抱えていると思われる問題は、arduinoから読み取っているデータにかなり大きなラグが発生することがあることです。ボタンの状態を送信していて、Arduinoのボタンを実際に押したり離したりしてから数秒しか変化しないため、これに気づきました。Bluetooth デバイスの標準のボー レートである 115200 を使用しましたが、これをもっと低いレートに変更すると、より良い結果が得られるのではないかと考えていました。それが何かメリットがあるとしたら?高い通信速度は必要ありません。1 秒間に 4 ~ 5 回状態を更新するだけでも、私のアプリケーションでは受け入れられます。

私のコードからラグが発生している可能性はありますか? 入ってくる「S」を待っているwhileループからのものかもしれないと思いますが、新しい信号が常に高速で入ってくるので、なぜそこにハングアップする必要があるのか​​ わかりません。

DiscardInBuffer() を使用しているのは、古いデータを気にせず、それをスキップしたいだけだからです。現在の最新のデータを読み取り、その新しいデータに基づいて行動することがはるかに重要です。

ご協力ありがとうございました!

よろしくお願いします、

ベンダー

アップデート:

デバッグ中にもう少し情報が見つかりました。問題は次のように見えるだけです。

  1. Bluetooth経由で接続されている場合(USBケーブル経由ではラグはまったくありません)
  2. PC から別のデバイスへの 2 つ目の Bluetooth 接続が確立された場合 (別の COM ポートと別のボーレート)

PC で同じ Bluetooth ドングルから 2 つの異なるデバイスを実行した経験のある人はいますか? 問題なく両方に接続できますが、前述のラグの問題はまだあります。

助けてくれてありがとう

4

1 に答える 1

4

ここでは、実際には物理シリアルポートを使用していません。BlueToothドライバーは1つをエミュレートするだけです。これは一般的なことです。WindowsAPIには、シリアルポートと通信するための明確に定義されたAPI関数のセットがあります。1つをエミュレートすると、ドライバーへのインターフェイスがシンプルになり、ベンダーはインターフェイスDLLを提供したり、複雑なDeviceIoControl()プロトコルを文書化したりする必要がありません。

つまり、実際の通信設定は重要ではありません。このシナリオではボーレートは無意味です。転送速度を設定するのはBlueTooth無線信号です。ドライバーは選択したものをすべて受け入れますが、それ以外の場合は無視します。ハンドシェイク信号は解釈される可能性があり、それらを実装するのはドライバー次第です。通信エラーの報告が実装されることはめったにありません。実際のシリアルポートとは異なり、BlueToothにはエラー訂正プロトコルがあります。

いいえ、ここでのデータの損失は完全に自己誘導です。明らかに、ドライバーDiscardInBuffer()を実装しています。これは、ドライバーが受信したデータを破棄するだけです。コードの実行が少し遅れたり、スレッドコンテキストスイッチによって中断されたりすると、これはうまくいきません。

DiscardInBuffer()呼び出しを削除します。

于 2012-02-02T13:41:42.977 に答える