Arduino的串口通訊函數

2020-12-17 愛上半導體

串口通訊是單片機當中用到的最多的一種通訊,對我而言,它最大的一個優勢就是簡單,相對於I2C、SPI等,參與串口通訊的線只有兩根,分別為接收端、發送端,當然還包括電源線,我們暫且不管。

單片機工作的時候一般都是單片機與之間單片機通訊,還有一種就是單片機與電腦的通訊,與電腦通訊主要是調試單片機的時候使用,那麼串口通訊到底在通訊什麼呢?它主要傳輸一些數據,比如12345、ABCD,也可以傳輸漢字,但是很少有人用漢字傳輸數據的,你知道為什麼嗎?

單片機之間為什麼要串口通訊呢?是它們閒的無聊?

當然不是,它所傳輸的所有數據都是為控制做準備,那麼這些數據怎麼就能控制外設的呢?比如說LED燈。這些數據是不能直接控制LED燈開關的,比如說電腦給單片機發送「關燈」口令,LED燈就會關閉嗎?不會的,單片機怎麼會知道「關燈」是什麼呢,但是單片機可以判斷接收到的字符串,但是我們可以提前設置好,也就是給單片機編程,當單片機接收到「關燈」這兩個字符時,它就給LED引腳輸出低電平,以此來達到關閉LED燈的目的。

還有我們所傳輸的「關燈」,在單片機看來就是一堆二進位數字,比如說「10100011」,只有它接收到10100011這一串二進位數字時,單片機才會有所動作。這麼看來單片機似乎有很傻、很死板,單片機是死的,但人是活的,我們可以把我們的思想寫進單片機,這就是單片機的偉大之處。還有越是智能的晶片,人的參與越多,比如說現在流行的語音控制,蘋果的SIRI、小米的小艾同學,它所能聽懂的每一句話,都是軟體工程師提前想好人們要說什麼,並且寫進晶片去的,這個工程就需要龐大的人力去完成。

Hello world

說了這麼多,我們先來做一個最簡單的小實驗,讓Arduino在電腦上列印,也就是讓Arduino發送數據,電腦就收數據,並且電腦接收到數據之後列印在屏幕上。

void setup() {Serial.begin(9600); }void loop() { Serial.print("Hello World"); delay(1000);}

程序中 函數Serial.begin(9600)是設置串口通訊的波特率為9600;

函數Serial.print("Hello World")是單片機的發送端向電腦發送引號之內的數據,即Hello World;

函數delay(1000)是延時1000毫秒,也就是一秒,為什麼要延時呢?如果不延時,電腦接收數據會很頻繁,你根本看不過來,給讓人眼花繚亂的感覺。

在不加延時的情況下,我們可以觀察Arduino板上的發送端LED燈,這時候它肯定是常亮的,正常情況下是只有接收到數據,LED燈才會閃爍一次,因為無時無刻在往電腦發送數據,我們來看一下是不是這樣呢?可以看到TX(發送端)的LED燈是常亮(由於動圖的清晰度太低,所以用普通照片代替Gif),如果我們加上延時之後LED燈就會每隔一秒閃爍一次。

實驗現象

每隔一秒向屏幕列印Hello World,但是接收端看上去的感覺很亂,第一個Hello World和第二個Hello World收尾相接,給人很混亂的感覺,這是為什麼呢?

原因在於Serial.print()函數隻支持單純的列印,並不支持換行,這時候我們需要用另外一個函數Serial.println()來解決這個問題,雖然只多了兩個字母,但是列印出來的字符看的就舒服多了,因為它在列印完成之後,會另起一行繼續列印,也可以理解為在列印完成數據之後,給電腦發送了回車鍵的命令。下面來看一下Serial.println()的實驗效果。

電腦向單片機發數據

