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

2021-01-10 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類的實例化,實例化過程中傳入了串口號,實現過程如下:

相關焦點

  • arduino 低功耗模式專題及常見問題 - CSDN
    藍牙4.0是協議,4.0是協議版本號,藍牙4.0是2010年6月由SIG(Special Interest Group)發布的藍牙標準,它有2種模式:BLE(Bluetooth low energy)只能與4.0協議設備通信,適應節能且僅收發少量數據的設備(如家用電子);BR/EDR(Basic Rate / Enhanced Data Rate),向下兼容
  • 萬能超的arduino學習日記(一)
    //設計LED初始亮度參數void setup() {  pinMode(2, INPUT_PULLUP); //將引腳2設置為輸入上拉模式  pinMode(8, INPUT_PULLUP); //將引腳8設置為輸入上拉模式  pinMode(ledPin, OUTPUT);  //將LED引腳設置為輸出模式
  • Arduino的串口通訊函數
    void setup() {Serial.begin(9600); }void loop() { Serial.print("Hello World"); delay(1000);}程序中 函數Serial.begin(9600)是設置串口通訊的波特率為9600;函數Serial.print("Hello World")是單片機的發送端向電腦發送引號之內的數據
  • 樂創物聯物聯網架構之硬體層中間件Arduino 串口通信
    本節就來講感知層下硬體層中間件Arduino 串口通信。感知層是物聯網最基礎的部分,就像人的五官一樣去感受世界。1 Arduino 串口通信簡介Arduino需要和其他設備之間進行通信(例如PC、藍牙、WiFi等),而最常見最簡單的方式就是串口通信。
  • 一文看懂arduino驅動uln2003操作步進電機的方法
    「IN0~IN4」連接arduino的4個數字口(在代碼裡進行相應的設置)。   3、28BYJ-48步進電機的齒輪減速比為64:1,轉速約15轉/分鐘,一些軟體採用某些手段和高電壓電源(如12伏直流)也能達到約25轉/分鐘的轉速。   4步控制信號序列:11.25度/步,32步旋轉一周。   8步控制信號序列:5.625度/步, 64步旋轉一周。
  • 機房常見的串口伺服器有哪些?它的作用是?
    3.對於RS232接口,PC機的一個串口只能夠接一臺串口設備,如果需要連接多個設備,原來的串口方案將不易於擴展,而網絡則沒有該問題。   由於以上原因,需要將設備連接到網絡上。但是已經有成千上萬原有的串口設備已存在,對這些設備的大批量改造顯然不是一蹴而就的,這樣作為暫時的解決方案——將串口轉化為網口的串口聯網伺服器就應運而生了。
  • python3腳本篇1-串口通訊腳本
    前言本文我們來學習Python軟體包pyserial的使用,硬體採用wemos D1開發板,直接燒錄串口章節代碼即可,本文主要編寫PC端Python腳本,完成腳本和外接串口設備通訊的功能。一、基礎知識1.pyserial簡介:pyserial模塊是python和串口設備通訊的package,串口是計算機上比較通用的通訊協議,串口設備通過USB插入電腦,python通過pyserial模塊就可以完成和串口設備的通訊,
  • arduino定位專題及常見問題 - CSDN
  • 卡方檢驗結果分析專題及常見問題 - CSDN
    簡單統計之後,得到總數和死亡率:此處需要使用到ggbarstats函數,其參數可謂是非常的多,詳細的參數表我放在另一個博客中了,有興趣的朋友可以去看看(https://blog.csdn.net/m0_45248682/article/details/104086729)。
  • Arduino教程┃模擬土壤溼度傳感器的介紹
    它是一個模擬輸入模塊,可以實現土壤溼度的檢測,有DO、AO兩種模式。注意不同土壤介質的測量值會存在差異,土壤中的水分存在分布不均勻的情況,數據僅能代表局部溼度。點擊下面的連結觀看視頻了解詳細情況。寬x高) ;2.工作電壓3.3V-5V;3.設有固定螺栓孔,方便安裝;4、靈敏度調節電位器:模塊中藍色的電位器是用於土壤溼度的閥值調節,順時針調節,控制的溼度會越大,逆時針越小;通過電位器調節土壤溼度控制閥值,溼度低於設定值時,DO輸出高電平,高於設定值時,DO輸出低電平;可以實現自動對菜園,花園自動澆水,家庭花盆土壤溼度的控制,各種電子比賽,電子積木,arduino
  • f檢驗 matlab專題及常見問題 - CSDN
    15.71985 15.91986 15.71987 16.71988 15.31989 16.11990 16.2MATLAB實現參考網上多個代碼可得https://www.ilovematlab.cn/thread-246993-1-1.htmlhttps://blog.csdn.net
  • STM32 串口功能 庫函數 詳解和DMA 串口高級運用(轉載)
    注意Print函數時間問題,嘗試通過DMA解決。特點:全雙工,異步,分數波特率發生器好處是速度快,位數8或9為,可配置1或2停止位,Lin協議,可提供同步時鐘功能。硬體上一般2個腳,RX和TX;同步模式需要SCLK時鐘腳,紅外IRDA需要irDA_RDI腳作為數據輸入和irDA_TDO輸出。
  • 基於樹莓派的多串口多總線伺服器設計
    引言本文引用地址:http://www.eepw.com.cn/article/201609/304386.htm工業控制中,各設備的信號採集和監控只靠串口總線難以實現擴展,要將現場控制網絡和信息網絡相連,就需要解決串口通信協議和網際網路通信協議的轉換問題,即把原有設備轉換為具備網絡接口的外設,這樣可以將傳統串行鏈路上的數據傳輸到信息網絡上,而無需更換原有設備。
  • 串口伺服器工作原理?艾銻科普
    串口伺服器動態域名配置方法1、進入管理菜單,選擇「G」進入「G-全局網絡配置」,設置好設備的網關地址(應該為ADSL或有效網關的內網IP位址)和DNS伺服器IP位址。2、選擇「W」進入「W-切換工作模式。」,切換設備為「2-Client模式」。
  • 一發不可收出自_stm32串口一發一接收 - CSDN
    5 個 Android 開發中比較常見的內存洩漏問題及解決辦法 - Android - 掘金在Android開發中,內存洩漏是比較常見的問題,有過一些Android編程經歷的童鞋應該都遇到過,但為什麼會出現內存洩漏呢?內存洩漏又有什麼影響呢? 在Android程序開發中,當一個對象已經不需要再使用了,本該被回收時,而另外一個正在使用的對象持有它...
  • 一分四串口UART擴展晶片的特性
    矛盾的是,CPU通常不會有那麼多串口,所以這個時候就需要通過合適的方式進行串口擴展,或者通過Local Bus,或者SPI,或者USB接口。在本文中我想為讀者介紹兩款比較實用的串口(UART)擴展晶片,一種是SPI轉UART,一種是USB轉UART,都是一分四的。
  • pc端的rem布局專題及常見問題 - CSDN
    子元素的float、clear和vertical-align屬性將失效flex布局又叫伸縮布局、彈性布局、伸縮布局、彈性盒子布局採用flex布局的元素稱為flex容器(flex container)簡稱容器,它的所有子元素自動成為容器成員,稱為(flex item)「項目」總之:就是通過給父盒子添加flex屬性,來控制盒子的位置和排列方式父項常見屬性
  • Arduino+Processing模擬雷達掃描效果教程
    圖4 Processing備註:1、上述軟體版本是我自己調試成功的版本,略低版本可能會有兼容問題,請注意你的軟體版本號;2、如果Processing的程序編輯器內不能輸入、顯示中文,請在「文件圖6 裝載中文字庫四、編寫程序程序分兩步實現:第一步:使用Arduino IDE,編寫伺服電機180度循環搖頭、獲取超聲波傳感器返回值(與障礙物的距離值)、向串口輸出伺服電機轉動的角度和超聲波傳感器的距離值
  • 【實例】如何用串口軟體調試變頻器?
    串口調試助手界面介紹 在通信之前我們要先設置變頻器的參數。需要設置的參數如下: 變頻器參數設置 變頻器參數設置完後記得要重啟變頻器哦。 然後接上我們的線就可以通訊啦!串口調試軟體這邊的通信參數要設置成和變頻器一樣。
  • Arduino使用光敏電阻實驗
    在生活中,光控燈很常見,有些燈白天不亮,到晚上時就會自動亮。今天我來用光敏電阻加arduino板子來實現光控燈。 工具/原料 arduino板子 光敏電阻 電阻 LED燈 麵包板 程序也不難,將引腳設置好,然後讀取光明電阻所街模擬口的模擬量,設定一個值,當達到這個值時,LED燈滅,否則熄滅(給高地電平即可)。