日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          "); //-->

          博客專欄

          EEPW首頁(yè) > 博客 > 老宇哥帶你玩轉(zhuǎn) ESP32:04 串口玩起來(lái)是真方便

          老宇哥帶你玩轉(zhuǎn) ESP32:04 串口玩起來(lái)是真方便

          發(fā)布人:芯片之大家 時(shí)間:2023-07-06 來(lái)源:工程師 發(fā)布文章
          image.png


          今天我們來(lái)玩兒串口

          概述

          ESP32 芯片有3 個(gè) UART 接口,UART0,UART1,UART2,支持異步通信和 IrDA,通信速度最高可達(dá) 5Mbps,3 個(gè)接口可以被 DMA 或 CPU 直接訪問(wèn),3 個(gè)串口帶發(fā)送接收 FIFO,共享 1024*8bit 的 RAM,通過(guò)串口,我們可以非常方便的跟其它外設(shè)進(jìn)行通信或者打印數(shù)據(jù)。

          硬件
          image.png


          上圖是硬件參考設(shè)計(jì),我把默認(rèn)的串口標(biāo)注出來(lái)了,我們可以在Arduino的庫(kù)中看到默認(rèn)的引腳,如下圖:

          image.png


          image.png


          UART0 引腳直接在函數(shù)里面定義了,UART1、UART2使用宏定義,大家還記得我們?cè)贕PIO章節(jié)中說(shuō)的嗎,ESP32有GPIO矩陣,外設(shè)都可以隨意映射到絕大部分的引腳,比如我們想把UART2的引腳改變到GPIO26 GPIO27這兩個(gè)上,我們直接調(diào)用相關(guān)函數(shù)就行了,這些都是可以實(shí)現(xiàn)的,硬件上非常靈活。

          U0TXD 線上需串聯(lián) 499 ? 電阻用于抑制 80 MHz 諧波。ESP32 UART 串口電路如下圖所示:

          image.png


          這里還需要注意下,UART1的默認(rèn)引腳為GPIO9,、GPIO10,這兩個(gè)接口一般用于連接外部Flash,程序中默認(rèn)使用這兩個(gè)引腳的,所以我們?cè)谟玫臅r(shí)候一定記得改到別的IO口。

          軟件

          關(guān)于串口的一些概念,包括原理,波特率,停止位,奇偶校驗(yàn),流控等概念,這些概念非常基礎(chǔ),這里就不展開(kāi)篇幅說(shuō)了,需要的小伙伴自行了解,不同芯片,原理都是一樣的。

          我們講一下基礎(chǔ)的使用

          首先我們需要在setup()中對(duì)串口進(jìn)行初始化,非常簡(jiǎn)單,就一行代碼搞定:

          Serial.begin(115200);

          這里默認(rèn)是UART0的,將UART0波特率初始化為115200,其它參數(shù)都是默認(rèn)的,如果我們想將UART0的TX RX改一下呢,我們看下面:

          Serial.begin(115200,SERIAL_8N1,26,27);

          通過(guò)上面的函數(shù),我們就把RX改到了26,TX改到了27,第一個(gè)參數(shù)為波特率設(shè)置,如果輸入0就會(huì)自動(dòng)監(jiān)測(cè)波特率,第二個(gè)為串口配置參數(shù),SERIAL_8N1為8位數(shù)據(jù)位,無(wú)校驗(yàn)位,1位停止位的意思,還有其它參數(shù),大家可以自行到源碼中看看,加深印象。

          看到這里才體會(huì)到GPIO矩陣的妙處,硬件設(shè)計(jì)大大的簡(jiǎn)化??!

          關(guān)于串口的函數(shù),我們這里介紹幾個(gè)常用的,完整的可以在HardwareSerial類中看到。

          void begin(unsigned long baud, uint32_t config=SERIAL_8N1, int8_t rxPin=-1, int8_t txPin=-1, bool invert=false, unsigned long timeout_ms = 20000UL); //串口初始化void end();//失能串口void updateBaudRate(unsigned long baud);//重新設(shè)置波特率int available(void);//返回串口接收緩沖區(qū)中的數(shù)據(jù)int read(void);//返回串口接收緩沖區(qū)的一個(gè)字節(jié)的數(shù)據(jù),之后將緩沖區(qū)中的本字節(jié)刪除void flush(void);//等待串口收發(fā)數(shù)據(jù)完畢size_t write(uint8_t);//寫數(shù)據(jù)到TX緩沖區(qū)size_t setRxBufferSize(size_t);//設(shè)置接收緩沖區(qū)的大小

          這里只是簡(jiǎn)單展示幾個(gè)函數(shù),具體的用法有不懂的,或者想了解全部函數(shù)的,可以在arduino-esp32中打開(kāi)具體的庫(kù)看用法,只有這樣,大家才能深刻了解,老宇哥這里只是帶大家進(jìn)門。

          庫(kù)函數(shù)中有標(biāo)準(zhǔn)輸入輸出函數(shù),所以打印函數(shù)必不可少的了,我們常用的打印函數(shù)如下:

          Serial.print("芯片之家!"); //打印數(shù)據(jù)Serial.println("This is a uart0 demo!"); //打印并換行

          當(dāng)然,也可以各種格式化打印,大家可以自行嘗試!

          Serial.println(data) //從串行端口輸出數(shù)據(jù),跟隨一個(gè)回車(ASCII 13, 或 'r')和一個(gè)換行符(ASCII 10, 或 'n')。這個(gè)函數(shù)所取得的值與 Serial.print()一樣。Serial.println(b) //以十進(jìn)制形式輸出b的ASCII編碼值,并同時(shí)跟隨一個(gè)回車和換行符。Serial.println(b, DEC)// 以十進(jìn)制形式輸出b的ASCII編碼值,并同時(shí)跟隨一個(gè)回車和換行符。Serial.println(b, HEX) //以十六進(jìn)數(shù)據(jù)形式輸出b的ASCII編碼值,并同時(shí)跟隨一個(gè)回車和換行符。Serial.println(b, OCT)//以八進(jìn)數(shù)據(jù)形式輸出b的ASCII編碼值,并同時(shí)跟隨一個(gè)回車和換行符。Serial.println(b, BIN)//以二進(jìn)數(shù)據(jù)形式輸出b的ASCII編碼值,并同時(shí)跟隨一個(gè)回車和換行符。Serial.print(b, BYTE)//以單個(gè)字節(jié)輸出b,并同時(shí)跟隨一個(gè)回車和換行符。Serial.println(str)//如果 str是一個(gè)字符串或數(shù)組,輸出整個(gè) str的 ASCII編碼字符串。Serial.println()//僅輸出一個(gè)回車和換行符。

          完整程序1:

          void setup()
          {  Serial.begin(115200);
          } 
          void loop()
          {  Serial.print("芯片之家!"); 
            Serial.println("This is a uart0 demo!"); 
            delay(1000);
          }
          image.png


          完整程序2:

          int recData; //接收的數(shù)據(jù)
           void setup() {
            Serial.begin(115200); 
          } 
          void loop() {  // 收到什么發(fā)什么數(shù)據(jù)
            if (Serial.available() > 0) {    // 讀取一個(gè)字節(jié)
              recData = Serial.read();
              Serial.print("received: ");
              Serial.println(recData,HEX);
            }
          }
          image.png


          感謝大家,關(guān)于ESP32的學(xué)習(xí),希望大家Enjoy!您的 轉(zhuǎn)發(fā)點(diǎn)贊 就是我繼續(xù)創(chuàng)作的最佳動(dòng)力!


          *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



          關(guān)鍵詞: 芯片

          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