我正在通过串行以 115200 的波特率逐字节接收。如何计算 ac 程序中接收的每秒字节数?
4 回答
只有 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 种方法中的一种收集样本,然后找到平均值)需要一些摆弄才能获得您想要的分辨率。
假设您有一些相当连续的输入,只需计算您收到的字节数,并在收到一些字符后,打印出该时间的时间和字符数。您将需要一个相当好的时间戳 - clock() 可能是一个合理的来源,但这取决于您使用的系统是什么“最佳”选项 - 以及您想要它的便携性,但串行通信往往不会无论如何都要非常便携,否则你的错误可能会很大。每次打印时,重置计数。
要更正此线程中有关理论最大值的一些奇怪评论:
大约在 14400 波特调制解调器进入前网络世界的时候,波特的度量从波特(wiki it)变为匹配新兴的数字技术,如 ISDN 64kbit。那时,波特变成了比特/秒的意思。
作为 8N1 格式的串行数据,一种常见的速记符号,有 8 位,没有奇偶校验位,每个字节有一个停止位。没有起始位。
因此,8N1 串行的理论最大值超过 115200 波特(位/秒)= 115200/(8+1)= 12800 字节/秒。
与查看下载速度类似(但不一样),在不使用计算器的情况下,从比特/秒计算出字节/秒的粗略方法是除以 10。
波特率是衡量信号每秒能够改变多少次的量度。在其中一个周期中,根据您使用的调制,您可以发送一个或多个比特(如果您不使用调制 - 比特率与波特率相同)。
假设您正在使用QPSK调制,因此您可以每波特发送/接收 2 位。因此,如果您以 115200 波特率、每个符号 2 位接收数据,则您正在以 115200 * 2 = 230400bps 接收数据。