本文翻譯自 Arduino 串行通訊的官方文檔没炒。
本文的最新版本位于:https://github.com/iwhales/arduino_notes
轉(zhuǎn)載請注明出處:http://www.reibang.com/u/5e6f798c903a
1. 簡介
Arduino 板卡使用 Serial 與電腦或其它設(shè)備進(jìn)行通訊晋渺。所有 Arduino 板卡至少擁有一個串行端口(也稱URAT 或USART):Serial蘸朋。Serial 工作于數(shù)字引腳 0 (RX) 和 1 (TX) ,同時也通過 USB 與電腦通訊瀑晒。因此,如果需要使用 Serial 功能,便不能同時將引腳 0 和 1 用作數(shù)字輸入和輸出赚瘦。 我們可以通過 Arduino IDE 內(nèi)置的串口監(jiān)視器與 Arduino 板卡進(jìn)行通訊。在 IDE 的工具欄中點擊串口監(jiān)視器的圖標(biāo)奏寨,并將波特率設(shè)置為 begin()
的實參值起意,便可與 Arduino 進(jìn)行串口通訊。
位于 TX/RX 引腳上的串行通訊采用 TTL 電平(根據(jù)電路板的設(shè)計方式病瞳,可能采用 5V 或 3.3V)揽咕。請勿將 TX/RX 引腳直接連接到 RS232 串行端口;RS232 的工作電壓是 +/- 12V套菜,可能會對 Arduino 造成損壞亲善。
Arduino Mega 擁有三個額外的串行端口: Serial1 位于 19 (RX) 和 18 (TX) 引腳;Serial2 位于 17 (RX) 和 16 (TX) 引腳笼踩;Serial3 位于 15 (RX) 和 14 (TX) 引腳逗爹。如果想使用這些引腳與 PC 進(jìn)行通訊,則需要自行提供 USB-to-serial 適配器 —— 因為這些額外的串行端口并沒有被連接到 Mega 自帶的 USB-to-serial 適配器上嚎于。如果想要通過這些額外的串行端口與外部 TTL 串行設(shè)備進(jìn)行通訊掘而,那么需要將外部設(shè)備的 TX 和 RX 引腳分別連接至 Mega 的 RX 和 TX 引腳,同時將 Mega 的地線與外部設(shè)備的地線直接相連于购。
Arduino Due 擁有三個額外的 3.3V TTL 串行端口:Serial1 位于 19 (RX) 和 18 (TX) 引腳袍睡;Serial2 位于 17 (RX) 和 16 (TX) 引腳;Serial3 位于 15 (RX) 和 14 (TX) 引腳肋僧。引腳 0 和 1 同樣也被連接到了 ATmega16U2 USB-to-TTL 串口芯片的對應(yīng)引腳斑胜,用于連接 USB 調(diào)試端口。此外嫌吠,SAM3X 芯片還擁有一個原生 USB-serial 端口——SerialUSB' 止潘。
Arduino Leonardo 在引腳 0 (RX) 和 1 (TX) 上使用 Serial1 進(jìn)行通訊,Serial1 也是 5V TTL辫诅。Serial 用作 USB CDC 通訊凭戴。欲了解更多信息,請參閱 Leonardo 的相關(guān)頁面炕矮。
2. 函數(shù)
if (Serial)
-
描述
用于指示指定的串口是否已準(zhǔn)備就緒么夫。 在 Leonardo 上者冤,
if(Serial)
用于指示 USB CDC 串行連接是否開放俄周。對于所有其他情況彬伦,包括 Leonardo 的if (Serial1)
澎羞,將始終返回true
雷客。 -
語法
All boards:
if (Serial)
Arduino Leonardo specific:
if (Serial1)
Arduino Mega specific:
if (Serial1)
if (Serial2)
if (Serial3)
-
參數(shù)
Nothing
-
返回值
boolean
:如果指定串口可用拴曲,將返回true
侧蘸。僅在 Leonardo 的 USB CDC 串行連接準(zhǔn)備好之前進(jìn)行查詢時彬碱,會返回false
枕屉。 -
示例代碼
void setup() { //初始化串行端口乐纸,并等待端口開啟: Serial.begin(9600); while (!Serial) { ; // 等待串口連接尼桶。需要原生USB } } void loop() { //proceed normally }
Serial.available()
-
描述
獲取可以從串行端口讀取的可用字節(jié)(字符)數(shù)。該數(shù)據(jù)表示已經(jīng)到達(dá)并存儲在串行接受緩沖區(qū)中的字節(jié)數(shù)——接受緩沖區(qū)可存儲 64 字節(jié)的數(shù)據(jù)锯仪。
available()
繼承自 Stream utility class泵督。 -
語法
Serial.available()
Arduino Mega only:
Serial1.available()
Serial2.available()
Serial3.available()
-
參數(shù)
Nothing
-
返回值
返回可供讀取的字節(jié)數(shù)
-
示例代碼
以下代碼將返回通過串口接受的字符
int incomingByte = 0; // for incoming serial data void setup() { Serial.begin(9600); // opens serial port, sets data rate to 9600 bps } void loop() { // reply only when you receive data: if (Serial.available() > 0) { // read the incoming byte: incomingByte = Serial.read(); // say what you got: Serial.print("I received: "); Serial.println(incomingByte, DEC); } }
Arduino Mega 的示例:該代碼可以將從 Arduino Mega 的某個串口接受到的數(shù)據(jù)發(fā)送到另一個串口。利用這段代碼可將串行設(shè)備通過 Arduino 連接到電腦庶喜。
void setup() { Serial.begin(9600); Serial1.begin(9600); } void loop() { // read from port 0, send to port 1: if (Serial.available()) { int inByte = Serial.read(); Serial1.print(inByte, DEC); } // read from port 1, send to port 0: if (Serial1.available()) { int inByte = Serial1.read(); Serial.print(inByte, DEC); } }
Serial.availableForWrite()
-
描述
獲取可用于寫入串行緩沖區(qū)的字節(jié)(字符)數(shù)小腊,并且不會阻塞寫入操作。
-
語法
Serial.availableForWrite()
Arduino Mega only:
Serial1.availableForWrite()
Serial2.availableForWrite()
Serial3.availableForWrite()
-
參數(shù)
Nothing
-
返回值
可用于寫操作的字節(jié)數(shù)
Serial.begin()
-
描述
設(shè)置串行數(shù)據(jù)傳輸?shù)乃俾示每撸瑔挝皇?bits/秒 (baud 波特)秩冈。與計算機(jī)進(jìn)行通訊時,可使用以下速率中的一個:300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200斥扛。當(dāng)然入问,你可以指定其它速率 —— 例如,通過引腳 0 和 1 連接一個需求特定波特率的元件時稀颁。
可選的第二參數(shù)用于配置數(shù)據(jù)位數(shù)芬失、奇偶校驗和停止位。默認(rèn)是 8 數(shù)據(jù)位匾灶、無奇偶校驗棱烂、1 位停止位。
-
語法
Serial.begin(speed)
Serial.begin(speed, config)
Arduino Mega only:
Serial1.begin(speed)
Serial2.begin(speed)
Serial3.begin(speed)
Serial1.begin(speed, config)``Serial2.begin(speed, config)
Serial3.begin(speed, config)
-
參數(shù)
speed
: bits/秒 (baud) -long
config
: 設(shè)置數(shù)據(jù)位數(shù)阶女、奇偶校驗和停止位颊糜。 有效值如下SERIAL_5N1
SERIAL_6N1
SERIAL_7N1
SERIAL_8N1
(the default)SERIAL_5N2
SERIAL_6N2
SERIAL_7N2
SERIAL_8N2``SERIAL_5E1
SERIAL_6E1
SERIAL_7E1
SERIAL_8E1
SERIAL_5E2
SERIAL_6E2
SERIAL_7E2
SERIAL_8E2
SERIAL_5O1``SERIAL_6O1
SERIAL_7O1
SERIAL_8O1
SERIAL_5O2
SERIAL_6O2
SERIAL_7O2
SERIAL_8O2
-
返回值
Nothing
-
示例代碼
void setup() { Serial.begin(9600); // opens serial port, sets data rate to 9600 bps } void loop() {}
Arduino Mega example:
// Arduino Mega using all four of its Serial ports // (Serial, Serial1, Serial2, Serial3), // with different baud rates: void setup(){ Serial.begin(9600); Serial1.begin(38400); Serial2.begin(19200); Serial3.begin(4800); Serial.println("Hello Computer"); Serial1.println("Hello Serial 1"); Serial2.println("Hello Serial 2"); Serial3.println("Hello Serial 3"); } void loop() {}
Serial.end()
-
描述
禁用串行通訊,并允許 RX 和 TX 引腳被用作通用輸入和輸出秃踩。再次調(diào)用
Serial.begin()
可重新啟用串行通訊衬鱼,啟用后 RX 和 TX 便不能再被用作通用輸入和輸出。 -
語法
Serial.end()
Arduino Mega only:
Serial1.end()
Serial2.end()
Serial3.end()
-
參數(shù)
Nothing
-
返回值
Nothing
Serial.find()
-
描述
需要注意憔杨,流解析只過一遍鸟赫,沒有辦法折返回去試圖發(fā)現(xiàn)或得到更多東西。
Serial.find( )
從串口緩沖區(qū)中讀取數(shù)據(jù)直到給定長度的目標(biāo)字符串被發(fā)現(xiàn)為止。如果發(fā)現(xiàn)目標(biāo)字符串將返回true
惯疙;如果超時則返回false
。 假如目標(biāo)字符串被發(fā)現(xiàn)妖啥,該函數(shù)返回 true霉颠,如果超時則為 false。Serial.flush()
繼承自 Stream utility class荆虱。 -
語法
Serial.find(target)
-
參數(shù)
target
: 要搜索的字符串(char) -
返回值
boolean
Serial.findUntil()
-
描述
Serial.findUntil()
從串口緩沖區(qū)中讀取數(shù)據(jù)直到給定長度的目標(biāo)字符串蒿偎,或終止字符串被發(fā)現(xiàn)為止。 如果發(fā)現(xiàn)目標(biāo)字符串將返回true
怀读;如果超時則返回false
诉位。Serial.findUntil()
繼承自 Stream utility class. -
語法
Serial.findUntil(target, terminal)
-
參數(shù)
target
: 要搜索的字符串(char)terminal
: 終止搜索的字符串(char) -
返回值
boolean
Serial.flush()
-
描述
等待傳出的串行數(shù)據(jù)完成傳輸(在 Arduino 1.0 之前,這反而會移除任何已緩存的傳入數(shù)據(jù) )菜枷。如果需要丟棄接受緩沖區(qū)中的所有數(shù)據(jù)苍糠,可使用
while(Serial.read( ) >= 0);
flush()
繼承自 Stream utility class. -
語法
Serial.flush()
Arduino Mega only:
Serial1.flush()
Serial2.flush()
Serial3.flush()
-
參數(shù)
Nothing
-
返回值
Nothing
Serial.parseFloat()
-
描述
Serial.parseFloat()
返回串行緩沖區(qū)中第一個有效的浮點數(shù)。解析時啤誊,非數(shù)值(或減號)字符會被跳過岳瞭。parseFloat()
會在第一個非浮點數(shù)值處終止。Serial.parseFloat()
繼承自 Stream utility class. -
語法
Serial.parseFloat()
-
參數(shù)
Nothing
-
返回值
float
Serial.parseInt()
-
描述
在輸入串行數(shù)據(jù)中查找下一個有效的整型蚊锹。
stream.parseInt()
繼承自 Stream utility class瞳筏。特點:
- 非數(shù)值或負(fù)號的初始字符會被跳過;
- 如果在(可配置)超時值內(nèi)沒有讀取到字符牡昆,或是讀取到了一個非數(shù)值字符姚炕,解析將停止。
- 如果發(fā)生超時(
Serial.setTimeout()
)時丢烘,并沒有讀取到有效數(shù)值柱宦,將會返回 0;
-
語法
Serial.parseInt()
Serial.parseInt(char skipChar)
Arduino Mega only:
Serial1.parseInt()
Serial2.parseInt()
Serial3.parseInt()
-
參數(shù)
skipChar
:在搜索時播瞳,用于跳過指定字符捷沸。例如用來跳過千位分隔符,如 32,767 將被解析為 32767狐史。 -
返回值
long
:下一個有效整型
Serial.peek()
-
描述
返回輸入串行數(shù)據(jù)的下一個字節(jié)(字符)痒给,但不會從內(nèi)部串行緩沖區(qū)移除該字節(jié)。也就是說骏全,在下一次調(diào)用
read()
之前苍柏,如果連續(xù)調(diào)用peek()
的話,將返回相同的字符姜贡。peek()
繼承自 Stream utility class. -
語法
Serial.peek()
Arduino Mega only:
Serial1.peek()
Serial2.peek()
Serial3.peek()
-
參數(shù)
Nothing
-
返回值
輸入串行數(shù)據(jù)的第一個可用字節(jié)(如果沒有數(shù)據(jù)可用试吁,則返回 -1 )-
int
Serial.print()
-
描述
將數(shù)據(jù)以人類可讀的 ASCII 文本打印到串口。該命令有多重形式。對于數(shù)值熄捍,會使用 ASCII 字符打印其每個數(shù)位烛恤。對于浮點數(shù),同樣會使用 ASCII 打印其每個數(shù)位余耽,默認(rèn)包含兩位小數(shù)缚柏。Bytes 會以單個字符發(fā)送。字符和字符串按原樣發(fā)送碟贾。例如 -
Serial.print(78) gives "78"
Serial.print(1.23456) gives "1.23"
Serial.print('N') gives "N"
Serial.print("Hello world.") gives "Hello world."
可選的第二參數(shù)用于指定底數(shù)(格式)币喧,允許的值有:
BIN(binary, or base 2)
,OCT(octal, or base 8)
,DEC(decimal, or base 10)
,HEX(hexadecimal, or base 16)
。對于浮點數(shù)袱耽,第二個參數(shù)用于指定小數(shù)的位數(shù)杀餐。例如 -Serial.print(78, BIN) gives "1001110"
Serial.print(78, OCT) gives "116"
Serial.print(78, DEC) gives "78"
Serial.print(78, HEX) gives "4E"
Serial.println(1.23456, 0) gives "1"
Serial.println(1.23456, 2) gives "1.23"
Serial.println(1.23456, 4) gives "1.2346"
可以將基于 flash-memory 的字符串通過
F()
包裝(wrapping)后,傳遞到Serial.print()
中朱巨。例如Serial.print(F(“Hello World”))
發(fā)送單個 byte史翘,需使用 Serial.write()。
-
語法
Serial.print(val)
Serial.print(val, format)
-
參數(shù)
val
: 用于打印輸出的值 - 任何類型的數(shù)據(jù)冀续。 -
返回值
size_t
:print()
返回向外寫出的字節(jié)數(shù)恶座,但可選擇是否需獲取該返回值。 -
示例代碼
/* Uses a FOR loop for data and prints a number in various formats. */ int x = 0; // variable void setup() { Serial.begin(9600); // open the serial port at 9600 bps: } void loop() { // print labels Serial.print("NO FORMAT"); // prints a label Serial.print("\t"); // prints a tab Serial.print("DEC"); Serial.print("\t"); Serial.print("HEX"); Serial.print("\t"); Serial.print("OCT"); Serial.print("\t"); Serial.print("BIN"); Serial.println("\t"); // carriage return after the last label for(x=0; x< 64; x++){ // only part of the ASCII chart, change to suit // print it out in many formats: Serial.print(x); // print as an ASCII-encoded decimal - same as "DEC" Serial.print("\t\t"); // prints two tabs to accomodate the label lenght Serial.print(x, DEC); // print as an ASCII-encoded decimal Serial.print("\t"); // prints a tab Serial.print(x, HEX); // print as an ASCII-encoded hexadecimal Serial.print("\t"); // prints a tab Serial.print(x, OCT); // print as an ASCII-encoded octal Serial.print("\t"); // prints a tab Serial.println(x, BIN); // print as an ASCII-encoded binary // then adds the carriage return with "println" delay(200); // delay 200 milliseconds } Serial.println(""); // prints another carriage return }
-
注意和警告
從 1.0 版本開始沥阳,串行傳輸是異步的跨琳;
Serial.print()
將在任何字符被發(fā)送前返回。Serial.print()
和Serial.write()
不會阻塞程序桐罕。在 1.0 之前脉让,代碼會等到所有的字符發(fā)送之后才返回。在 1.0 及其以后功炮,Serial.write()
會在后臺中進(jìn)行(使用了終端處理程序)溅潜,這使得程序會理解恢復(fù),并執(zhí)行后續(xù)代碼薪伏。這種方式通彻隼剑可使程序更加快捷,但是入股需要等待所有字符發(fā)送完畢嫁怀∩杈瑁可以通過在Serial.write()
之后調(diào)用Serial.flush()
來實現(xiàn)。
Serial.println()
-
描述
將數(shù)據(jù)以人類可讀的 ASCII 文本打印到串口塘淑,并在文本結(jié)尾添加回車字符 (ASCII 13, or '\r') 和換行字符 (ASCII 10, 或 '\n')萝招。該命令采用與 Serial.print() 相同的格式。
-
語法
Serial.println(val)
Serial.println(val, format)
-
參數(shù)
val
: 用于打印輸出的值 - 任何類型的數(shù)據(jù)存捺。format
: 指定底數(shù)(對于整形數(shù)據(jù)類型)或小數(shù)位數(shù)(對于浮點類型) -
返回值
size_t
:println()
返回向外寫出的字節(jié)數(shù)槐沼,但可選擇是否需獲取該返回值 -
示例代碼
/* Analog input reads an analog input on analog in 0, prints the value out. created 24 March 2006 by Tom Igoe */ int analogValue = 0; // variable to hold the analog value void setup() { // open the serial port at 9600 bps: Serial.begin(9600); } void loop() { // read the analog input on pin 0: analogValue = analogRead(0); // print it out in many formats: Serial.println(analogValue); // print as an ASCII-encoded decimal Serial.println(analogValue, DEC); // print as an ASCII-encoded decimal Serial.println(analogValue, HEX); // print as an ASCII-encoded hexadecimal Serial.println(analogValue, OCT); // print as an ASCII-encoded octal Serial.println(analogValue, BIN); // print as an ASCII-encoded binary // delay 10 milliseconds before the next reading: delay(10);
Serial.read()
-
描述
讀取傳入的串口的數(shù)據(jù)。
read() 繼承自 Stream utility class.
-
語法
Serial.read()
Arduino Mega only:
Serial1.read()
Serial2.read()
Serial3.read()
-
參數(shù)
Nothing
-
返回值
串行輸入數(shù)據(jù)的第一個可用字節(jié)(如果數(shù)據(jù)不可用,則返回 -1)-
int
岗钩。 -
示例代碼
int incomingByte = 0; // for incoming serial data void setup() { Serial.begin(9600); // opens serial port, sets data rate to 9600 bps } void loop() { // send data only when you receive data: if (Serial.available() > 0) { // read the incoming byte: incomingByte = Serial.read(); // say what you got: Serial.print("I received: "); Serial.println(incomingByte, DEC); } }
Serial.readBytes()
-
描述
Serial.readBytes()
會從串行端口讀取多個字符纽窟,并將它們存放到一個緩沖器中。如果已讀取了指定數(shù)量的字符兼吓,或發(fā)生了超時 (Serial.setTimeout())臂港,函數(shù)都將終止執(zhí)行。Serial.readBytes()
會返回被存放到緩沖器中的字符數(shù)周蹭。0 意味著沒有找到有效數(shù)據(jù)。Serial.readBytes()
繼承自 Stream utility class疲恢。 -
語法
Serial.readBytes(buffer, length)
-
參數(shù)
buffer
: 用于存儲字節(jié)的緩沖器 (char[]
orbyte[]
)length
: 指定需要讀取的字節(jié)數(shù) (int
) -
返回值
放入緩沖區(qū)的字節(jié)數(shù) (
size_t
) 凶朗。
Serial.readBytesUntil()
-
描述
Serial.readBytesUntil()
用于從串口緩沖區(qū)讀取多個字符到一個數(shù)組中。如果檢測到終止字符显拳,或是已讀取了指定數(shù)量的字符棚愤,又或是發(fā)生了超時 (Serial.setTimeout()),函數(shù)都將終止執(zhí)行杂数。該函數(shù)讀取的字符不包含終止字符宛畦,僅到終止字符的前一個字符為止。終止字符會被保留在串口緩沖區(qū)中揍移。Serial.readBytesUntil()
會返回被存放到緩沖器中的字符數(shù)次和。0 意味著沒有找到有效數(shù)據(jù)。Serial.readBytesUntil()
繼承自 Stream utility class. -
語法
Serial.readBytesUntil(character, buffer, length)
-
參數(shù)
character
: 終止字符 (char
)buffer
: 用于存儲字節(jié)的緩沖器 (char[]
orbyte[]
)length
: 指定需要讀取的字節(jié)數(shù) (int
) -
返回值
size_t
Serial.setTimeout()
-
描述
Serial.setTimeout()
用于設(shè)置等待串行數(shù)據(jù)的最大毫秒數(shù)那伐,對于 serial.readBytesUntil() 或 serial.readBytes() 有效踏施。默認(rèn)值是 1000 毫秒。Serial.setTimeout()
繼承自 Stream utility class. -
語法
Serial.setTimeout(time)
-
參數(shù)
time
: 超時持續(xù)時間罕邀,單位是毫秒 (long
) 畅形。 返回值
Nothing
Serial.write()
-
描述
向串行端口寫入二進(jìn)制數(shù)據(jù)。數(shù)據(jù)會以單個字節(jié)诉探,或是以一系列字節(jié)被發(fā)送日熬。如果發(fā)送的 characters 表示的一個數(shù)值的不同數(shù)位則應(yīng)用
print()
函數(shù)代替。直接將變量的值以數(shù)值形式發(fā)送肾胯,發(fā)送時不會轉(zhuǎn)換為ASCII竖席,如整型值 65,會以65發(fā)送敬肚,若接收方以 ASCII 顯示怕敬,則會顯示A;若以 hex 顯示帘皿,則顯示41东跪。
-
語法
Serial.write(val)
Serial.write(str)
Serial.write(buf, len)
Arduino Mega also supports:
Serial1
,Serial2
,Serial3
(in place ofSerial
) -
參數(shù)
val
: 以單個字節(jié)的形式發(fā)送值str
: 以一系列字節(jié)的形式發(fā)送字符串buf
: 以一系列字節(jié)的形式發(fā)送一個數(shù)組len
: 緩沖器的長度 -
返回值
size_t
:write()
將返回向外寫出的字節(jié)數(shù),但可選擇是否需獲取該返回值。 示例代碼
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.write(45); // send a byte with the value 45
int bytesSent = Serial.write(“hello”); //send the string “hello” and return the length of the string.
}
Description
Writes binary data to the serial port. This data is sent as a byte or series系列 of bytes; to send the characters representing表示的 the digits of a number use the print() function instead.
Serial.serialEvent()
串口數(shù)據(jù)可用
-
描述
當(dāng)數(shù)據(jù)可用時調(diào)用該函數(shù)虽填。使用
Serial.read()
便可俘獲可用數(shù)據(jù)丁恭。NB : 目前
serialEvent()
不兼容 Esplora, Leonardo, 以及 Micro 。 -
語法
void serialEvent(){ //statements }
Arduino Mega only:
void serialEvent1(){ //statements } void serialEvent2(){ //statements } void serialEvent3(){ //statements }
-
參數(shù)
statements
: 任何有效語句 -
返回值
Nothing