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 对象,但在任意时刻只能有一个处于活动状态。
语法
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);
}
另见
- SoftwareSerial()
- available()
- begin()
- isListening()
- overflow()
- peek()
- read()
- print()
- println()
- listen()
- write()
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");
}
1 条评论
[...]Arduino 环境可以通过使用库来扩展,就像大多数编程平台一样。库为草图提供了额外的功能,例如与硬件交互或数据处理。要在草图中使用库,请从 Sketch > Import Library 选择它。一些库已随 IDE 安装,但您也可以下载或创建自己的库。有关安装库的详细信息,请参阅这些说明。还有一个编写自己库的教程。有关为您的库制作良好的 Arduino 风格 API 的信息,请参阅API [...]