上面的實驗是Arduino向電腦發送數據,我們現在讓電腦向Arduino發送數據,比如發送0或者1。發送數據很簡單,只需要我們在串口監視助手上面輸入0或者1即可把我們想要發送的數據傳給單片機。但是問題來了,我們怎麼知道單片機收到數據了,從Arduino往電腦上發數據,因為電腦有屏幕,我們可以看到現象,Arduino沒有屏幕怎麼辦呢?

這時候就需要依靠強大的Arduino庫函數,比如我們前面所說的 Serial.begin(9600)、delay(1000)等都是庫函數,我們可以直接調用,而無需知道他的原始碼。依靠庫函數可以看到我們發送數據時應有的現象,比如說我們給Arduino發送1,當Arduino收到1之後點亮LED,而收到0之後熄滅LED。

程序

int x = 0; //定義變量xvoid setup() { pinMode(13,OUTPUT); //設置13引腳為輸出模式 Serial.begin(9600); //設置波特率為9600}void loop(){ if (Serial.available() > 0) //返回串口緩衝區中當前剩餘的字符個數 { x = Serial.read();//把收到的數據賦給x if(x=='1') //如果收到的是1 digitalWrite(13,HIGH); //點亮LED if(x=='0') //如果收到的是0 digitalWrite(13,LOW); //熄滅LED}}程序裡面寫注釋了,在這裡就不多作解釋。

實驗現象

當我們向Arduino發送1之後的實驗現象,可以看到LED燈13亮了,然而屏幕上並沒有顯示任何東西,在點亮LED燈之後,Arduino是不是應該向電腦發送一些數據,比如發送「已經為你開燈」,當收到0之後,向電腦發送「已經為你關燈」。

進階程序

這個程序也很簡單,只需要把我們最開始的串口列印函數加上就可以了, 代碼基本上和上面的差不多程序如下:

int x = 0; //定義變量xvoid setup() {pinMode(13,OUTPUT); //設置13引腳為輸出模式 Serial.begin(9600); //設置波特率為9600}void loop(){ if (Serial.available() > 0) //返回串口緩衝區中當前剩餘的字符個數 { x = Serial.read();//把收到的數據賦給x if(x=='1') //如果收到的是1 { digitalWrite(13,HIGH); //點亮LED Serial.println("已經為你開燈"); } if(x=='0') //如果收到的是0 { digitalWrite(13,LOW); //熄滅LED Serial.println("已經為你關燈"); }}}

實驗現象

當收到1時,可以看到屏幕上的串口助手顯示了「已經為你開燈」

當收到0時的實驗現象

不止0和1

除了用0和1之外,我們還可以用「漢字」開燈控制LED燈,道理是一樣的,如果有功放的話,還可以做語音播報,還有現在大火的物聯網領域所使用的8266WIFI模塊所使用的就是串口透傳,只不過那個8266WiFi模塊可以無線傳輸,甚至可以把我們上面程序之外的0和1穿到大洋彼岸的美國。我們現在做實驗可以用0和1直接控制,但是等我們真正做產品時,如果像剛才那樣是斷然不可以的,一般所發送的數據可能是十幾位數或更多,這是為了保證數據的可靠性和防幹擾。

Final

列舉一下我們用到的Arduino函數。

Serial.begin(); 設置串口波特率

Serial.print(); 不換行列印

Serial.println(); 換行列印

Serial.available() ;返回串口緩衝區中當前剩餘的字符個數

Serial.read();讀取一個字節

delay(); 延時函數

pinMode(); 設置引腳的輸入輸出

digitalWrite();給引腳高低電平

