Serial.begin(9600)
實際上不打印任何內容。為此,您需要使用 Serial.print(“ Hello world!”)
打印文本“ Hello world!”。到串行控制台。而是以9600位/秒的速度初始化串行連接。可理解的數據。如果這兩個系統認為速度之間存在不匹配,則數據將出現亂碼。
每秒9600位是Arduino的默認設置,對大多數用戶來說完全合適,但是您可以將其更改為其他速度: Serial.begin(57600)
將Arduino設置為每秒傳輸57600位。您需要將計算機上正在使用的任何軟件(例如Arduino IDE的串行監視器)設置為相同的速度,以查看正在發送的數據。
一張圖片價值1000字,所以他們說,(如果使用計算機,則為1024字),所以我要發布一些圖片...
我將Uno設置為發送“ Fab”以9600波特率傳輸並在邏輯分析儀上捕獲了結果。
紅色陰影部分是字節之間的“空閒”時間段。
從上面的圖形中可以看到,Tx(發送)數據線通常為高電平(1),直到它變為低電平以表示字符(字節)的開始。這是起始位。然後以波特率(每秒9600個樣本)出現8個數據位(由白點表示)。之後,線再次被拉高。這是停止位(紅色部分)。然後,我們看到下一個字符的起始位,依此類推。 “ stop”部分可以無限長,但是必須至少一個位長。
第一個字符(字母“ F”或0x46或0b01000110)的詳細信息可以為在這裡看到:
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上的數字):
您可以更改數據位數,而不必發送8位,實際上您可以發送5到9位。
可以選擇在數據位之後發送一個 parity 位。
這可以幫助接收方檢測數據是否正確到達。
奇偶校驗位在發送前發送停止位。
在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(){}
; TLDR;它初始化串行通信端口並設置波特率。您正在與之通信的設備(或Arduino IDE串行監視器)必須設置為匹配的波特率。初始化端口後,即可開始發送或接收字符。 Arduino串行參考