3

Arduino ボードから送信された一連の数値を COM ポートから読み取る小さな C# アプリを作成しました。

質問:

Arduino が 500 ミリ秒ごとに 1 つの値を送信するのに、私の C# プログラムが 1 秒ごとに 1 つの値を読み取る場合、C# は Arduino に取り残されませんか? それが本当なら、Arduinoから送信されたデータはバッファに格納されますか、それとも単に破棄されますか?

[編集]

以下は、COMから読み取るために使用するコードです


System.Windows.Forms.Timer tCOM;
...

tCOM.Interval = 1000;
tCOM.Tick += new System.EventHandler(this.timer1_Tick);
...

SerialPort port = new SerialPort();
port.PortName = defaultPortName;
port.BaudRate = 9600; 
port.Open();
.....

private void timer1_Tick(object sender, EventArgs e)
{
    log("Time to read from COM");

    //read a string from serial port
    string l;
    if ((l = port.ReadLine()) != null)
    {
    ......

    }

}
4

2 に答える 2

1

入力用のシリアル ポートを開くと、プログラムによって読み取られるまで受信データを保持するためのバッファー (キュー) が自動的に作成されます。このバッファーのサイズは通常 4096 バイトです (ただし、Windows のバージョン、シリアル ポート ドライバーなどによって異なる場合があります)。

ほとんどすべての状況で、通常は 4096 バイトのバッファで十分です。最高の標準ボー レート (115200 ボー) では、300 ミリ秒以上のストレージ (FIFO) 先入れ先出しに対応するため、プログラムが少なくとも 1 秒間に 3 回シリアル ポートを処理している限り、データが失われることはありません。特定のケースでは、シリアルを 1 秒ごとに読み取るため、タイミングとバッファリングされたデータが一致しない場合、データが失われる可能性があります。

ただし、例外的な状況では、シリアル入力バッファのサイズを増やすことができると便利な場合があります。Windows はバッファ サイズの増加を要求する手段を提供しますが、要求が許可されるという保証はありません。

個人的には、Arduino から継続的にデータを取得し、C# アプリでそれらのデータをどう処理するかを決定することを好みますが、少なくとも、関連するハードウェアの制限により情報が失われることはないと確信しています。

更新: Arduino で頻繁に遊んでいますが、Hans の回答で与えられた 3 番目のオプションにも同意します。基本的に、アプリは Arduino にコマンドを送信して、必要なデータを印刷 (Serial.Print または Serial.Println) し、読み取る準備を整える必要があります。

于 2013-06-29T13:54:12.927 に答える