arduino設置串口模式專題及常見問題 - CSDN

2021-01-20 CSDN技術社區

我用的 ESP32 DEVKIT V1引腳圖


一、GPIO1、初始化GPIO

pinMode(pin, mode)

作用:設置一個引腳(pin)作為GPIO時的I/O模式。

參數:

pin:引腳編號

mode:GPIO的I/O模式,取值有3種

INPUT :作為數字輸入

OUTPUT :作為數字輸出

INPUT_PULLUP:作為數字輸入,且使能引腳的內部上拉電阻

注意:

a、引腳作為PWM輸出時,無需先前使用pinMode配置其模式,因為PWM本身就代表了輸出的意思。且官方庫原始碼中可以發現,它已經幫我們配置為輸出了。

b、模擬引腳也可以作為數字引腳使用,完全OK。這在數字引腳不夠用的情況下非常有用。

2、GPIO數字輸出

digitalWrite(pin,value)

作用:設置一個數字輸出引腳的輸出電平值,HIGH或者LOW。

參數:

pin:引腳編號。此引腳必須在之前使用pinMode設置為OUTPUT模式。

value:2個值

LOW:輸出低電平

HIGH:輸出高電平

3、GPIO數字輸入

int digitalRead(pin)

作用:讀取一個數字輸入引腳的電平值。

返回:HIGH(高電平)或者LOW(低電平)。

參數:

pin:引腳編號。

示例 : 按鍵控制燈亮滅
void setup(){  pinMode(2,OUTPUT);  pinMode(0,INPUT_PULLUP);}void loop(){  if(digitalRead(0))  {    while(digitalRead(0));    digitalWrite(2,!digitalRead(2));  }}

4、GPIO模擬輸入:analogRead(pin)

注意 : 模擬輸入是通過PWM實現的, 所以不需要初始化PIN

analogRead(4)

5. 模擬信號輸入解析度: analogSetWidth(bit);bit的值範圍90~511100~1023110~204712(默認)0~40956. 模擬信號輸出 (基於LEDC)

LEDC是基於PWM調製實現模擬輸出的.
與arduino uno主板不同, ESP32的PWM模擬是一個個通道 共16個, 通道可以映射到引腳上. 引腳就可以輸出PWM信號了.

6.1 設置通道 ledcSetup(channel,freq,bit_num)

參數:

channel : LEDC的PWM通道參數,可選0~15freq : 10Hz到40MHz , 但較高的頻率精確度低bit_num: 佔空比解析度(可選1~16), 比如bit_num=8 則範圍 0~2的8次方 , 也就是0~255

推薦的配置:

頻率位深過渡的可用步驟1220赫茲16655362441赫茲15327684882赫茲14163849765Hz13819219531赫茲124096
ledcSetup(1,1200,16);

6.2 通道與引腳映射 ledcAttachPin(pin,channel)
ledcAttachPin(5,1);

注意: 一個通道可以同時映射多個引腳

6.3 取消引腳的PWM映射 ledcDetachPin(pin)
ledcDetachPin(5);

6.4 向指定通道寫入佔空比 ledcWrite(channel,duty)

例: 呼吸燈

bool add_status = true;void setup(){  pinMode(2,OUTPUT);  ledcSetup(2,1200,8);  ledcAttachPin(2,2);}void loop(){   for(int i = 0 ; i<256; i++)   {    if(add_status)    {      ledcWrite(2,i);    }    else    {      ledcWrite(2,256-i);    }    delay(5);  }  add_status = !add_status;}

