怎么自己做三個一網站一份完整的營銷策劃書
Hi?(?o?)?, 各位深海王國的同志們,早上下午晚上凌晨好呀~辛勤工作的你今天也辛苦啦
(o゜▽゜)o☆ 今天大都督繼續(xù)為大家?guī)硐盗小W生都能玩的單片機!帶你一周內快速走進嵌入式的大門,let’s go!
(8)軟串口與SoftwareSerial庫使用
在第六節(jié)中我們提到了,如果我們Arduino開發(fā)板的0、1號引腳接線了,即硬件串口被占用了,想給Arduino下載程序,就需要先將0、1號引腳的線拔掉再下載,程序下載好以后才能接回去。
這樣操作確實是有點麻煩,所以這節(jié)我們來學習軟串口的使用,給Arduino開發(fā)板人為添加一個串口,以解決串口占用問題。
什么是軟串口:
在Arduino平臺上,軟件串口(軟串口)是通過軟件模擬UART通信的方法,軟串口在使用上跟硬串口一樣,只不過用兩個數字IO口代替RX、TX,以此來解決串口不夠用的問題。
Arduino系列 | 可用作軟串口的引腳 |
---|---|
Arduino Uno | 除了0(RX)和1(TX)引腳外的任何引腳 |
Arduino Mega | 幾乎所有引腳,但是建議避開用于其他功能的特定引腳,如10(SS), 11(MOSI), 12(MISO), 13(SCK) |
Arduino Nano | 除了0(RX)和1(TX)外的任何引腳 |
Arduino Leonardo | 幾乎任何引腳,包括多個模擬引腳 |
Arduino Due | 所有數字引腳和模擬引腳 |
Arduino Micro | 幾乎任何引腳,包括多個模擬引腳 |
常用的軟串口庫:
-
SoftwareSerial: 這是Arduino IDE自帶的軟件串口庫,也是最常用的軟軟件串口解決方案之一。它允許用戶選擇任何數字引腳來模擬串口通信。然而,這個庫有一定的限制,比如不能同時發(fā)送和接收數據,以及在高波特率下可能不夠穩(wěn)定。
-
AltSoftSerial: 這個庫相對于SoftwareSerial來說,在特定的引腳上提供了更高的性能和穩(wěn)定性,但是它限定了可以用作軟串口的引腳。它使用定時器來實現更準確的時間控制,因此在高速通信時比SoftwareSerial表現得更好,但這也意味著它會占用特定的定時器資源。
-
NeoSWSerial: 是另一種軟件串口解決方案,它旨在解決SoftwareSerial的一些性能問題,特別是在高波特率上。它比SoftwareSerial占用更少的資源,并且可以在數據發(fā)送的同時接收數據。
以下是一個表格,總結了SoftwareSerial庫、AltSoftSerial庫和NewSoftSerial庫的主要區(qū)別:
特性/庫 | SoftwareSerial | AltSoftSerial | NewSoftSerial |
---|---|---|---|
支持的硬件平臺和芯片型號 | Arduino Uno、Mega等基于ATmega328P和ATmega2560芯片的開發(fā)板 | 包括ATtiny、ATmega、SAM3X8E等 | 支持更多開發(fā)板和芯片,包括ESP8266、ESP32、ATtiny等 |
可用的IO口數量和頻率 | 兩個IO口(RX和TX),最高115200bps | 多個IO口,最高31250bps | 多個IO口,最高38400bps |
穩(wěn)定性和可靠性 | 在高速通信時可能出現數據丟失或錯位 | 相對穩(wěn)定可靠 | 相對穩(wěn)定可靠 |
使用的方法和API | 方法和API比較類似于傳統(tǒng)的Serial庫 | 有自己獨特的API和使用方法 | 方法和API比較類似于SoftwareSerial庫 |
總的來說,我們初學會用SoftwareSerial庫就夠啦,但一定要注意!
SoftwareSerial庫最高只能支持兩個IO口(RX和TX),也就是最多只能額外跟一個設備串口通信。
最多只能額外跟一個設備串口通信。!
最多只能額外跟一個設備串口通信。!
最多只能額外跟一個設備串口通信。!
這個很重要,也就是說即使我們使用了SoftwareSerial庫,算上Arduino UNO自帶的硬件串口,也只能同時跟兩個設備串口通信。
如果你需要跟更多設備通信,建議直接用Arduino Mega2560(后面會再介紹,它有四個硬件串口),或者使用NewSoftSerial庫(后面也會教大家)。
SoftwareSerial庫使用示例:
首先下載相應的庫文件: SoftwareSerial庫,下載庫的方法參考(5)最新版Arduino IDE第三方庫安裝
以arduino uno r3開發(fā)板為例,應用代碼如下:
#include <SoftwareSerial.h> //引用庫文件
SoftwareSerial Serial1(2, 3); // 定義軟串口RX為2, TX為3和軟串口對象Serial1
//其它操作就跟正常串口函數一樣了
//這些是常用的串口函數:
Serial1.begin(9600);
Serial1.read();
Serial1.write();
Serial1.available();
Serial1.print();
這里注意大家可以將軟串口定義為Serial1、Serial2、Serial3這樣,因為Arduino Mega2560的硬件串口就是這樣命名的,方便我們項目移植,將Arduino UNO的代碼轉移到Arduino Mega2560上,操作也很簡單,只用刪除掉這兩行代碼,然后換一下接線就行啦。
#include <SoftwareSerial.h> //引用庫文件
SoftwareSerial Serial1(2, 3); // 定義軟串口RX為2, TX為3和軟串口對象Serial1
以咱們深海王國APP系列的BLE低功耗藍牙為例,進行軟串口接線如下:
Arduino | BLE藍牙模塊 |
---|---|
2 (RX) | TX |
3 (TX) | RX |
3.3V | 3.3V |
GND | GND |
串口函數介紹:
-
Serial.begin(9600);
函數用于初始化串行通信,并設置數據傳輸速率(波特率)。在這個例子中,波特率被設置為9600比特/秒。 -
Serial.read();
函數用于從串行緩沖區(qū)讀取接收到的第一個字節(jié)的數據,然后該數據從緩沖區(qū)中刪除。如果緩沖區(qū)為空(即沒有數據可讀),這個函數將返回-1。該函數主要用于從另一設備接收數據。 -
Serial.write();
函數用于通過串行端口發(fā)送數據。它可以發(fā)送一個字節(jié)或一串字節(jié)(例如,一個字符串)。該函數返回寫入的字節(jié)數。例如,Serial1.write(‘A’);會發(fā)送字符’A’,而Serial1.write(“Hello, world”);會發(fā)送一個字符串。 -
Serial.available();
函數用于查詢串行緩沖區(qū)中可讀取的字節(jié)數,即檢查有多少個字節(jié)的數據可被read()函數讀取。在執(zhí)行讀取操作前檢查這個值非常有用,可避免在沒有數據可讀取時去讀取,從而降低出錯的風險。 -
Serial.print();
函數用于發(fā)送數據到串行端口,以ASCII字符形式。它可以發(fā)送多種類型的數據,包括數字、字符串和字符。例如,Serial.print(“Hello”);會將"Hello"字符串發(fā)送至串行端口。Serial.print(123);會將數字123以其對應的ASCII字符序列發(fā)送出去。不同于write()函數,print()在發(fā)送數字時會將其轉換為可讀的文本形式而不是原始的二進制或字節(jié)值。
今天的學習到這里就差不多啦,下節(jié)我們還會再了解一些做串口通訊時常見的問題,看到這里的你辛苦啦,加油?(ˊ?ˋ)??。
哈哈,讓焦慮不再蔓延,信息不再高壁,如果你覺得這篇文章對你有幫助,就來個免費的點贊吧!
(???????)?我深海大都督正式授予你深海王國公民的身份~
(?ω< )★ 加入深海大家庭,快樂擺爛每一天!