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

本文由網友投稿。

作者:陳顯達

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

原文鏈接:https://www.cnblogs.com/1996-Chinese-Chen/p/16826558.html

引言

在第一章博客中,我們講了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我們是可以使用的。

f08c4813ae4e80cb2f4156f549606203.png0ee5e8ca345c522b7b93efa4d9ba2030.png

我們如果需要使用ESP32的串口開發,在ESP的開發包里,官方給我們提供了一個HardwareSerial的一個串口庫,里面我們可以使用開發板上面的串口,同時將引腳指定為我們引腳圖上面的引腳。這個庫的位置為我們Arduino IDE目錄下的hardware/espressif/esp32/cores/esp32可以找到這個庫,這個文件夾下包含了一些ESP32的官方庫;使用這個HardwareSerial.h文件我們可以實現使用ESP32開發板上面的串口進行開發,接下來我們在代碼中去了解他如何使用。

62d6307b03de719e07bee7f67e37be47.png

編碼

在下面的代碼中,我們開始了一個簡單的一個串口通訊,在代碼第一行,是和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。

#include <HardwareSerial.h>
HardwareSerial MySerial1(1);
void setup() {// put your setup code here, to run once:MySerial1.begin(9600,SERIAL_8N1,16,17);MySerial1.onReceive(receiveEvent);Serial.begin(9600);
}void loop() {}
void receiveEvent()
{if(MySerial1.available()){String str= MySerial1.readString(); delay(1000);MySerial1.println("i am receive!!"+str);}delay(1000);
}

Stream包括了以下方法,其中繼承Stream的分別為串口,IIC通訊的Wire,SD卡的一個類,以及用于網絡連接的Ethernet類,都可以使用這些方法用來對數據進行操作。

f0788c7e8cddb75f9dc8817da4f012d9.png

c#編碼

C#方面的代碼則簡單很多,界面一個開啟串口的按鈕,一個發送數據的按鈕和文本框,以及用來接收數據顯示的文本框。

在代碼中我們開啟了串口,指定了打開的是哪一個串口,一些屬性是需要和ESP32那邊設置一樣的,在上面我們設置波特率為9600,數據為是8,停止位是1,校驗位是NONE,所以在c#這邊我們也需要這樣設置,不過校驗位默認是NONE的,所以此處我們沒有設置,然后開啟串口,注冊了一個接收到數據的一個回調,然后定義一個1024的字節數組,從串口讀取數據,返回讀取的數據長度,然后在對剛才定義的1024字節數組進行截取,然后通過UTF-8的格式轉為字符串,然后顯示到界面上的富文本框中,在發送按鈕事件中,我們從輸入框讀取數據轉為字節數組,然后將數據寫入到串口中去即可。

18c1fa4866c0811e448469550183dd2a.png
public partial class Form1 : Form{private SerialPort serialPort = new SerialPort("COM6");public Form1(){InitializeComponent();}private async void button1_Click(object sender, EventArgs e){serialPort.BaudRate = 9600;serialPort.StopBits = StopBits.One;serialPort.DataBits = 8;serialPort.Open();serialPort.DataReceived += (a, b) => {var serial = a as SerialPort;var data = new byte[1024];var res=serial.Read(data,0, data.Length);data = data[..res];string st = Encoding.UTF8.GetString(data); BeginInvoke(() => { richTextBox1.Text += st; });};}private void button2_Click(object sender, EventArgs e){var str = Encoding.UTF8.GetBytes(textBox1.Text);serialPort.Write(str, 0, str.Length);}}

接線圖

在此處的實例,我們需要準備一個USB轉TTL的模塊,四根母對母的杜邦線,在程序燒錄之后,我們需要將使用杜邦線讓USB轉TTL模塊和單片機進行連接,VCC或者5V接單片機的5V引腳,USB轉TTL的GND和單片機的GND相接,然后USB轉TTL的rxd引腳和單片機17引腳相接,txd引腳和單片機的16引腳相接,如下圖所示接線,5v不可和gnd接反,否則可能會燒壞模塊,確認接線無誤后,將USB轉TTL模塊插入電腦中,然后代碼中運行c#程序,電機開啟串口,隨后發送數據,可以接收到單片機的反饋。

0fdd60cf68e84281dadd7b53e981812d.pnga6cd6a953df755bf12ffd590ff0eb2ba.png

30d986224d172aaa3ba593412e479d46.png

14d91ca1c9e0024d060f16b69b058c6d.png

結語