例子, 全彩呼吸燈
#include <Arduino.h>#define LED_R 27#define LED_G 33#define LED_B 32void setup(){  Serial.begin(115200);  ledcSetup(1, 1200, 8);  ledcSetup(2, 1200, 8);  ledcSetup(3, 1200, 8);  ledcAttachPin(LED_R, 1);  ledcAttachPin(LED_G, 2);  ledcAttachPin(LED_B, 3);  ledcWrite(1, 255);  ledcWrite(2, 255);  ledcWrite(3, 255);}void loop(){  for (int i = 0; i < 510; i++)  {    if (i >= 0 && i < 255)      ledcWrite(1, 255 - i);    if (i >= 255 && i < 510)      ledcWrite(1, i - 255);    if (i >= 0 && i < 170)      ledcWrite(2, 85 + i);    if (i >= 170 && i < 425)      ledcWrite(2, 425 - i);    if (i >= 425 && i < 510)      ledcWrite(2, i - 425);    if (i >= 0 && i < 85)      ledcWrite(3, 85 - i);    if (i >= 85 && i < 340)      ledcWrite(3, i - 85);    if (i >= 340 && i < 510)      ledcWrite(3, 595 - i);    delay(10);  }}

6.5 向指定通道輸出指定頻率的音符信號 ledcWriteTone(channel, freq)6.6 向指定通道輸出指定的音符和音階 ledcWriteNote(channel,note,octava)

參數

note : 音符 可選(NOTE_C, NOTE_Cs, NOTE_D, NOTE_Eb, NOTE_C......)octava : 音階 , 可選0~77. 模擬信號輸出函數 (基於DAC)

ESP32提供了兩個DAC通道, 對應引腳25 , 26. 精度為8位.

dacWrite(pin,value);

void setup(){}void loop(){   for(int i = 0 ; i<256; i++)   {    dacWrite(25,i);    delay(10);  }}

二、串口列印 UART

ESP32共有3個UART埠, 其中UART1用於Flash讀/寫.

串口名Arduino名TXRXUART0Serialpin1pin3UART1Serial1pin10pin9UART2Serial2pin17pin161、串口初始化

Serial.begin(speed, config)

參數:speed:波特率,一般取值9600,115200等。config:設置數據位、校驗位和停止位。默認SERIAL_8N1表示8個數據位,無校驗位,1個停止位。返回值:無。2、關閉串口

Serial.end()

描述:禁止串口傳輸。此時串口Rx和Tx可以作為數字IO引腳使用。原型:Serial.end()參數:無。返回值:無。3、串口列印

Serial.print()

描述:串口輸出數據,寫入字符數據到串口。原型:Serial.print(val)Serial.print(val, format)參數:val:列印的值,任意數據類型。config:輸出的數據格式。BIN(二進位)、OCT(八進位)、DEC(十進位)、HEX(十六進位)。對於浮點數,此參數指定要使用的小數位數。4、串口輸出數據並換行 println() 和 printf()

Serial.println()
Serial.printf()

描述:串口輸出數據並換行。原型:Serial.println(val)Serial.println(val, format)參數:val:列印的值,任意數據類型。config:輸出的數據格式。返回值:返回寫入的字節數。附: 常用格式字符及轉義字符字符說明%o八進位整數輸出%d十進位整數輸出%x十六進位整數輸出%f浮點輸出,默認6位小數%c單字符輸出%s字符串輸出\n換行\r回車\tTab制表符5、將二進位數寫入串口

Serial.write()

描述
將二進位數據寫入串行埠。該數據以字節或一系列字節的形式發送;要發送代表數字數字的字符,請改用print()函數。
句法
*Serial*.write(val)
*Serial*.write(str)
*Serial*.write(buf, len)
參量
*Serial*:串行埠對象。請參閱「 串行」主頁上每個板的可用串行埠列表。
val:要作為單個字節發送的值。
str:作為一系列字節發送的字符串。
buf:要作為一系列字節發送的數組。
len:要從數組發送的字節數。
退貨
write()將返回寫入的字節數,儘管讀取該數字是可選的。資料類型:size_t。

6、判斷串口緩衝區的狀態

Serial.available()

描述:判斷串口緩衝區的狀態,返回從串口緩衝區讀取的字節數。原型:Serial.available()參數:無。返回值:可讀取的字節數。7、讀取串口數據

