三 【單片機入門】應用層軟件開發的單片機學習之路-----UART串口通訊和c#交互

引言在第一章博客中,我們講了Arduino對Esp32的一個環境配置,以及了解到了常用的一個總線通訊協議,其中有SPI,IIC,UART等 , 今天我為大家帶來UART串口通訊和c#串口進行通訊的一個案例,以及什么是中斷,中斷的作用和實踐,話不多說,讓我們正式開始 。
UART在第一篇博客中,我們講了UART是需要一個接收一個發送的引腳,總共兩個,分別是TXD(發送引腳),RXD(接收引腳) , 不管是什么類型的單片機串口引腳都是這兩個,可能有的是少了最后面的那個D,但是都是一樣的東西,在ESP32的開發板上 , 是有三對UART的引腳的,也就是說板子上有三個串口可以供我們使用,如下圖,Serial0對應的引腳為1和3 , Serial1對應的引腳為9和10,Serial2對應的引腳為16和17,但是在我們燒錄的時候 , 1和3是不能使用的,因為我們通過USB將單片機連接到電腦上,使用的串口引腳就是1和3,所以我們可使用串口只有兩個,而Arduino IDE上面,對應的Serial也有四個靜態類 , 分別是Serial,Serial1和Serial2以及Serial3 。雖然他的數量和我們ESP32的串口數量是一樣,但是只有第一個可以使用,后面兩個我們是無法使用的,因為后面兩個對應的引腳和我們ESP32的引腳是不相同的,我們可以從下面第二個圖看到,Serial1,Serial2的 PINS是和我們ESP32的引腳是對不上的,所以我們在串口開發的時候是不使用這兩個,對于第一個Serial我們是可以使用的 。

三 【單片機入門】應用層軟件開發的單片機學習之路-----UART串口通訊和c#交互

文章插圖

三 【單片機入門】應用層軟件開發的單片機學習之路-----UART串口通訊和c#交互

文章插圖
我們如果需要使用ESP32的串口開發,在ESP的開發包里,官方給我們提供了一個HardwareSerial的一個串口庫,里面我們可以使用開發板上面的串口,同時將引腳指定為我們引腳圖上面的引腳 。這個庫的位置為我們Arduino IDE目錄下的hardware/espressif/esp32/cores/esp32可以找到這個庫 , 這個文件夾下包含了一些ESP32的官方庫;使用這個HardwareSerial.h文件我們可以實現使用ESP32開發板上面的串口進行開發,接下來我們在代碼中去了解他如何使用 。
三 【單片機入門】應用層軟件開發的單片機學習之路-----UART串口通訊和c#交互

文章插圖
編碼在下面的代碼中,我們開始了一個簡單的一個串口通訊,在代碼第一行,是和c語言一樣引入我們需要的庫文件,然后在第二行,定義了HardwareSerial這個類的一個MySerial1對象 , 里面的構造函數的值是1代表著,我們將使用第一個串口,在下面的setup里面,我們開始啟動了MySerial1這個串口對象,啟動的波特率是9600,數據長度是8,校驗位是NONE,停止位是1,以及串口的rx的引腳是16 , tx的引腳為17 。在下一行代碼 , 我們傳入了一個我們下方定義的receiveEvent的一個方法,這個方法用來接收串口接收數據的一個回調,將我們這個方法指針傳入進去,在串口接收到數據之后,會進入到我們這個方法中 。
最后一行代碼,我們是啟用了第0個串口,波特率是9600 。
可能上面的代碼有朋友就有疑惑了,明明16和17在引腳圖中定義的串口是2,為什么這里定義的是1呢,實際上這個我們可以自己修改這個串口的定義和引腳,這個構造函數傳入的參數取值范圍為0 , 1,2,對應的是我們開發板上的三個UART串口,在begin哪里傳入的引腳和這個0,1,2是沒有任何關系的,但是這個傳入的引腳必須是開發板上三個UART串口之一,所以我們也可以定義為MySerial2.begin(9600,SERIAL_8N1,10,9);這里的0,1,2僅對應有三對串口 , 不指定對應的引腳,在begin方法我們指定對應的串口的引腳 。
在下面的接收到串口消息的回調中,我們第一行代碼調用了available這個方法,這個方法返回的是一個int參數 , 當然了我們這塊也可以寫available()>0 , 也是可以的,這個方法是從串口緩存中讀取我們接收到的數據長度 , 這個條件成立,說明我們是有接收到數據 , 然后在里面我們開始去讀取數據 。
在所有的Serial都是及程序Arduino的一個Stream的一個基礎類,這個類提供了一些我們對數據處理的一個方法,所以在下面的代碼中,我們將讀取的數據轉為字符串 , 然后將代碼延遲暫停了一秒,隨后,我們使用我們的串口對象,將接收到的數據寫入緩沖區,緩沖區會把我們寫入的數據 , 在發送出去,即將println里面傳入的參數發送到我們的串口發送方,誰發的數據 , 誰就會收到"i am receive!!"+str 。

推薦閱讀