相關焦點

  • Arduino基礎入門篇23—串口通訊
    在很多時候,Arduino需要和其他設備相互通訊,而最常見最簡單的方式就是串口通訊。本篇介紹Arduino硬體串口通訊,了解相關函數的使用。1. 硬體串口在PC機上最常見的串行通訊協議是RS-232串行協議,而各種微控制器(單片機)上採用的是TTL串行協議,兩者電平不同,需要經過相應電平轉換才能進行相互通訊。
  • Arduino串口通信簡介
    setup()函數中。2.清空串口緩存Serial.flush();   等待輸出數據傳送完畢,避免數據讀取錯誤。3.Serial.read()函數讀取串口緩存中的一個字符,並刪除已讀字符。4.Serial.print(); 說明串口輸出數據函數,寫入字符串數據到串口。
  • arduino設置串口模式專題及常見問題 - CSDN
    與arduino uno主板不同, ESP32的PWM模擬是一個個通道 共16個, 通道可以映射到引腳上. 引腳就可以輸出PWM信號了.模擬信號輸出函數 (基於DAC)ESP32提供了兩個DAC通道, 對應引腳25 , 26. 精度為8位.
  • 萬能超的arduino學習日記(一)
    本科時候有接觸過arduino,但是由於導師方向原因,轉做了3D列印和動力學分析,所以這裡是啥都會一點點的萬能超,希望能夠和大家一起學習討論。最近由於興趣原因,決定重新撿起arduino,所以決定寫這個萬能超的arduino學習日記跟大家一起重新學習。最開始的入門學習,我選擇跟B站太極創客的學習視頻,因為有基礎,選擇二倍速觀看學習。
  • arduino 從零開始(2)探索arduino開發板和arduino IDE
    1、你將會探索arduino開發板2、你將會打開並上傳程序到arduino 板3、你將會學到arduino程序的基本框架和基本函數4、你將會自己編寫並上傳arduino程序一、arduino 板簡單來說,arduino(硬體)就是一個可以用來根據你的要求進行編程從而可以和很多輸入輸出設備進行交互的一個微型電腦系統。
  • 如何採用串口通信的連接方式和C語言編程實現串口通訊
    如何採用串口通信的連接方式和C語言編程實現串口通訊 電子工程網 發表於 2019-09-25 15:53:34 0前言 串行通信在通訊領域被廣泛應用,標準的RS232接口已成為計算機、外設、交換機和許多通訊設備的標準接口
  • Arduino_集合Arduino教程、Arduino IDE及設計應用的技術專題
    在線等挺急的 詳細點 回答28# eepwlover:Arduino開發工具(arduino IDE) 1.0.5 綠色免費版
  • printf()函數重定向到STM32串口輸出
    /html/1573.htmlC語言中使用printf()函數輸出是非常方便功能非常強大的,如果能將printf()函數使用到串口上,能實現非常多的強大輸出功能,極大方便我們使用串口輸出功能。printf()函數是輸出到顯示器,而MCU是沒有顯示器的,要使他輸出到串口,需要重定向該函數printf()函數中調用fputc()函數,只要對該函數進行重定向,即可實現功能//使用printf()函數要添加頭文件「stdio.h"#include "stdio.h"//printf()函數重定向到USART2
  • 初步認識Arduino
    CPU,16MHz時鐘頻率,32KB快閃記憶體Flash(0.5 KB用於引導程序bootloader),2KB SRAM,1KB EEPROM)ISCP引腳14個數字I/O接口(含標有~的6個脈寬調製 PWN輸出)用於輸入輸出0或1這樣的二進位數據串口狀態燈
  • LABVIEW+Arduino
    而arduino可以模擬這些操作,再與LABVIEW相結合,可以在同一程序能實現切換頻點、通道等的操作,並根據測試需要將所需要的測試數據記錄在相應的表格內。一、什麼是arduinoArduino是一款便捷靈活、方便上手的開源電子原型平臺。包含硬體(各種型號的Arduino板)和軟體(Arduino IDE)。由一個歐洲開發團隊於2005年冬季開發。
  • arduino串口調試設置專題及常見問題 - CSDN
    >、AT+Shift,啟動串口無線設置:程序自動設置無線模塊參數,串口1發送參數到無限模塊,並將返回參數通過模擬串口顯示。無法在Arduino IDE的串口監視器中顯示,需要使用串口調試助手 USR-TCP232-Test-V1.33、按鍵有更新,模擬串口顯示按鍵數據+發送數據+按鍵功能(Arduino IDE查看),串口1無線模塊發送8位數據(串口調試助手查看)。
  • Arduino為什麼這麼火
    arduino究竟好在哪裡。IDE則是在說arduino有自己的開發環境,即軟體,這裡可以類比我們大家電腦上的其他應用軟體,如ps(用於處理圖片),只不過這個軟體是用來定向的實現arduino元件功能開發的。
  • 如何用Matlab連接控制Arduino:GUI界面製作與電機控制
    至此,我們已經完成必要的程序的燒寫和界面的初步編寫,下面將繼續介紹如何添加按鈕的響應函數,實現上位機的控制功能。  我們利用Matlab已經初步設計了一個GUI界面,下面將添加必要的響應函數,演示時間的控制功能。  下圖展示如何從GUIDE進入按鈕的編輯界面,在這裡我們將添加對Arduino相應的IO口或者串口的操作。
  • Arduino串口
    >{//定義0~6腳是輸出for(int i = 0; i < 6; i++) pinMode(PWMPin[i], OUTPUT);Serial.begin(9600);}void loop(){//j是分拆之後數字數組的位置記數int j = 0;//不斷循環檢測串口緩存
  • Arduino學習第五彈——串口的應用:藍牙模塊
    常說的Arduino串口通信,是指異步串行通信方式,數據以字節為單位一幀一幀的發送和接收,無需同步時鐘,節省了設備的開銷。       本次學習我們利用串口的目的是建立Arduino和HC-06藍牙模塊的通信,使藍牙模塊能在專用的AT指令下正常工作。
  • Arduino+Labview也算強強聯合吧(上)
    你安裝好Labview後需要安裝一個叫Visa的Labview插件,這個插件的功能是管理串口,Labview與Arduino之間的通訊全靠這個插件完成。現在我們把該安裝的東西都安裝好了,我們進行Arduino UNO板和PC的連接(1) 去Arduino官網下一個最新的IDE(最好是1.0版本以上的,裡面有UNO的USB串口驅動)http://arduino.cc/en/Main/Software(2) 把IDE解壓到 C:\Program Files.
  • Arduino 語法舉例說明
    在 delay函數使用的過程中,讀取傳感器值、計算、引腳操作均無法執行,因此,它所帶來的後果就是使其他大多數活動暫停。其他操作定時的方法請參加 millis()函數和它下面的例子。大多數熟練的程式設計師通常避免超過10毫秒的delay(),除非arduino程序非常簡單。但某些操作在delay()執行時任然能夠運行,因為delay函數不會使中斷失效。
  • 在使用串口列印printf()函數時的配置
    在使用串口列印printf()函數時的配置在STM32串口通信程序中使用printf發送數據,非常的方便。printf函數是c語言庫stdio.h中的函數,在使用printf列印時,應包含頭文件,其次還要配置fputc()函數,1、首先要在你的main 文件中 包含「stdio.h」 (標準輸入輸出頭文件)。
  • arduino 有低功耗 - CSDN
    迄今為止,雖然高速藍牙已經實現,但BLE在通訊速度上比較普通,主要強調一個紐扣電池能夠工作幾年的這種省電性能。設備端和主機端使用GATT(Generic ATTribute) profile進行通信。 如果你聽到GATT這個名詞,就可以將其想成使用BLE,這沒什麼問題。由於與傳統藍牙不兼容,在主機端,和藍牙3.0合併做為雙模,實現成兩者都可以使用的情況比較多。
  • Arduino 機器學習實戰入門(下)
    從https://arduino.cc/downloads下載並安裝Arduino IDE在Arduino IDE菜單中選擇工具>板>板管理器…搜索並安裝Arduino_TensorFlowLite庫接下來搜索並安裝Arduino_LSM9DS1庫:選擇板工具>板> Arduino Nano 33 BLE選擇埠工具>埠> COM5 (Arduino Nano