https://www.arduino.cn/forum.php?mod=viewthread&tid=47262&highlight=%E8%BD%AF%E4%B8%B2%E5%8F%A3
軟件模擬串口通信——SoftwareSerial庫的使用
除HardwareSerial外狡赐,Arduino還提供了SoftwareSerial類庫,它可以將你的其他數(shù)字引腳通過程序模擬成串口通信引腳火窒。
通常我們將Arduino UNO上自帶的串口稱為硬件串口确憨,而使用SoftwareSerial類庫模擬成的串口懂缕,稱為軟件模擬串口(簡稱軟串口)缸夹。
在Arduino UNO上莽使,提供了0(RX)、1(TX)一組硬件串口盒齿,可與外圍串口設(shè)備通信念逞,如果要連接更多的串口設(shè)備,可以使用軟串口边翁。
軟串口是由程序模擬實現(xiàn)的翎承,使用方法類似硬件串口,但有一定局限性:在Arduino UNO MEGA上部分引腳不能被作為軟串口接收引腳符匾,且軟串口接收引腳波特率建議不要超過57600叨咖。
SoftwareSerial類成員函數(shù)
軟串口類庫并非Arduino UNO核心類庫,因此使用前你需要先聲明包含SoftwareSerial.h頭文件啊胶。
其中定義的成員函數(shù)與硬件串口類似甸各,available()、begin()焰坪、read()趣倾、write()、print()某饰、println()儒恋、peek() 等用法相同,這里便不一一列舉黔漂。
此外軟串口后還有如下成員函數(shù):
SoftwareSerial()
SoftwareSerial類的構(gòu)造函數(shù)诫尽,通過它可指定軟串口RX、TX引腳炬守。
語法:
SoftwareSerial mySerial= SoftwareSerial(rxPin, txPin)
SoftwareSerial mySerial(rxPin, txPin)
參數(shù):
mySerial:用戶自定義軟件串口對象
rxPin:軟串口接收引腳
txPin:軟串口發(fā)送引腳
listen()
開啟軟串口監(jiān)聽狀態(tài)牧嫉。
Arduino UNO在同一時間僅能監(jiān)聽一個軟串口,當你需要監(jiān)聽某一軟串口時减途,需要該對象調(diào)用這個函數(shù)開啟監(jiān)聽功能酣藻。
語法:
mySerial.listen()
參數(shù):
mySerial:用戶自定義的軟件串口對象
返回值:
無
isListening()
監(jiān)測軟串口是否正在監(jiān)聽狀態(tài)。
語法:
mySerial.isListening()
參數(shù):
mySerial:用戶自定義的軟件串口對象
返回值:
Boolean型
True:正在監(jiān)聽
False:沒有監(jiān)聽
end()
停止監(jiān)聽軟串口观蜗。
語法:
mySerial. end()
參數(shù):
mySerial:用戶自定義的軟件串口對象
返回值:
Boolean型
True:關(guān)閉監(jiān)聽成功
False:關(guān)閉監(jiān)聽失敗
overflow()
檢測緩沖區(qū)是否溢出臊恋。
語法:
mySerial.overflow()
參數(shù):
mySerial:用戶自定義的軟件串口對象
返回值:
Boolean型
True:溢出
False:沒有溢出
建立軟串口通信
SoftwareSerial類庫是Arduino IDE默認提供的一個第三方類庫,和硬件串口不同墓捻,其聲明并沒有包含在Arduino核心庫中抖仅,因此要建立軟串口通信,首先需要聲明包含SoftwareSerial.h頭文件砖第,然后即可使用該類庫中的構(gòu)造函數(shù)撤卢,初始化一個軟串口實例。如:
SoftwareSerial mySerial(2, 3);
即是新建一個名為mySerial的軟串口梧兼,并將2號引腳作為RX端放吩,3號引腳作為TX端。完整示例如下:
/*
Arduino UNO軟串口通信
*/
#include
//實例化軟串口
SoftwareSerial mySerial(2, 3); // RX, TX
void setup()
{
Serial.begin(115200);
while (!Serial) {
}
Serial.println("Goodnight moon!");
mySerial.begin(9600);
mySerial.println("Hello, world?");
}
void loop()
{
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}
復制代碼
在實際使用中羽杰,你可能還會用到其他串口設(shè)備渡紫,如串口無線透傳模塊到推、串口傳感器等,只要是標準串口設(shè)備惕澎,其程序的編寫方法都基本相同莉测。
同時使用多個軟串口
當需要連接多個串口設(shè)備時,可以建立多個軟串口唧喉,但限于軟串口的實現(xiàn)原理捣卤,Arduino UNO只能同時監(jiān)聽一個軟串口,當存在多個軟串口設(shè)備時八孝,你需要使用listen() 函數(shù)指定需要監(jiān)聽的設(shè)備董朝。如程序中存在portOne、portTwo兩個軟串口對象時干跛,你欲監(jiān)聽portOne子姜,便需要使用portOne.listen() 語句,要切換監(jiān)聽port2驯鳖,便使用portTwo.listen() 語句闲询。
示例程序如下:
/*
Arduino UNO軟串口通信
通過listen()切換監(jiān)聽軟串口
*/
#include
SoftwareSerial portOne(10, 11);
SoftwareSerial portTwo(8, 9);
void setup() {
Serial.begin(9600);
while (!Serial) {
}
portOne.begin(9600);
portTwo.begin(9600);
}
void loop() {
//監(jiān)聽1號軟串口
portOne.listen();
Serial.println("Data from port one:");
while (portOne.available() > 0) {
char inByte = portOne.read();
Serial.write(inByte);
}
Serial.println();
//監(jiān)聽2號軟串口
portTwo.listen();
Serial.println("Data from port two:");
while (portTwo.available() > 0) {
char inByte = portTwo.read();
Serial.write(inByte);
}
Serial.println();
}
復制代碼