如何测量串行接收字节速度。例如每秒字节数。

时间:2013-02-03 10:48:21

标签: c

我通过串口以115200的波特率逐字节接收。如何计算在c程序中接收的每秒字节数?

4 个答案:

答案 0 :(得分:2)

每秒实际接收的字节数只有3种。

第一种方法是跟踪在固定时间内收到的字节数。例如,每次收到字节时,您可能会counter += number_of_bytes,然后每隔5秒就会rate = counter/5; counter = 0;

第二种方法是跟踪传递多少时间来接收固定数量的字节。例如,每次收到一个字节时,您可能会temp = now(); rate = 1/(temp - previous); previous = temp;

第三种方法是结合上述两种方法。例如,每次收到字节时,您都可以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种方法之一收集样本,然后找到平均值)需要一些摆弄来获得你想要的分辨率。

答案 1 :(得分:1)

假设您有一些相当连续的输入,只需计算您收到的字节数,并在收到一定数量的字符后,打印出该时间内的字符时间和字符数。你需要一个相当不错的时间戳 - clock()可能是一个合理的来源,但它取决于你在什么系统上最好的&#34;最好的&#34;选项 - 以及您想要它的可移植性,但串行通信往往不是非常便携,或者您的错误可能很大。每次打印时,重置计数。

答案 2 :(得分:1)

纠正这个线程中关于理论最大值的一些奇怪的评论:

在14400波特调制解调器进入网络前世界的时候,波特的测量值从波特(维基)变为匹配新兴的数字技术,如ISDN 64kbit。那时,波特成了比特/秒。

作为通用速记符号8N1格式的串行数据,每个字节有8位,无奇偶校验位和1个停止位。没有开始位。

8N1串行的理论最大值超过115200波特(位/秒)= 115200 /(8 + 1)= 12800字节/秒。

观看你的下载速度类似(但不一样),粗略的球场方法是从比特/秒计算出字节数/秒,没有计算器,除以10。

答案 3 :(得分:0)

波特率是指每秒信号能够改变多少次的测量值。在其中一个周期中,根据您使用的调制,您可以发送一个或多个位(如果您不使用调制 - 比特率与波特率相同)。

假设您正在使用QPSK调制,因此您可以每波特发送/接收2位。因此,如果您以115200波特率接收数据,每个符号2位,则表示您正在接收115200 * 2 = 230400bps的数据。