Serial.read()
描述:讀取串口數據,一次讀一個字符,讀完後刪除已讀數據。

原型:Serial.read()參數:無。返回值:返回串口緩存中第一個可讀字節,當沒有可讀數據時返回-1,整數類型。
#include<stdio.h>#include<stdlib.h>char rev;void setup() {  Serial.begin(115200);}void loop() {  if(Serial.available())  {    rev=Serial.read();    Serial.print("rev=");    Serial.println(rev);    }}

Serial.readBytes()

描述:從串口讀取指定長度的字符到緩存數組。原型:Serial.readBytes(buffer, length)參數:buffer:緩存變量。length:設定的讀取長度。

返回值:返回存入緩存的字符數。

Serial.readString()

描述

Serial.readString()從串行緩衝區讀取字符到字符串。如果超時,該函數將終止。

Serial.readString()從Stream實用程序類繼承。

句法

*Serial*.readString()

參量

*Serial*:串行埠對象。請參閱「 串行」主頁上每個板的可用串行埠列表。

返回值

一個String從串行讀緩衝器

Serial.readStringUntil()

描述
readStringUntil()從串行緩衝區讀取字符到字符串。如果超時,該函數將終止(請參見setTimeout())。
Serial.readStringUntil()從Stream實用程序類繼承。
句法
*Serial*.readStringUntil(terminator)
參量
*Serial*:串行埠對象。請參閱「 串行」主頁上每個板的可用串行埠列表。
terminator:要搜索的字符。允許的數據類型:char。
返回值
String從串行緩衝區的整個讀取,直到終止符

注意和警告
終止符將從串行緩衝區中丟棄。

Serial.find()

描述
Serial.find()從串行緩衝區讀取數據,直到找到目標為止。true如果找到目標,函數將返回false超時。
Serial.find()從流實用程序類繼承。
句法
*Serial*.find(target)
*Serial*.find(target, length)
參量
*Serial*:串行埠對象。請參閱「 串行」主頁上每個板的可用串行埠列表。
target:要搜索的字符串。允許的數據類型:char。
length:目標的長度。允許的數據類型:size_t。
返回值
資料類型:bool。

Serial.findUntil()

描述
Serial.findUntil() 從串行緩衝區讀取數據,直到找到給定長度的目標字符串或終止符字符串。
如果找到目標字符串,則該函數返回true;如果超時,則返回false。
Serial.findUntil()從Stream實用程序類繼承。
句法
*Serial*.findUntil(target, terminal)
參量
*Serial*:串行埠對象。請參閱「 串行」主頁上每個板的可用串行埠列表。
target:要搜索的字符串。允許的數據類型:char。
terminal:搜索中的終端字符串。允許的數據類型:char。
返回值
資料類型:bool。

Serial.parseFloat()

描述
Serial.parseFloat()從串行緩衝區返回第一個有效的浮點數。parseFloat()以不是浮點數的第一個字符終止。如果超時,該函數將終止(請參見Serial.setTimeout())。
Serial.parseFloat()從Stream實用程序類繼承。
句法
*Serial*.parseFloat()
*Serial*.parseFloat(lookahead)
*Serial*.parseFloat(lookahead, ignore)
參量
*Serial*:串行埠對象。請參閱「 串行」主頁上每個板的可用串行埠列表。
lookahead:用於在流中向前查詢浮點數的模式。允許的數據類型:LookaheadMode。允許lookahead值:

SKIP_ALL:掃描流中的浮點數時,除負號,小數點或數字以外的所有字符都將被忽略。這是默認模式。SKIP_NONE:任何內容都不會被跳過,除非第一個等待的字符有效,否則流不會被觸摸。SKIP_WHITESPACE:僅跳過制表符,空格,換行符和回車符。
ignore:用於跳過搜索中指示的字符。例如,用於跳過數千個分頻器。允許的數據類型:char
返回值:
類型:float。Serial.parseInt()

