115200 のボーレートでシリアル経由でバイト単位で受信しています。ac プログラムで受信する 1 秒あたりのバイト数を計算するにはどうすればよいですか?
4 に答える
1 秒あたりに実際に受信したバイト数を測定する方法は 3 つしかありません。
最初の方法は、一定時間内に受信したバイト数を追跡することです。たとえば、バイトを受信するたびに を実行しcounter += number_of_bytes
、その後 5 秒ごとに を実行しますrate = counter/5; counter = 0;
。
2 番目の方法は、一定のバイト数を受信するために経過した時間を追跡することです。たとえば、1 バイトを受け取るたびにtemp = now(); rate = 1/(temp - previous); previous = temp;
.
3 つ目の方法は、上記の両方を組み合わせることです。たとえば、バイトを受信するたびにtemp = now(); rate = number_of_bytes/(temp - previous); previous = temp;
.
上記のすべてについて、平均ではなく、個々のサンプルになります。サンプルを平均に変換するには、次のようにする必要がありますaverage = sum_of_samples / number_of_samples
。これを行う最善の方法 (たとえば、見栄えの良い/滑らかなグラフが必要な場合) は、多くのサンプルを保存することです。最も古いサンプルを新しいサンプルに置き換えて、平均を再計算します。
例えば:
double sampleData[1024];
int nextSlot = 0;
double average;
addSample(double value) {
double sum = 0;
sampleData[nextSlot] = value;
nextSlot++;
if(nextSlot >= 1024) nextSlot = 0;
for(int i = 0; i < 1024; i++) sum += sampleData[1024];
average = sum/1024;
}
もちろん、最終的なこと (3 つの方法のいずれかを使用してサンプルを収集し、平均を見つけること) では、必要な解像度を得るために多少の調整が必要になります。
かなり連続した入力があると仮定すると、受信したバイト数を数えるだけで、ある程度の文字数を受信したら、その時間と文字数を出力します。かなり良いタイムスタンプが必要です - clock() は合理的なソースの1つかもしれませんが、それはあなたがどのシステムに「最良の」オプションがあるかによって異なります.とにかく非常に移植性が高くなければ、エラーはおそらく大きくなります。印刷するたびに、カウントをリセットします。
理論上の最大値に関するこのスレッドの奇妙なコメントを修正するには:
14400 ボー モデムが Web 以前の世界に登場した頃、ボー (wiki it) から ISDN 64kbit などの新しいデジタル技術に合わせてボーの測定値が変更されました。その時、ボーはビット/秒を意味するようになりました。
一般的な略記法である 8N1 の形式のシリアル データであるため、8 ビットで、パリティ ビットはなく、各バイトに 1 つのストップ ビットがあります。スタートビットはありません。
したがって、115200 ボー (ビット/秒) を超える 8N1 シリアルの理論上の最大値は、115200/(8+1) = 12800 バイト/秒です。
ダウンロード速度を見るのと似ていますが (同じではありません)、電卓を使わずにビット/秒からバイト/秒を計算する大まかな方法は、10 で割ることです。
ボーレートは、信号が 1 秒間に何回変化できるかの測定値です。そのサイクルの 1 つで、使用している変調に応じて、1 つまたは複数のビットを送信できます (変調を使用していない場合、ビット レートはボー レートと同じです)。
QPSK変調を使用しているとしましょう。したがって、1 ボーあたり 2 ビットを送受信できます。したがって、115200 ボー レート、シンボルあたり 2 ビットでデータを受信している場合、115200 * 2 = 230400bps でデータを受信しています。