在許多在線示例代碼中,人們在設置塊中添加了 Serial.begin(9600)
行。
當我查找什麼 Serial時。 begin()
在官方文檔中,它表示它控制每秒數據傳輸的位數。
顯而易見的問題是,為什麼不使用最高傳輸速率的28800?人們為什麼選擇9600?這裡有什麼限制?
在許多在線示例代碼中,人們在設置塊中添加了 Serial.begin(9600)
行。
當我查找什麼 Serial時。 begin()
在官方文檔中,它表示它控制每秒數據傳輸的位數。
顯而易見的問題是,為什麼不使用最高傳輸速率的28800?人們為什麼選擇9600?這裡有什麼限制?
人們為什麼定居?
人們定居是因為它足夠快。最常見的用途是在終端上打印一些東西以進行調試。 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 ,軟件序列非常不同。
除了所有有趣的答案外,值得一提的是,將串行速度設置為 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。
我認為使用傳輸速率不是最慢的傳輸速率(300),也不是最終可能導致某些設置(28800甚至115200)出現問題的傳輸速率是一種傳統。 PC串行端口(最常見的是FTDI232 USB適配器)可以應付更高的速率,但您的DIY硬件可能無法滿足要求。因此9600 bps已成為代碼示例的某種標準傳輸速率。
在時間的迷霧中,遠程鍵盤(使用電話調製解調器和電傳打字機,如果您還記得的話)的“黃金標準”為9600波特,最初只能通過專用電話線實現。時間在慢慢地流逝。技術飛速發展;並且內存的移動速度甚至比時間還要慢(看來)。我們可以至少在幾米的範圍內進行例行通信,通信速度比9600波特快幾個數量級。曾經被認為是黃金標準的不再是黃金,而是仍然被認為是黃金標準。
tl; dr:這是歷史,而不是技術。
我認為人們大多數時候都使用9600的主要原因是這是Arduino IDE中的默認波特率。另外,如果串行信號必須經過很長的一段距離,那麼更快的數據速率也可能會變得不可靠-儘管我不知道為什麼選擇了它作為最佳速度。
因為用戶需要100%的時間能夠在Arduino在端口上顛簸時停止串行監視器,
9600波特是“容易殺死失控的進程”和“令人討厭的緩慢”之間的折衷。