SoftwareSerial 库

SoftwareSerial 库允许在 Arduino 板的其他数字引脚上进行串行通信。

SoftwareSerial 库允许在 Arduino 板的其他数字引脚上进行串行通信,使用软件来复制该功能(因此得名“SoftwareSerial”)。可以拥有多个软件串行端口,速度最高可达 115200 bps。一个参数可以启用反向信号传输,以适应需要该协议的设备。

1.0 及以后版本中包含的 SoftwareSerial 库基于 Mikal Hart 的 NewSoftSerial 库

要使用此库:

 #include <SoftwareSerial.h>

此库的限制

SoftwareSerial 库有以下已知限制:

  • 它不能同时发送和接收数据。
  • 如果使用多个软件串行端口,一次只能有一个端口接收数据。
  • 并非 Mega 和 Mega 2560 板上的所有引脚都支持更改中断,因此只有以下引脚可以用于 RX:10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69)。并非 Leonardo 和 Micro 板上的所有引脚都支持更改中断,因此只有以下引脚可以用于 RX:8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI)。
  • 在 Arduino 或 Genuino 101 板上,当前最大 RX 速度为 57600bps。
  • 在 Arduino 或 Genuino 101 板上,RX 在数字引脚 13 上不起作用。

如果您的项目需要同时的数据流,请参阅 Paul Stoffregen 的 AltSoftSerial 库

示例

方法

SoftwareSerial()

创建一个 SoftwareSerial 对象的实例。可以创建多个 SoftwareSerial 对象,但在任意时刻只能有一个处于活动状态。

语法

 SoftwareSerial(rxPin, txPin, inverse_logic)

参数

  • rxPin:接收串行数据的引脚。
  • txPin:发送串行数据的引脚。
  • inverse\_logic:用于反转传入位的逻辑(默认是正常逻辑)。如果设置,SoftwareSerial 会将 RX 引脚上的低电平(通常为 0V)视为 1 位(空闲状态),将高电平(通常为 5V)视为 0 位。这也会影响它写入 TX 引脚的方式。默认值为 false。

返回

无。

示例

 #include <SoftwareSerial.h>
 
 const byte rxPin = 2;
 const byte txPin = 3;
 
 // 设置一个新的 SoftwareSerial 对象
 SoftwareSerial mySerial (rxPin, txPin);

另见

available()

获取软件串行端口中可供读取的字节(字符)数量。这些数据已经到达并存储在串行接收缓冲区中。

语法

 mySerial.available()

参数

无。

返回

可读取的字节数。

示例

 #include <SoftwareSerial.h>
 
 #define rxPin 10
 #define txPin 11
 
 // 设置一个新的 SoftwareSerial 对象
 SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
 
 void setup()  {
     // 定义 TX 和 RX 的引脚模式
     pinMode(rxPin, INPUT);
     pinMode(txPin, OUTPUT);
     
     // 设置 SoftwareSerial 对象的波特率
     mySerial.begin(9600);
 }
 
 void loop() {
     if (mySerial.available() > 0) {
         mySerial.read();
     }
 }

另见

begin()

设置串行通信的速度(波特率)。支持的波特率有:300、600、1200、2400、4800、9600、14400、19200、28800、31250、38400、57600 和 115200 波特。

语法

 mySerial.begin(speed)

参数

  • speed:所需的波特率(长整型)。支持的波特率有:300、600、1200、2400、4800、9600、14400、19200、28800、31250、38400、57600 和 115200 波特。

返回

无。

示例

 #include <SoftwareSerial.h>
 
 #define rxPin 10
 #define txPin 11
 
 // 设置一个新的 SoftwareSerial 对象
 SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
 
 void setup()  {
     // 定义 TX 和 RX 的引脚模式
     pinMode(rxPin, INPUT);
     pinMode(txPin, OUTPUT);
 
     // 设置 SoftwareSerial 对象的波特率
     mySerial.begin(9600);
 }
 
 void loop() {
     // ...
 }

另见

isListening()

测试所请求的软件串行对象是否正在主动监听。

语法

 mySerial.isListening()

参数

无。

返回

布尔值。

