Serial.begin():为什么不总是使用28800?


34

在许多在线示例代码中,人们Serial.begin(9600)在setup块中添加了该行。

当我查看Serial.begin()官方文档中的内容时,它表示它控制每秒数据传输的位数。

因此,显而易见的问题是,为什么不使用最高传输速率的28800?人们为什么选择9600?这里有什么限制?


3
仅供参考,插入USB支持的arduino最高实际上是115200,而57600通常是第二常见的波特率。
BrettAM 2014年

Answers:


48

人们为什么安顿下来?

人们安定下来是因为它足够快。最常见的用途是在终端上打印一些东西以进行调试。9600波特是每秒960个字符,或每秒12 x 80个字符行。你读多快?:)

如果您的程序使用串行端口进行批量数据传输,则可以选择不解决。

有什么限制...

串行限制很高。您可以直接在程序中使用115200波特,它将可以正常工作。Arduino终端最多允许115200,但其他程序(如RealTerm)将使您运行得更高。

硬件串行将运行至1 M波特。如果您四处阅读,您会发现人们通过直接控制UART消耗了多达1 M的内存。对于通过蓝牙芯片进行传输等用途,您可能会受益于高波特率。如果您使用硬件串行接口在短距离内从一个芯片到另一个芯片进行交换,那么1 M波特是完全可行的。想一想所有以1 MHz时钟频率正常工作的SPI和I2C器件。

在更大的距离上,使用逻辑电平(0至5V平原)信号时,您将开始遇到噪声问题。要使用更大的距离,您将添加一个收发器以提供可靠的信令,通常是RS-232,次要是RS-485。使用RS-232,您可以在10英尺的距离内运行百万比特。

微处理器时钟速度将是实际的极限。对于硬件UART,处理器必须每10位(对于N81)将一个字节加载到UART。因此,当波特率达到1 M时,对于16 MHz处理器而言,要为UART提供数据将是一个挑战。每160个时钟滴答将发送一个新字节,这是很少的代码行。对于短时间的数据突发,您可以达到该速率。消息是,在UART成为限制之前,处理器将耗尽速度。

注意,这一切都适用于HardwareSerial,软件序列有很大的不同。


请注意,2M可以与硬件序列一起归档,但是arduino的实现似乎太慢并且会发送大量垃圾。请参阅atmega328p ds,以找到使速度提高一倍的魔力位。另外还要补充一点,9800波特是一个非常古老的标准,即使可以配置更多的传感器(例如xbee,gps等),许多传感器也将其用作标准值。同样在USB上使用自动波特率协商的女巫可能会覆盖选定的波特率,但我认为不是arduino使用(但它可能在莱昂纳多上)
Lesto

1
9600 8N1也是默认设置。许多带有串行接口的设备都附带此设置,如果需要其他速度(或数据位,奇偶校验位,停止位),则需要对其进行配置。
彼得·莫滕森

“这已经足够快了”-很好的答案,但是我对此有些不同意。大多数调试输出实现都是阻塞的,因此非常希望使调试输出尽可能快,以防止代码执行时间过多变化。
Rev1.0

如果要进行批量数据传输,理想情况下,您将使用SPI,对吗?
tuskiomi

6

除了所有有趣的答案外,值得一提的是,将串行速度设置为XXX位/秒并不一定意味着硬件上的XXX位/秒。

时钟-甚至基于石英的时钟-都不完美且容易漂移。另外,由于串行时钟通常是通过二乘幂的预除数和(整数)计数器生成的,因此在基本时钟频率下无法准确获得所有值。借助起始/停止位,异步串行通信可以容忍某些时钟漂移。但这有局限性。

例如,如果ATmega328PA以1MHz运行,则可以在0.2%的误差下达到9600b / s。但是在14400b / s时,误差为-3.5%(实际通信速度为13900b / s)。而在28800b / s时,误差为+ 8.5%(实际通信速度为31200b / s)。所有这些数据均来自ATmega48PA-88PA-168PA-328PA数据表p200

当两个相同的设备一起通信时(因为实际上以相同的速度通信),这不是问题。它可能会在不同设备之间通信时是一个问题。

增加基本频率并不一定会显着提高精度。例如,在2MHz上运行与上述相同的ATmega328PA并不会真正带来更好的结果,这主要是由于舍入误差。但是在1.8432MHz上运行,则可以在2400b / s至57.6kHz的范围内提供非常精确的bps。


3

我认为使用传输速率不是最慢的传输速率(300),也不是最终可能导致某些设置(28800甚至115200)出现问题的传输速率是一种传统。PC串行端口(最常见的是FTDI232 USB适配器)可以应付更高的速率,但您的DIY硬件可能无法满足要求。因此9600 bps已将其自身确立为某种代码示例的标准传输速率。


2

时光倒流,远程键盘(使用电话调制解调器和电传打字机,如果您还记得的话)的“黄金标准”为9600波特,最初只能通过专用电话线实现。时间在慢慢地流逝。技术飞速发展;而且内存的移动速度甚至比时间还要慢(看来)。我们可以至少在几米的范围内进行例行通信,通信速度比9600波特快几个数量级。曾经被视为黄金标准的不再是黄金,而是仍被视为标准。

tl; dr:这是历史,而不是技术。


0

我认为人们大多数时候使用9600的主要原因是这是Arduino IDE中的默认波特率。此外,如果串行信号必须经过很长的距离,则更快的数据速率也可能会变得不可靠-尽管我不知道为什么将其选为最佳速度。


-2

人类反应时间

因为用户需要100%的时间来在Arduino抖动端口时停止串行监视器,而要求最大传输速度的时间却不到 100%。

9600波特是“容易杀死失控的进程”和“令人讨厌的缓慢”之间的折衷。


100%嘿...有趣;)
愤怒84年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.