串口通訊是物聯網中,必不可少的一種通訊方式,通常情況下都是RX接TX,TX接RX,除非是模塊廠商的規定,否則都是這樣接線,在后面的課程中,我會依次對IIC,以及PWM,還有SPI,以及中斷單獨做一個講解,歡迎大家關注,學習和探討,我會將我所知道的都會分享,同時,后面也會有STM32系列的教程。如果有感興趣的朋友,可以加QQ群一起來討論822084696。

c1004b34b9b3be0ea386f09d66d0f8d7.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281601.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281601.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281601.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux中使用yum的優點,linux – 自動“yum update”以保證服務器安全 – 優點和缺點?...

這取決于根據我使用CentOS的經驗,它非常安全,因為您只使用CentOS基本存儲庫.您是否應該偶爾嘗試更新失敗…是…在您應該期望出現故障的硬盤驅動器或偶爾出現故障的CPU的同一級別上.您永遠不會有太多備份. &#x1f642;關于自動更新的好處是,您可以比手動修補更快(因此更安全).…

高能力成熟度軟件企業中軟件質量工程師的職責

隨著科學技術的不斷發展進步&#xff0c;企業之間的競爭越來越激烈。軟件企業要想在競爭中發展生存&#xff0c;提高軟件產品質量已成為必要條件。在一些高能力成熟度軟件企業中&#xff0c;專門成立了質量保證和控制職能部門&#xff0c;起著提高項目管理透明性和確保軟件產品…

存儲過程和函數的區別

存儲過程和函數的區別存儲過程和函數目的是為了 可重復地 執行操作數據庫的sql語句的集合。區別是寫法和調用上。寫法上&#xff1a;存儲過程的參數列表可以有輸入參數、輸出參數、可輸入輸出的參數&#xff1b;函數的參數列表只有輸入參數&#xff0c;并且有return <返回值…

機器學習案例丨基于廣泛和深入的推薦 - 餐廳評級預測

點擊上方藍字關注我們&#xff08;本文閱讀時間&#xff1a;18分鐘&#xff09;Microsoft Azure Machine Learning Studio 是微軟強大的機器學習平臺&#xff0c;在設計器中&#xff0c;微軟內置了15個場景案例&#xff0c;但網上似乎沒有對這15個案例深度刨析的分析資料&#…

css linux 等寬字體,比例字體等寬字體

我們都知道等寬字體和比例字體的區別&#xff0c;就在于比例字體(Monospaced Font)即每個字母寬度是按一定比例自動調整的&#xff0c;而等寬字體(Proportional font)則是固定寬度&#xff0c;固定間距&#xff0c;字體的每一個字母和字符所占的水平空間都是相同的。比例字體&a…

三星智能家居系統頻繁故障 大批用戶受到影響

Shelley Powers正在她密蘇里州郊區的房子中鼾睡&#xff0c;突然警鈴大作將她驚醒&#xff0c;在仔細排查之后&#xff0c;發現是虛驚一場&#xff0c;是安全傳感器誤報。在此之后的幾周&#xff0c;她的三星Smart Things智能家居系統頻繁出現故障&#xff0c;比如設定的燈具不…

適用于 .NET 的開源文本差異對比組件

你好&#xff0c;這里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;實用的工具或組件&#xff0c;希望對您有用&#xff01;簡介對于開發人員來說&#xff0c;Git 是我們經常使用的工具&#xff0c;在每次編寫完代碼并提交后&#xff0c;我們可以通過 git dif…

MySQL—查詢某時間范圍的數據