描述
在輸入的序列中查找下一個有效整數。如果超時,該函數將終止(請參見Serial.setTimeout())。
Serial.parseInt()從Stream實用程序類繼承。
尤其是:

如果沒有讀取到可配置的超時值的字符,或者讀取了非數字,則分析停止。如果在發生超時(請參見Serial.setTimeout())時未讀取到有效數字,則返回0;否則返回0。

句法
*Serial*.parseInt()
*Serial*.parseInt(lookahead)
*Serial*.parseInt(lookahead, ignore)
參量
*Serial*:串行埠對象。請參閱「 串行」主頁上每個板的可用串行埠列表。
lookahead:用於在流中向前搜索整數的模式。允許的數據類型:LookaheadMode。允許lookahead值:

SKIP_ALL:掃描流中的整數時,將忽略數字或減號以外的所有字符。這是默認模式。SKIP_NONE:任何內容都不會被跳過,除非第一個等待的字符有效,否則流不會被觸摸。SKIP_WHITESPACE:僅跳過制表符,空格,換行符和回車符。

ignore:用於跳過搜索中指示的字符。例如,用於跳過數千個分頻器。允許的數據類型:char
返回值
下一個有效整數。資料類型:long。

8.判斷串口是否就緒** Serial

描述

指示指定的串行埠是否已就緒。

在具有本地USB的板上if (Serial)(或if(SerialUSB)在Due上)指示USB CDC串行連接是否打開。對於所有其他板卡和非USB CDC埠,這將始終返回true。

這是在Arduino IDE 1.0.1中引入的。

句法

if (Serial) while (!Serial) 等等

參量

沒有

返回值

如果指定的串行埠可用,則返回true。如果在準備就緒之前查詢Leonardo的USB CDC串行連接,則僅返回false。類型:bool。

9、設置串口超時**Serial.setTimeout()

描述
Serial.setTimeout()設置等待串行數據的最大毫秒數。默認值為1000毫秒。
Serial.setTimeout()從Stream實用程序類繼承。
句法
*Serial*.setTimeout(time)
參量
*Serial*:串行埠對象。請參閱「 串行」主頁上每個板的可用串行埠列表。
time:超時時間(以毫秒為單位)。允許的數據類型:long。
退貨
沒有

注意和警告
使用通過*Serial*.setTimeout()以下方式設置的超時值的串行函數:

*Serial*.find()*Serial*.findUntil()*Serial*.parseInt()*Serial*.parseFloat()*Serial*.readBytes()*Serial*.readBytesUntil()*Serial*.readString()*Serial*.readStringUntil()

也可以看看