示例

 #include <SoftwareSerial.h>
 
 // 设置一个新的 SoftwareSerial 对象,RX 在数字引脚 10,TX 在数字引脚 11
 SoftwareSerial portOne(10, 11);
 
 void setup() {
     // 设置串行端口的波特率
     Serial.begin(9600);
 
     // 设置 SoftwareSerial 对象的波特率
     portOne.begin(9600);
 }
 
 void loop() {
     if (portOne.isListening()) { 
         Serial.println("portOne is listening!");
     }
 
     // ...

另见

overflow()

测试是否发生了 SoftwareSerial 缓冲区溢出。调用此函数会清除溢出标志,这意味着后续调用将返回 false,除非在此期间又接收到并丢弃了另一个字节的数据。SoftwareSerial 缓冲区最多可以容纳 64 个字节。

语法

 mySerial.overflow()

参数

无。

返回

布尔值。

示例

 #include <SoftwareSerial.h>
 
 // 设置一个新的 SoftwareSerial 对象,RX 在数字引脚 10,TX 在数字引脚 11
 SoftwareSerial portOne(10, 11);
 
 void setup() {
     // 设置串行端口的波特率
     Serial.begin(9600);
 
     // 设置 SoftwareSerial 对象的波特率
     portOne.begin(9600);
 }
 
 void loop() {
     if (portOne.overflow()) {
         Serial.println("portOne overflow!");
     }
 
     // ...

另见

peek()

返回在软件串行端口的 RX 引脚上接收到的字符。然而,与 read() 不同,后续对该函数的调用将返回相同的字符。请注意,一次只能有一个 SoftwareSerial 对象接收传入数据(使用 listen() 函数选择哪个对象)。

语法

 mySerial.peek()

参数

无。

返回

读取到的字符,如果没有可用的字符则返回 -1。

示例

 #include <SoftwareSerial.h>
 
 // 设置一个新的 SoftwareSerial 对象,RX 在数字引脚 10,TX 在数字引脚 11
 SoftwareSerial mySerial(10, 11);
 
 void setup() {
     // 设置 SoftwareSerial 对象的波特率
     mySerial.begin(9600);
 }
 
 void loop() {
     char c = mySerial.peek();
 }

另见

read()

返回在 SoftwareSerial 对象的 RX 引脚上接收到的字符。请注意,一次只能有一个 SoftwareSerial 对象接收传入数据(使用 listen() 函数选择哪个对象)。

语法

 mySerial.read()

参数

无。

返回

读取到的字符,如果没有可用的字符则返回 -1。

示例

 #include <SoftwareSerial.h>
 
 // 设置一个新的 SoftwareSerial 对象,RX 在数字引脚 10,TX 在数字引脚 11
 SoftwareSerial mySerial(10, 11);
 
 void setup() {
     // 设置 SoftwareSerial 对象的波特率
     mySerial.begin(9600);
 }
 
 void loop() {
     char c = mySerial.read();
 }

另见

print()

将数据打印到 SoftwareSerial 对象的发送引脚。其工作方式与 Serial.print() 函数相同。

语法

 mySerial.print(val)

参数

  • val:要打印的值。

返回

写入的字节数(读取此数字是可选的)。

示例

 #include <SoftwareSerial.h>
 
 // 设置一个新的 SoftwareSerial 对象,RX 在数字引脚 10,TX 在数字引脚 11
 SoftwareSerial mySerial(10, 11);
 
 int analogValue;
 
 void setup() {
     // 设置 SoftwareSerial 对象的波特率
     mySerial.begin(9600);
 }
 
 void loop() {
     // 读取引脚 A0 上的模拟值
     analogValue = analogRead(A0);
 
     // 以多种格式在串行监视器中打印 analogValue:
     mySerial.print(analogValue);         // 以 ASCII 编码的十进制打印
     mySerial.print("\t");                // 打印一个制表符
     mySerial.print(analogValue, DEC);    // 以 ASCII 编码的十进制打印
     mySerial.print("\t");                // 打印一个制表符
     mySerial.print(analogValue, HEX);    // 以 ASCII 编码的十六进制打印
     mySerial.print("\t");                // 打印一个制表符
     mySerial.print(analogValue, OCT);    // 以 ASCII 编码的八进制打印
     mySerial.print("\t");                // 打印一个制表符
     mySerial.print(analogValue, BIN);    // 以 ASCII 编码的二进制打印
     mySerial.print("\t");                // 打印一个制表符
     mySerial.print(analogValue/4, BYTE); // 以原始字节值打印(将值除以 4,因为 analogRead() 函数返回 0 到 1023 之间的数字,而字节只能容纳最多 255 的值)
 
     mySerial.print("\t");                // 打印一个制表符    
     mySerial.println();                  // 打印换行符
 
     // 在下一次读取前暂停 10 毫秒
     delay(10);
 }

另见

println()

将数据打印到 SoftwareSerial 对象的发送引脚,随后附加回车和换行符。其工作方式与 Serial.println() 函数相同。

语法

 mySerial.println(val)

参数

  • val:要打印的值。

返回

写入的字节数(读取此数字是可选的)。

示例

 #include <SoftwareSerial.h>
 
 // 设置一个新的 SoftwareSerial 对象,RX 在数字引脚 10,TX 在数字引脚 11
 SoftwareSerial mySerial(10, 11);
 
 int analogValue;
 
 void setup() {
     // 设置 SoftwareSerial 对象的波特率
     mySerial.begin(9600);
 }
 
 void loop() {
     // 读取引脚 A0 上的模拟值
     analogValue = analogRead(A0);
 
     // 以多种格式在串行监视器中打印 analogValue:
     mySerial.print(analogValue);         // 以 ASCII 编码的十进制打印
     mySerial.print("\t");                // 打印一个制表符
     mySerial.print(analogValue, DEC);    // 以 ASCII 编码的十进制打印
     mySerial.print("\t");                // 打印一个制表符
     mySerial.print(analogValue, HEX);    // 以 ASCII 编码的十六进制打印
     mySerial.print("\t");                // 打印一个制表符
     mySerial.print(analogValue, OCT);    // 以 ASCII 编码的八进制打印
     mySerial.print("\t");                // 打印一个制表符
     mySerial.print(analogValue, BIN);    // 以 ASCII 编码的二进制打印
     mySerial.print("\t");                // 打印一个制表符
     mySerial.print(analogValue/4, BYTE); // 以原始字节值打印(将值除以 4,因为 analogRead() 函数返回 0 到 1023 之间的数字,而字节只能容纳最多 255 的值)
 
     mySerial.print("\t");                // 打印一个制表符    
     mySerial.println();                  // 打印换行符
 
     // 在下一次读取前暂停 10 毫秒
     delay(10);
 }

另见

listen()

启用选定的 SoftwareSerial 对象进行监听。一次只能有一个 SoftwareSerial 对象进行监听;其他端口接收到的数据将被丢弃。在调用 listen() 函数期间,任何已接收的数据都将被丢弃(除非给定的实例已经在监听)。

语法

mySerial.listen()

参数

无。

返回

如果替换了另一个对象,则返回 true。

示例

#include <SoftwareSerial.h>

// 设置一个新的 SoftwareSerial 对象,RX 在数字引脚 10,TX 在数字引脚 11
SoftwareSerial portOne(10, 11);

// 设置一个新的 SoftwareSerial 对象,RX 在数字引脚 8,TX 在数字引脚 9
SoftwareSerial portTwo(8, 9);

void setup() {
    // 设置串行对象的波特率
    Serial.begin(9600);

    // 设置 SoftwareSerial 对象的波特率
    portOne.begin(9600);
    portTwo.begin(9600);
}

void loop() {
    // 启用 SoftwareSerial 对象进行监听
    portOne.listen();

    if (portOne.isListening()) {
        Serial.println("portOne is listening!");
    } else {
        Serial.println("portOne is not listening!");
    }

    if (portTwo.isListening()) {
        Serial.println("portTwo is listening!");
    } else {
        Serial.println("portTwo is not listening!");
    }
}

另见

write()

以原始字节的形式将数据打印到 SoftwareSerial 对象的发送引脚。其工作方式与 Serial.write() 函数相同。

语法

mySerial.write(val)

参数

  • val:要打印的二进制值。

返回

写入的字节数(读取此数字是可选的)。

示例

 #include <SoftwareSerial.h>
 
 // 设置一个新的 SoftwareSerial 对象,RX 在数字引脚 10,TX 在数字引脚 11
 SoftwareSerial mySerial(10, 11);
 
 void setup() {
     // 设置 SoftwareSerial 对象的波特率
     mySerial.begin(9600);
 }
 
 void loop() {
     // 发送一个值为 45 的字节
     mySerial.write(45);
 
     // 发送字符串“hello”并返回字符串的长度
     int bytesSent = mySerial.write("hello");
 }

另见

最后修改:2024 年 07 月 08 日
如果觉得我的文章对你有用,请随意赞赏