相關(guān)推薦
您可能對(duì)下面課程感興趣
Arduino視頻教程基礎(chǔ)篇

75小節(jié)已有138575人學(xué)過(guò)

Arduino編程串口的使用
發(fā)布時(shí)間:2022-03-11 08:39 [ 我要自學(xué)網(wǎng)原創(chuàng) ] 發(fā)布人: 小劉2175 閱讀: 10724

前面的示例中使用到了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í)行特定的操作。

Arduino視頻教程基礎(chǔ)篇
我要自學(xué)網(wǎng)商城 ¥40 元
進(jìn)入購(gòu)買(mǎi)
文章評(píng)論
0 條評(píng)論 按熱度排序 按時(shí)間排序 /350
添加表情
遵守中華人民共和國(guó)的各項(xiàng)道德法規(guī),
承擔(dān)因您的行為而導(dǎo)致的法律責(zé)任,
本站有權(quán)保留或刪除有爭(zhēng)議評(píng)論。
參與本評(píng)論即表明您已經(jīng)閱讀并接受
上述條款。
V
特惠充值
聯(lián)系客服
APP下載
官方微信
返回頂部
相關(guān)推薦
您可能對(duì)下面課程感興趣
Arduino視頻教程基礎(chǔ)篇

75小節(jié)已有138575人學(xué)過(guò)

分類(lèi)選擇:
電腦辦公 平面設(shè)計(jì) 室內(nèi)設(shè)計(jì) 室外設(shè)計(jì) 機(jī)械設(shè)計(jì) 工業(yè)自動(dòng)化 影視動(dòng)畫(huà) 程序開(kāi)發(fā) 網(wǎng)頁(yè)設(shè)計(jì) 會(huì)計(jì)課程 興趣成長(zhǎng) AIGC