題:
什麼是Serial.begin(9600)?
shajib0o
2014-05-18 01:48:06 UTC
view on stackexchange narkive permalink

我知道這是要初始化的東西:

  Serial.begin(9600);  

但是我想知道它的真正含義是什麼?

該文檔對此有很好的描述。 http://arduino.cc/en/Serial/begin
三 答案:
heypete
2014-05-18 02:11:36 UTC
view on stackexchange narkive permalink

Serial.begin(9600)實際上不打印任何內容。為此,您需要使用 Serial.print(“ Hello world!”)打印文本“ Hello world!”。到串行控制台。而是以9600位/秒的速度初始化串行連接。可理解的數據。如果這兩個系統認為速度之間存在不匹配,則數據將出現亂碼。

每秒9600位是Arduino的默認設置,對大多數用戶來說完全合適,但是您可以將其更改為其他速度: Serial.begin(57600)將Arduino設置為每秒傳輸57600位。您需要將計算機上正在使用的任何軟件(例如Arduino IDE的串行監視器)設置為相同的速度,以查看正在發送的數據。

Baud和BPS是兩種不同的東西……找不到我現在正在尋找的鏈接。
如果我輸入“ Serial.begin(0);”怎麼辦?或“ Serial.begin(4000);”。我的意思是我想知道數字之間的區別是什麼?
Serial.begin用於設置通信速度,以每秒位數為單位。一個字節等於8位,但是串行連接發送一個開始和停止位,以標識接收系統特定字節的開始和結束。因此,發送一個字符需要10位。使用`Serial.begin(0)`通知Arduino它應該以每秒0位的速度與串行通信。如您所料,這意味著Arduino將永遠不會發送任何數據.Serial.begin(4000)將導致Arduino以每秒4000位的速度發送數據。這是非標準的,但是可以。
簡而言之:更改數字會更改速度。減小數字(例如`Serial.begin(300)`)可使Arduino發送數據的速度變慢。增加到57600,可以更快地發送數據。發送系統和接收系統都需要在使用速度上達成共識:您的計算機的串行程序(例如Arduino Serial Monitor窗口)將讓您設置計算機接收數據的速度,但是您只能從通用速度:300、1200、2400、4800、9600、19200、38400、57600和11520位/秒。您不能輸入其他速度,例如4000。9600通常很好。
“ Baud和BPS是兩回事……現在找不到我正在尋找的鏈接。”-這是一種解釋:[附錄C:“ baud”與“ bps”](http://www.tldp .org / HOWTO / Modem-HOWTO-23.html)
Nick Gammon
2015-08-13 12:41:59 UTC
view on stackexchange narkive permalink

一張圖片價值1000字,所以他們說,(如果使用計算機,則為1024字),所以我要發布一些圖片...

我將Uno設置為發送“ Fab”以9600波特率傳輸並在邏輯分析儀上捕獲了結果。

Serial comms - 3 letters

紅色陰影部分是字節之間的“空閒”時間段。

從上面的圖形中可以看到,Tx(發送)數據線通常為高電平(1),直到它變為低電平以表示字符(字節)的開始。這是起始位。然後以波特率(每秒9600個樣本)出現8個數據位(由白點表示)。之後,線再次被拉高。這是停止位(紅色部分)。然後,我們看到下一個字符的起始位,依此類推。 “ stop”部分可以無限長,但是必須至少一個位長。


第一個字符(字母“ F”或0x46或0b01000110)的詳細信息可以為在這裡看到:

Serial comms - a single byte

  • A-無數據(Tx高)

  • B-“起始位”。該行被拉低以告知接收器一個字符(字節)開始發送。接收器在對線路進行採樣之前等待一個半時鐘時間。

  • C-第一個字符到達(字母“ F”或0x46或0b01000110)。沒有時鐘位,輸入數據僅以波特率(傳輸)進行採樣。與SPI通信相反,數據首先到達最低有效位(如果您不每字節發送8位)。因此,我們看到的是01100010(而不是01000110)。

  • D-停止位。這始終很高,以確保我們可以區分該字節的末尾和下一個字節的開始。由於起始位為零,終止位為一,因此始終存在從一個字節到下一個字節的清晰過渡。

  • E-起始位下一個字符。


您可以從邏輯分析儀捕獲中看到 T1-T2 為0.1041667毫秒,恰好是1/9600毫秒:

  1/9600 = 0.00010416666秒 

因此9600的速率可提供每秒位的數量,而倒數是位之間的時間間隔


其他注意事項

  • 串行通信不是自計時的(與SPI或I2C等不同),因此發送方和接收方都必須達成共識時鐘速率。

  • 在Arduino上,時鐘速率並不精確,因為硬件必須將系統時鐘分頻才能獲得串行時鐘,並且分頻並不總是精確。幾乎總是有錯誤,此數量在數據表中給出(16 MHz系統時鐘引用的數字,例如Uno上的數字):

    Serial baud rate error

  • 您可以更改數據位數,而不必發送8位,實際上您可以發送5到9位。

  • 可以選擇在數據位之後發送一個 parity 位。

    • 如果您指定“奇數”奇偶校驗,則奇偶校驗位的設置方式是1位的總數為奇數。
    • 如果指定“偶數”奇偶校驗,則將奇偶校驗位設置為使1位的總數為偶數。
    • 如果不指定奇偶校驗,則奇偶校驗

    這可以幫助接收方檢測數據是否正確到達。

  • 奇偶校驗位在發送前發送停止位。

  • 在9個數據位(如SeaTalk協議中使用)的情況下,奇偶校驗位被重新用作第9個數據位。因此,您不能同時擁有9個數據位和一個奇偶校驗位。

  • 您還可以具有兩個停止位。這基本上只是延長了字節之間的時間。在“昔日”中,這樣可以使緩慢的機電設備可以處理前一個字節(例如打印出來)。


可能的損壞

如果您開始偵聽流中間的串行數據,則很有可能將流中間的0位解釋為起始位,然後接收器將錯誤地解釋此後的所有內容

從中恢復的唯一真正方法是不時地留出足夠大的間隙(例如10位長),以至於這種情況不會發生。


邏輯反轉

此處顯示的位(邏輯級)未反轉。即,1位為高,0位為低。如果您有RS232設備,則可能會發送-12 V表示1位,而+12 V表示0位。這是反向的,因為從電壓角度來看,一個小於零。像 MAX232這樣的芯片都能為您完成這一切。它們還可以藉助一些用戶提供的電容器在內部生成設備,從而提供驅動此類設備所需的-12 V電壓。


速度法則

既然有一個起始位,8個數據位和一個停止位,我們總共有10位,根據經驗法則,您可以計算可以在一個字節中傳輸的 bytes 其次,將比特率除以10。

例如以9600 BPS的速率,您可以每秒發送960字節。


要重現的代碼:

  void setup(){ Serial.begin(9600); Serial.print(“ Fab”); } void loop(){}  
linhartr22
2015-09-18 01:13:10 UTC
view on stackexchange narkive permalink

; TLDR;它初始化串行通信端口並設置波特率。您正在與之通信的設備(或Arduino IDE串行監視器)必須設置為匹配的波特率。初始化端口後,即可開始發送或接收字符。 Arduino串行參考

不要減少或不尊重@Nick-Gammon's對這個主題的出色報導。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...