-- 查詢今天的數據 select * from user where to_days(birthday) to_days(CURDATE()); -- 查詢昨天的數據 select * from user where to_days(CURDATE()) - to_days(birthday)<1; -- 查詢最近7天的數據 select * from user where birthday > DATE_SUB(CURDATE(),INTERVA…

box-shadow陰影合集

2019獨角獸企業重金招聘Python工程師標準>>> * box-shadow可以設置6個值。其中4個可選&#xff1b;2個必須指定&#xff1a;分別是x軸偏移量和y軸偏移量&#xff0c;這2個值可以是正值&#xff0c;可以是負值&#xff0c;也可以是0&#xff0c;但不可以省略不寫 陰影…

《數據科學R語言實踐:面向計算推理與問題求解的案例研究法》一一2.5 為跨年度的個人參賽選手構造記錄...

本節書摘來自華章計算機《數據科學R語言實踐&#xff1a;面向計算推理與問題求解的案例研究法》一書中的第2章&#xff0c;第2.5節,作者&#xff1a;[美] 德博拉諾蘭&#xff08;Deborah Nolan&#xff09;  鄧肯坦普朗&#xff08;Duncan Temple Lang&#xff09;  更多章…

基于 abp 微服務架構的開源低代碼平臺

你好&#xff0c;這里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;實用的工具或組件&#xff0c;希望對您有用&#xff01;簡介 ABP-MicroService是 一個基于ABP vNext微服務架構、vue-element-admin的后臺管理框架&#xff0c;適用于大型分布式業務系統和企…

linux android sdk gengxinman,Android 實現增量更新

一、概述增量更新相較于全量更新的好處不言而喻&#xff0c;利用差分算法獲得1.0版本到2.0版本的差分包&#xff0c;這樣在安裝了1.0的設備上只要下載這個差分包就能夠完成由1.0-2.0的更新。比如&#xff1a;存在一個1.0版本的apkapk1.png然后需要升級到2.0版本&#xff0c;而2…

(轉)yi_meng linux 下 ifcfg-eth0 配置 以及ifconfig、ifup、ifdown區別

linux 下 ifcfg-eth0 配置 以及ifconfig、ifup、ifdown區別 原文&#xff1a;https://www.cnblogs.com/yi-meng/p/3214471.html這3個命令的用途都是啟動網絡接口&#xff0c;不過&#xff0c;ifup與ifdown僅就 /etc/sysconfig/network- scripts內的ifcfg-ethx&#xff08;x為數…

Pycharm上Django的使用 Day8

2019獨角獸企業重金招聘Python工程師標準>>> 1.添加新條目 1>編寫用于添加新條目的表單 在forms.py中創建一個與模型Entry相關聯的表單 1處給字段text指定一個空標簽 2處定義小部件widgets,widgets是一個HTML表單元素 2>定義new_entry的URL模式 在用于添加新條…

物聯網創新領域的三大驅動性趨勢

從設備對接到區塊鏈&#xff0c;今天我們將介紹幾項物聯網開發者必須了解的最新技術趨勢。 物聯網正在快速改變著我們的工作與生活方式。過去十年以來&#xff0c;利用惟一IP地址實現聯網早已不是難事&#xff0c;但傳感器、處理器以及其它多種新興技術的涌現真正讓物聯網走向了…

TensorFlow.NET 實戰 -- 為.NET開發者開啟機器學習之旅

在IT技術飛速發展的今天&#xff0c;云計算、人工智能、大數據和云原生應用等新興技術的發展為我們帶來一波又一波的浪潮&#xff0c;也對軟件開發者提出了更高的要求&#xff0c;特別是人工智能開發領域&#xff0c;應運而生的新概念讓人目不暇接。作為一個.NET開發者的你&…

Arduino I/O Expansion Shield V7.1

介紹&#xff1a; 傳感器擴展板&#xff0c;目的是為初學者省去繁瑣的面包板接線和故障排除&#xff0c;專注實現自己的創意想法。 擴展板V7.1不僅保留老版本的所有優點&#xff0c;改善了它的易用性&#xff0c;更重要的是它兼容Arduino新一代主控器DUE。現在V7.1以其強大的擴…

展訊康一:2020年推出5G芯片 第一桶金含金量最高

工信部部長苗圩在全球5G大會上表示&#xff0c;5G網絡將2020年規模商用。對此&#xff0c;終端、芯片、網絡方面準備如何&#xff1f;國產自主芯片廠商展訊通信全球副總裁康一博士在接受搜狐科技專訪時透露&#xff0c;在5G方面&#xff0c;展訊投入較大&#xff0c;力爭在2018…

簡單的單臂路由的配置實驗 (思科)

實驗名稱&#xff1a;簡單的單臂路由的 配置實驗 &#xff08;思科&#xff09;實驗拓撲&#xff1a; 實驗需要&#xff1a;1、按圖中所示配置設網絡備vlan&#xff0c;IP地址2、能夠使各pc互相ping通。 實驗步驟&#xff1a; 1、配置終端設備&#xff1a;pc1-pc5按照拓撲圖中所…

C#實現生成Markdown文檔目錄樹

1前言&#xff08;昨天那篇排版有點問題&#xff0c;不能忍&#xff0c;今天重發&#xff01;&#xff09;之前我寫了一篇關于C#處理Markdown文檔的文章&#xff1a;C#解析Markdown文檔&#xff0c;實現替換圖片鏈接操作算是第一次嘗試使用C#處理Markdown文檔&#xff0c;然后最…