前面的示例中使用到了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ā)送信息了。
Serial.print(val);
參數(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ī):
int counter=0; // 計(jì)數(shù)器
void setup() {
// 初始化串口
Serial.begin(9600);
}
void loop() {
// 每loop循環(huán)一次,計(jì)數(shù)器變量加1
counter = counter+1;
// 輸出變量
Serial.print(counter);
// 輸出字符
Serial.print( ':' );
// 輸出字符串;
Serial.println("Hellow World");
delay(1000);
}
上傳該程序到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:
void setup() {
// 初始化串口
Serial.begin(9600);
}
void loop() {
// 讀取輸入的信息
char ch=Serial.read();
// 輸出信息
Serial.print(ch);
delay(1000);
}
上傳成功后,運(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ò)讀取或等待讀取。如:
if( Serial.available() > 0 )
或
while( Serial.available() > 0 )
示例程序代碼如下:
void setup() {
// 初始化串口
Serial.begin(9600);
}
void loop() {
// 如果緩沖區(qū)中有數(shù)據(jù),則讀取并輸出
if(Serial.available()>0)
{
char ch=Serial.read();
Serial.print(ch);
}
}
上傳完成后,打開(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)?吹饺缦绿厥庥梅ǎ
while (!Serial) { }
這是在等待串口監(jiān)視器開(kāi)啟,開(kāi)啟串口監(jiān)視器后,!Serial將為假,即會(huì)運(yùn)行該while循環(huán)后的語(yǔ)句。
利用串口通信功能,我們可以使用計(jì)算機(jī)來(lái)控制Arduino執(zhí)行特定的操作。
承擔(dān)因您的行為而導(dǎo)致的法律責(zé)任,
本站有權(quán)保留或刪除有爭(zhēng)議評(píng)論。
參與本評(píng)論即表明您已經(jīng)閱讀并接受
上述條款。