void setup() {  //Initialize serial and wait for port to open:  Serial.begin(9600);  while (!Serial) {    ; // wait for serial port to connect. Needed for native USB  }}void loop() {  //proceed normally}

/*   Serial   串口通訊實驗*/int incomedate = 0;void setup() {  Serial.begin(9600); //設置串口波特率9600  Serial.println(78, BIN);// "1001110"  Serial.println(78, OCT);// "116"  Serial.println(78, DEC);// "78"  Serial.println(78, HEX);// "4E"  Serial.println(1.23456, 0);// "1"  Serial.println(1.23456, 2);// "1.23"  Serial.println(1.23456, 4);// "1.2346"  Serial.println('N');// "N"  Serial.println("Hello world.");// "Hello world."}void loop() {  if (Serial.available() > 0)//串口接收到數據  {    incomedate = Serial.read();//獲取串口接收到的數據    if (incomedate == 'H')    {      Serial.println("Good Job!");    }  }  delay(1000);}

使用的串口Serial其實是HardwareSerial類的實例化,實例化過程中傳入了串口號,實現過程如下:

相關焦點

  • 對抗學習專題及常見問題 - CSDN
    物理世界中的對抗樣本,有列印重照、亮度對比度等調整)【https://blog.csdn.net/u010710787/article/details/78916762】隱馬爾可夫:通過顯序列算隱序列generalization ability 泛化:不要過擬合神經網絡:非線性積累NP完全問題
  • 智能家居控制-arduino紅外基本控制
    智能家居控制系統中最常見的應該就是紅外遙控器了,電視,空調,機頂盒等,基本上常見的只要是遙控控制的都是採用的紅外發射控制。紅外發射,其實就是將要控制的設備,通過遙控的主控晶片發射一組編碼,然後設備接收後進行對應的操作,要想實現智能設備控制就先要知道遙控器發射的是什麼今天這篇文章就是用arduino這個最基本的單片機,來解讀不同遙控器發射出來的編碼,知道編碼後,就可以實現後續使用單片機或者智能音響控制設備。
  • arduino定位專題及常見問題 - CSDN
  • android 監聽屏幕鎖屏專題及常見問題 - CSDN
    > 鎖屏聽音樂(音頻),沒有鎖屏看視頻Android系統亮屏、鎖屏、屏幕解鎖事件(解決部分手機亮屏後未解鎖即進入resume狀態)- http://blog.csdn.net/oracleot/article/details/20378453Android 實現鎖屏的較完美方案- https://segmentfault.com/a/1190000003075989
  • windows10卡啟動修復專題及常見問題 - CSDN
    在Windows 10上,安全模式允許加載一組基本功能和通用設備驅動程序,足以解決常見的軟體和硬體問題。例如,當計算機無法正常啟動、網絡連接問題以及應用程式或Windows Update無法下載更新時,可以使用安全模式對其進行故障排除。
  • android 啟動頁慢專題及常見問題 - CSDN
    systrace即可以看到添加的tag「AppOnCreate」,對應的時間信息:Wall Duration 代表的方法從開始到結束的耗時CPU Duration 代表CPU的執行時間通過這兩個參數可以看出此流程中執行的時間等相關信息我們都知道CPU是輪詢模式
  • 聯智通達多串口工控主板常見的4種維修方法
    大家都知道工控主板在使用過程中,隨著時間的積累會出現各種各樣的問題,不懂得人拿去維修不僅費時費力還花冤枉錢,專業的人士就是懂得通過常見的維修方法就行維修,那麼是哪四種呢?聯智通達為您解答:聯智通達多串口工控主板常見的4種維修觀察法:在檢修主板時,要先觀察工業主板上的電容是否有鼓包、漏液或嚴重損壞;電阻、電容引腳是否相碰,表面是否燒焦,晶片表面是否開裂;銅箔是否燒斷。
  • 用Arduino開發物聯網設備之初識Arduino
    這個問題其實是有一點混亂的,因為arduino既可以指硬體,也可以指軟體。它其實是指的即是硬體又是軟體,我們平時所說的多數指的是它的軟體開發平臺,也就是軟體部分。硬體部分:最初Arduino硬體只有那麼幾種,uno、mini等,但是現在經過這麼多年的發展,越來越多的硬體支持了arduino開發環境,所以現在也很難去界定什麼是血統純正的arduino硬體了。
  • 一分四串口UART擴展晶片的特性
    矛盾的是,CPU通常不會有那麼多串口,所以這個時候就需要通過合適的方式進行串口擴展,或者通過Local Bus,或者SPI,或者USB接口。在本文中我想為讀者介紹兩款比較實用的串口(UART)擴展晶片,一種是SPI轉UART,一種是USB轉UART,都是一分四的。
  • cdn助力專題及常見問題 - CSDN
    本次騰訊雲大學大咖分享《騰訊雲計算人才加速計劃》專題之《CDN邊緣智能助力5G》邀請騰訊雲專家工程師 廖龍 將與大家共探技術與產業發展變化下如何引領時代。本課程主要有三章:5G元年,探索與思考,未來展望。5G元年在過去十年,整個中國網際網路的發展迅速。
  • android啟動頁設計專題及常見問題 - CSDN
    轉載請註明出處:http://blog.csdn.net/wangjihuanghun/article/details/63255144啟動頁幾乎成為了每個app的標配,有些商家在啟動頁中增加了開屏廣告以此帶來更多的收入。
  • t值判斷顯著性專題及常見問題 - CSDN
    提出問題  顯著性值p是一個很常見的事。比如我們在對比兩組或者是多組數據時,對於兩組而言,會做Two Sample T Test,然後給出一個p值,判斷兩者差異的顯著性。在ggplot2中,兩組數據對比時,我們常用的,就是boxplot,那麼,如何在作出兩組或者多組的boxplot的同時,標記出顯著性的數據呢?
  • 大屏可視化demo專題及常見問題 - CSDN
    (方法下面講)常規的大屏模板開發一般選擇直接讀取資料庫,通過js+圖表庫進行繪製,常見比如Echarts、Highchart等等,最終實現前端顯示效果。新建一張決策報表模板,新建數據集,用sql語句創建大屏所要用到數據集,作為圖表組件的數據來源,為了使模板能夠適應不同解析度的屏幕,我們要給模板設置一下自適應屬性下一步,常規操作就是將圖表組件拖拽到畫布上,調整布局,在右側圖表屬性中設置好圖表數據連接和圖表顏色、背景、邊框等自定義設置圖表屬性設置
  • slot vue 用法專題及常見問題 - CSDN
    可重用的模式組件總是被設計為可重用的,但是某些模式對於使用單個「普通」組件來實施是不切實際的,因為為了自定義它,需要的props 數量可能過多或者需要通過props傳遞大部分內容或其它組件。插槽可用包裹外部的HTML標籤或者組件,並允許其他HTML或組件放在具名插槽對應名稱的插槽上。對於的第一個例子,從簡單的東西開始:一個按鈕。
  • 門鎖低功耗WiFi方案_SKYLAB串口WiFi模塊
    門鎖低功耗WiFi方案_SKYLAB串口WiFi模塊2020年12月17日 18:21    ​智能家居的蓬勃發展,帶來的便利顯而易見,目前市場上的智能門鎖方案多種多樣,其中Zigbee、WiFi和藍牙是最常見的智能鎖協議方案。
  • qtreewidget選擇節點專題及常見問題 - CSDN
    現在需要將這些節點之間的虛線去掉,可採用兩種方式,一種是在代碼中添加控制項的樣式,另外一種是在qtcreator中直接設置樣式。 第一種:qtcreator中設置樣式: 右鍵該控制項,選擇change styleSheet…菜單,然後進入到樣式編輯界面,添加如下代碼: QTreeView::branch {image:none;}
  • java對接 物聯網專題及常見問題 - CSDN
    技術實現要素:本發明的目的是提供一種對接物聯網雲平臺的信息交互方法以及中間件系統,旨在解決現有技術中電信物聯網雲平臺設計難度高導致接入困難以及開發成本高的問題,實現對接物聯網雲平臺的信息交互,通過簡單的配置方式即可對接到業務平臺,降低開發成本。
  • 加載布局專題及常見問題 - CSDN
    對於上面代碼,指定了第二個參數 ViewGrouproot,當然你也可以設置為 null 值。
  • android app被殺原因專題及常見問題 - CSDN
    遍歷services,sr.startRequested為true表明這個服務已經啟動,當sr.serviceInfo.flags設置了ServiceInfo.FLAG_STOP_WITH_TASK標識時,會調用stopServiceLocked方法停止服務,如果調用了stopServiceLocked方法那麼這個服務就不會再重啟了。
  • python 預測股票專題及常見問題 - CSDN
    基於VAR算法的預測向量自回歸(VAR)模型就是非結構化的多方程模型,它的核心思想不考慮經濟理論,而直接考慮經濟變量時間時序之間的關係,避開了結構建模方法中需要對系統中每個內生變量關於所有內生變量滯後值函數建模的問題