Arduino與外部設(shè)備通信的方式均屬于串行通訊扫倡。
串行通訊的概念是相對(duì)于并行通信而言的。
(當(dāng)然目前來(lái)說(shuō)只是概念上的認(rèn)知藤巢。)
arduino硬件集成了串口搞莺、IIC、SPI三種常見(jiàn)的的通信方式掂咒,掌握了這三種通訊類庫(kù)的方法才沧,即可與具有響應(yīng)通信接口的各種設(shè)備通信迈喉,也可以為基于這些通信方式的傳感器或者模塊編寫(xiě)驅(qū)動(dòng)程序。
硬件串口通信
HardwareSerial類庫(kù)的使用
hard硬
ware器物或者什么
Serial這里是串口或者串行的意思
我們理解arduino和USB接口的簡(jiǎn)單通信構(gòu)成了計(jì)算機(jī)和arduino之間的串口通信温圆,除此之外arduino還可以與其他串口設(shè)備進(jìn)行通信挨摸。
TX發(fā)送端
RX接收端
通過(guò)簡(jiǎn)單的圖可以理解兩個(gè)設(shè)備之間共用電源接地。
實(shí)際的arduino板子上的這兩個(gè)端口為數(shù)字端口0和1
1為發(fā)送端
0為接收端
板子上有很明顯的標(biāo)志岁歉。
串口工作原理
arduino和其他設(shè)備通信的過(guò)程中得运,數(shù)據(jù)傳輸實(shí)際上都是以數(shù)字信號(hào)(電平的高低變化)的形式進(jìn)行的,當(dāng)使用Serial.print()函數(shù)輸出數(shù)據(jù)時(shí)锅移,arduino的發(fā)送端會(huì)輸出一連串的數(shù)字信號(hào)熔掺,這些數(shù)字信號(hào)稱為數(shù)據(jù)幀。
image.png
通過(guò)電平的變化來(lái)輸出數(shù)據(jù)非剃。
HardwareSerial類庫(kù)成員函數(shù)
-
available
image.png
獲取串口接收到的數(shù)據(jù)個(gè)數(shù)置逻。注意是個(gè)數(shù)而非具體的值。
Serial.available() -
begin()
初始化串口努潘,可以配置串口的參數(shù)诽偷。
Serial.begin(speed)
Serial.begin(speed,config)
image.png - end()
結(jié)束串口通信。
Serial.end() - find()
從串口緩沖區(qū)讀取數(shù)據(jù)疯坤,直到讀到指定的字符串报慕。(很像excel中的find函數(shù))
Serial.find(target)
返回值為布爾型,true表示找到压怠,false沒(méi)找到眠冈。 -
findUntil()
從串口緩沖區(qū)讀取數(shù)值,知道讀到指定的字符串或指定的停止符菌瘫。
Serial.findUntil(taget,terminal)
image.png - flush()
等待正在發(fā)送的數(shù)據(jù)發(fā)送完成蜗顽。
(flush英文的意思應(yīng)該使沖洗的意思,用在這里確實(shí)有點(diǎn)理解困難)
Serial.flush() - parseFloat()
從串口緩沖區(qū)返回第一個(gè)有效的float型數(shù)據(jù)雨让。
Serial.parseFloat()
8.parseInt()
返回第一個(gè)整數(shù)數(shù)據(jù)雇盖、 - peek()
返回1字節(jié)的數(shù)據(jù),但不會(huì)從接收緩沖區(qū)刪除該數(shù)據(jù)栖忠。
(peek的英文為偷窺的意思崔挖,很形象,偷看你但不影響你庵寞。) - print()
將數(shù)據(jù)輸出到串口狸相。
Serial.print(val)
Serial.pirnt(val,format) - println()
- read()
從串口讀取數(shù)據(jù)。會(huì)從接收緩沖區(qū)移除數(shù)據(jù)捐川。
Serial.read() -
readBytes()
buffer,用于存儲(chǔ)數(shù)據(jù)的數(shù)組古沥,字符或者字節(jié)瘸右。
從接收緩沖區(qū)讀取指定長(zhǎng)度的字符脓鹃,并將其存在一個(gè)數(shù)組中。
Serial.readBytes(buffer,length)
image.png
length,讀取的字符長(zhǎng)度娇跟。
(buff想到一個(gè)游戲中常見(jiàn)的用語(yǔ),加一個(gè)buff太颤,增加一個(gè)增益狀態(tài)逞频。) - readBytesUntil()
- setTimeout()
設(shè)定超時(shí)時(shí)長(zhǎng)。用于設(shè)定Serial.readBytesUntil()和Serial.readBytes()的等待串口數(shù)據(jù)時(shí)間栋齿。
16.write()
輸出數(shù)據(jù)到串口苗胀,以字節(jié)形式輸出。
Serial.write(val)
Serial.write(str)
Serial.write(buf,len)
返回輸入的字節(jié)數(shù)瓦堵。
print()和write()輸出方式的差異
首先簡(jiǎn)單回顧一下數(shù)組在arduino的用法基协。
數(shù)據(jù)類型 數(shù)組名稱【數(shù)組元素的個(gè)數(shù)】
例如 int a[5];定義了一個(gè)有5個(gè)整數(shù)型元素?cái)?shù)組。
int a[5]={1,2,3,4,5}
和
int a[5];
a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;
是等效的菇用。
取值方法:
a[0]
/*
print()和write()的使用方法和差異
*/
float FLOAT=1.23456;
int INT=123;
byte BYTE[6]={48,49,50,51,52,53};
void setup() {
Serial.begin(9600);
Serial.println("Serial print:");
Serial.println(INT);//會(huì)輸入123
Serial.println(INT,BIN);//二進(jìn)制
Serial.println(INT,DEC);//十進(jìn)制
Serial.println(INT,OCT);//八進(jìn)制
Serial.println(INT,HEX);//16進(jìn)制
Serial.println(FLOAT);//默認(rèn)兩位小數(shù)
Serial.println(FLOAT,0);
Serial.println(FLOAT,2);
Serial.println(FLOAT,4);
Serial.println();
Serial.println("Serial Write:");
Serial.write(INT);
Serial.println();
Serial.write("Serial");
Serial.println();
Serial.write(BYTE,6);//數(shù)組澜驮,長(zhǎng)度為6
}
void loop() {
// put your main code here, to run repeatedly:
}
當(dāng)使用print()發(fā)送數(shù)據(jù)時(shí),發(fā)送的不是數(shù)據(jù)本身惋鸥,而是將數(shù)據(jù)轉(zhuǎn)換成字符杂穷,再轉(zhuǎn)換成對(duì)應(yīng)的ASCII碼發(fā)送出去,串口見(jiàn)失去接收到ASCII碼卦绣,則會(huì)顯示對(duì)應(yīng)的字符耐量。
而當(dāng)使用write()時(shí),發(fā)送的是數(shù)據(jù)本身滤港,但當(dāng)串口見(jiàn)失去接收到數(shù)據(jù)后廊蜒,會(huì)將數(shù)值當(dāng)成ASCII而顯示對(duì)應(yīng)的字符。
因此123對(duì)應(yīng)的字符為{溅漾。