前面的示例中使用到了Serial.begin(),、Serial.print() 等語(yǔ)句,,這些語(yǔ)句便是在操作串口。Arduino與計(jì)算機(jī)通信最常用的方式就是串口通信,這在之前的學(xué)習(xí)中已經(jīng)接觸多次。 我們使用USB線連接Arduino Uno與計(jì)算機(jī)時(shí),,Arduino Uno會(huì)在計(jì)算機(jī)上虛擬出一個(gè)串口設(shè)備,此時(shí)兩者之間便建立了串口連接,。通過(guò)此連接,,Arduino Uno便可與計(jì)算機(jī)互傳數(shù)據(jù),。 使用串口與計(jì)算機(jī)通信,,需要先使用Serial.begin() 初始化Arduino的串口通信功能。 Serial.begin(speed); 參數(shù)speed是指串口通信波特率,,這是設(shè)定串口通信速率的參數(shù),。串口通信的雙方必須使用同樣的波特率,方能正常進(jìn)行通信,。 波特率是一個(gè)衡量通信速度的參數(shù),。它表示每秒鐘傳送的bit的個(gè)數(shù)。例如9600波特表示每秒發(fā)送9600bit的數(shù)據(jù),。通信雙方需要使用一致的的波特率才能正常通信,。Arduino串口通信通常會(huì)使用以下波特率: 300、600,、1200,、2400、4800,、9600,、14400、19200,、28800,、38400、57600,、115200,。 波特率越大,說(shuō)明串口通信的速率越快。 串口輸出串口初始化完成后,,我們便可以使用Serial.print() 或Serial.println() 向計(jì)算機(jī)發(fā)送信息了,。
參數(shù)val是你要輸出的數(shù)據(jù),各種類(lèi)型的數(shù)據(jù)均可,。 Serial.println(val); Serial.println(val) 語(yǔ)句也是使用串口輸出數(shù)據(jù),,不同的是println() 函數(shù)會(huì)在輸出完指定數(shù)據(jù)后,再輸出一組回車(chē)換行符,。 下面的示例程序中,,演示了使用串口輸出數(shù)據(jù)到計(jì)算機(jī):
上傳該程序到Arduino Uno,,然后可以通過(guò)Arduino IDE右上角的 圖標(biāo)打開(kāi)串口監(jiān)視器,。你會(huì)看到如圖2-48的信息。 圖 2?48 串口輸出信息 串口監(jiān)視器是Arduino IDE自帶的一個(gè)小工具,,可以查看到串口傳來(lái)的信息,,也可以向連接的設(shè)備發(fā)送信息。需要注意的是,,在串口監(jiān)視器右下角,,有一個(gè)波特率設(shè)置下拉框,波特率設(shè)置必須和燒入程序中設(shè)置的一致,,才能正常收發(fā)數(shù)據(jù),。 通過(guò)Serial.print() 語(yǔ)句將傳感器獲得的數(shù)據(jù)輸出到計(jì)算機(jī)的方法,在之前的章節(jié)中已進(jìn)行過(guò)演示,。 串口輸入除了輸出,,串口同樣可以接收由計(jì)算機(jī)輸出的數(shù)據(jù)。接收串口數(shù)據(jù)需要使用Serial.read()函數(shù),。 Serial.read(); 調(diào)用該語(yǔ)句,,每次都會(huì)返回一個(gè)字節(jié)的數(shù)據(jù),這個(gè)返回值便是當(dāng)前串口讀取到的數(shù)據(jù),。 上傳以下程序到Arduino:
上傳成功后,,運(yùn)行串口監(jiān)視器,在發(fā)送按鍵左側(cè)的文本框中輸入要發(fā)送的信息,,如'arduino',,你會(huì)看到Arduino在輸出了你輸入的信息同時(shí),還輸出了很多亂碼(如圖2-49所示),。 圖 2?49 串口輸入信息 這些亂碼是因?yàn)榇诰彌_區(qū)中沒(méi)有可讀數(shù)據(jù)造成的,。當(dāng)緩沖區(qū)中沒(méi)有可讀數(shù)據(jù)時(shí),read()函數(shù)會(huì)返回int型值-1,,而int型-1對(duì)應(yīng)的char型數(shù)據(jù)便是該亂碼,。 在使用串口時(shí),,Arduino Uno會(huì)在SRAM中開(kāi)辟一段大小為256 bytes的空間,串口接收到的數(shù)據(jù)都會(huì)被暫時(shí)存放進(jìn)這個(gè)空間中,,這個(gè)存儲(chǔ)空間,,我們稱(chēng)之為緩沖區(qū)。當(dāng)你調(diào)用Serial.read()語(yǔ)句時(shí),,Arduino便會(huì)從緩沖區(qū)取出一個(gè)字節(jié)的數(shù)據(jù),。 通常使用串口讀取數(shù)據(jù)時(shí),需要搭配Serial.available() 語(yǔ)句使用,。 Serial.available(); Serial.available() 的返回值便是當(dāng)前緩沖區(qū)中接收到的數(shù)據(jù)字節(jié)數(shù),。 Serial.available() 可以搭配if 或者while使用,先檢測(cè)緩沖區(qū)中是否有可讀數(shù)據(jù),,如果有數(shù)據(jù),,再讀取,沒(méi)有數(shù)據(jù)便跳過(guò)讀取或等待讀取,。如:
或 while( Serial.available() > 0 ) 示例程序代碼如下:
上傳完成后,打開(kāi)串口監(jiān)視器,,鍵入并發(fā)送任意信息,。你會(huì)看到Arduino輸出了你發(fā)送過(guò)去的信息,并且不會(huì)再出現(xiàn)亂碼了(如圖2-50所示),。 圖 2?50 結(jié)合available()的輸入效果 需要注意的是,,在串口監(jiān)視器右下角有兩個(gè)選項(xiàng),,一個(gè)是設(shè)置結(jié)束符,,一個(gè)是設(shè)置波特率。如果你設(shè)置了結(jié)束符,,則在你最后發(fā)送完數(shù)據(jù)后,,串口監(jiān)視器會(huì)自動(dòng)發(fā)送一組你設(shè)定的結(jié)束符,如回車(chē)符和換行符,。 可能已經(jīng)注意到了,,當(dāng)串口通信時(shí),Arduino控制器上的標(biāo)有RX,、TX的兩LED燈會(huì)閃爍提示,,接收數(shù)據(jù)時(shí),RX燈會(huì)點(diǎn)亮,,發(fā)送數(shù)據(jù)時(shí),,TX燈會(huì)點(diǎn)亮。 此外,,在涉及串口通信的Arduino Uno例程程序中,,還會(huì)經(jīng)??吹饺缦绿厥庥梅ǎ?/p> while (!Serial) { } 這是在等待串口監(jiān)視器開(kāi)啟,開(kāi)啟串口監(jiān)視器后,,!Serial將為假,,即會(huì)運(yùn)行該while循環(huán)后的語(yǔ)句。 利用串口通信功能,,我們可以使用計(jì)算機(jī)來(lái)控制Arduino執(zhí)行特定的操作,。 |
|
來(lái)自: 昵稱(chēng)68417077 > 《arduino》