Arduino的串口通訊函數

2021-01-10 愛上半導體

串口通訊是單片機當中用到的最多的一種通訊,對我而言,它最大的一個優勢就是簡單,相對於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();給引腳高低電平

相關焦點

  • python3腳本篇1-串口通訊腳本
    前言本文我們來學習Python軟體包pyserial的使用,硬體採用wemos D1開發板,直接燒錄串口章節代碼即可,本文主要編寫PC端Python腳本,完成腳本和外接串口設備通訊的功能。一、基礎知識1.pyserial簡介:pyserial模塊是python和串口設備通訊的package,串口是計算機上比較通用的通訊協議,串口設備通過USB插入電腦,python通過pyserial模塊就可以完成和串口設備的通訊,
  • 萬能超的arduino學習日記(一)
    本科時候有接觸過arduino,但是由於導師方向原因,轉做了3D列印和動力學分析,所以這裡是啥都會一點點的萬能超,希望能夠和大家一起學習討論。最近由於興趣原因,決定重新撿起arduino,所以決定寫這個萬能超的arduino學習日記跟大家一起重新學習。最開始的入門學習,我選擇跟B站太極創客的學習視頻,因為有基礎,選擇二倍速觀看學習。
  • arduino設置串口模式專題及常見問題 - CSDN
    與arduino uno主板不同, ESP32的PWM模擬是一個個通道 共16個, 通道可以映射到引腳上. 引腳就可以輸出PWM信號了.模擬信號輸出函數 (基於DAC)ESP32提供了兩個DAC通道, 對應引腳25 , 26. 精度為8位.
  • 樂創物聯物聯網架構之硬體層中間件Arduino 串口通信
    本節就來講感知層下硬體層中間件Arduino 串口通信。感知層是物聯網最基礎的部分,就像人的五官一樣去感受世界。1 Arduino 串口通信簡介Arduino需要和其他設備之間進行通信(例如PC、藍牙、WiFi等),而最常見最簡單的方式就是串口通信。
  • 串口通訊在變電站保護信息採集方面的問題
    在變電站實際保護信息採集系統中,過去採用串口通訊的比較多,那時候的保護裝置一般都只提供串口通訊方式。但串口方式相對於現在的幾個通訊方式,存在著通訊速率慢、通訊距離短、抗幹擾性弱等幾個特點,這對於通訊網絡結構的確立也會帶來一些困難。下面將對基於串口通訊的保護信息採集系統的組網提供幾個實際方案,並介紹這幾個方案在實際應用中存在的問題。
  • STM32 串口功能 庫函數 詳解和DMA 串口高級運用(轉載)
    硬體怎麼連接出發,當然對於stm32還要熟悉庫函數的功能具起來rs232和485電平的區別硬體外圍晶片,波特率(反映傳一位的時間),起始位和停止位,數據寬度,校驗,硬體流控制,相應連接電腦時的接口怎麼樣的。配置,使用函數,中斷,查詢並結合通信協議才算了解了串口使用。
  • 基於串口通訊技術實現流量計計量系統的設計
    由於串行通訊方式具有使用線路少、成本低,特別是在遠程傳輸時,避免了多條線路特性的不一致而被廣泛採用。在串行通訊時,要求通訊雙方都採用一個標準接口,使不同的設備可以方便地連接起來進行通訊。RS-232-C接口(又稱 EIA RS-232-C)是目前最常用的一種串行通訊接口。
  • arduino 低功耗模式專題及常見問題 - CSDN
    迄今為止,雖然高速藍牙已經實現,但BLE在通訊速度上比較普通,主要強調一個紐扣電池能夠工作幾年的這種省電性能。設備端和主機端使用GATT(Generic ATTribute) profile進行通信。 如果你聽到GATT這個名詞,就可以將其想成使用BLE,這沒什麼問題。由於與傳統藍牙不兼容,在主機端,和藍牙3.0合併做為雙模,實現成兩者都可以使用的情況比較多。
  • Arduino在嵌入式開發中應用案例之arduino點亮LED
    本分享一個通過arduino點亮LED的案例。 Serial Comm: 串口通信埠,在CPU上通過usart給PC端發送數據。 點亮Arduino LED小燈 創建項目 點亮LED燈 DDRB |= (1 << PB5); //配置PB5的data direction registerPORTB |= (1 << PB5); //使PB5輸出高電平PORTB &= ~(1 << PB5); //使PB5輸出低電平 串口通信
  • LabVIEW串口通信的一個例子-串口"示波器"
    功能介紹:左邊上方串口接收區,下方為串口字符發送區。右方為一個波形圖表,在程序內部每次將串口發送過來的數據,以f%格式化,顯示在波形圖表上。狀態Init:程序初始化,主要把OpenCom等按鈕,串口狀態,串口接收字符串,波形圖標,TX/RX計數等控制項,置為False或清零。初始化狀態只執行一次,接下來就進入狀態Event。
  • arduino從零開始(4)PWM與呼吸燈
    在arduino中,我們常用PWM來驅動LED的暗亮程度,電機的轉速等。我們知道,在數字電路中,電壓信號是離散的: 不是 0(0V)  就是 1(5V或者3.3V), 那麼如何輸出介於 0v 和  5V之間的某個電壓值呢?簡單來說就是在一個周期內讓電壓在0V與5V之間快速切換,根據5V的佔比便可以模擬出0v到5v之間的不同電壓。
  • 什麼是「串口」?
    大多數計算機包含兩個基於RS232的串口。串口同時也是儀器儀表設備通用的通信協議;很多GPIB兼容的設備也帶有RS-232口。同時,串口通信協議也可以用於獲取遠程採集設備的數據。串口通信的概念非常簡單,串口按位(bit)發送和接收字節。儘管比按字節(byte)的並行通信慢,但是串口可以在使用一根線發送數據的同時用另一根線接收數據。
  • 如何使用Qt為arduino製作圖形界面
    如何使用Qt為arduino製作圖形界面 網絡整理 發表於 2019-11-13 11:11:39 步驟1:安裝Qt
  • 十個中文例程教會你輕鬆上手製作Arduino智能小車
    Arduino簡介本文引用地址:http://www.eepw.com.cn/article/201706/348117.htmArduino 是一款便捷靈活、方便上手的開源電子原型平臺,包含硬體(各種型號的arduino板)和軟體(arduino IDE)。
  • 從串口驅動到Linux驅動模型,想轉Linux的必會!
    3、關於串口的種種眾所周知。我們現在的計算機上面有很多接口。如USB。網口。並口等。串口總線是其中的一個。串行接口簡稱串口,也稱串行通信接口或串行通訊接口(通常指COM接口),是採用串行通信方式的擴展接口。
  • 基於C8051F040單片機的CAN總線和RS-232串口通信設計
    為了實現對CAN總線和RS-232串口雙向通信需求,提出了一種基於C8051F040單片機的數據通信方案,並完成系統設計。分析了CAN總線和RS-232串口的通信特點,介紹了單片機硬體,並對軟體的設計思路與流程做了詳盡描述,完成功能檢測。實驗結果表明,該設計達到了要求。
  • 基於MFC串口連續通信的簡易實現
    之間的時間間隔T1,將間隔本文引用地址:http://www.eepw.com.cn/article/201610/306451.htm串口通信適用於長距離控制與數據傳輸,許多單片機在內部均集成了串口通信模塊,而計算機的作業系統也內嵌有對串口通信的支持。
  • 串口通訊的起始、數據、停止位是怎麼分配的?
    串口是串行接口(serial port)的簡稱,也稱為串行通信接口或COM接口。串口通信是指採用串行通信協議(serial communication)在一條信號線上將數據一個比特一個比特地逐位進行傳輸的通信模式。
  • 一文看懂arduino驅動uln2003操作步進電機的方法
    打開APP 一文看懂arduino驅動uln2003操作步進電機的方法 發表於 2018-05-30 09:34:32   arduino驅動uln2003操作步進電機的方法   1、網上買的步進電機,很多接線順序都不對。
  • 串口通訊的起始、數據、停止位分配也不過如此
    串口是串行接口(serial port)的簡稱,也稱為串行通信接口或COM接口。 串口通信是指採用串行通信協議(serial communication)在一條信號線上將數據一個比特一個比特地逐位進行傳輸的通信模式。