Arduino软串口使用入门:SoftwareSerial库详解
Arduino软串口使用入门:SoftwareSerial库详解
软串口与SoftwareSerial库使用
在Arduino开发中,硬件串口(通常是0、1号引脚)常用于与计算机通信和程序下载。如果这些引脚被占用,就需要拔插线才能下载程序,非常不便。为了解决这个问题,可以使用软串口。
什么是软串口
软串口是通过软件模拟UART通信的方法,在Arduino平台上实现串口通信。它使用两个数字IO口代替硬件串口的RX、TX引脚,以解决串口不够用的问题。不同型号的Arduino开发板可用作软串口的引脚有所不同:
- Arduino Uno:除了0(RX)和1(TX)引脚外的任何引脚
- Arduino Mega:几乎所有引脚,但建议避开用于其他功能的特定引脚
- Arduino Nano:除了0(RX)和1(TX)外的任何引脚
- Arduino Leonardo:几乎任何引脚,包括多个模拟引脚
- Arduino Due:所有数字引脚和模拟引脚
- Arduino Micro:几乎任何引脚,包括多个模拟引脚
常用的软串口库
SoftwareSerial:这是Arduino IDE自带的软件串口库,允许用户选择任何数字引脚来模拟串口通信。但它有一定的限制,比如不能同时发送和接收数据,以及在高波特率下可能不够稳定。
AltSoftSerial:相对于SoftwareSerial来说,在特定的引脚上提供了更高的性能和稳定性。它使用定时器来实现更准确的时间控制,因此在高速通信时比SoftwareSerial表现得更好,但这也意味着它会占用特定的定时器资源。
NeoSWSerial:旨在解决SoftwareSerial的一些性能问题,特别是在高波特率上。它比SoftwareSerial占用更少的资源,并且可以在数据发送的同时接收数据。
特性/库 | SoftwareSerial | AltSoftSerial | NewSoftSerial |
---|---|---|---|
支持的硬件平台和芯片型号 | Arduino Uno、Mega等基于ATmega328P和ATmega2560芯片的开发板 | 包括ATtiny、ATmega、SAM3X8E等 | 支持更多开发板和芯片,包括ESP8266、ESP32、ATtiny等 |
可用的IO口数量和频率 | 两个IO口(RX和TX),最高115200bps | 多个IO口,最高31250bps | 多个IO口,最高38400bps |
稳定性和可靠性 | 在高速通信时可能出现数据丢失或错位 | 相对稳定可靠 | 相对稳定可靠 |
使用的方法和API | 方法和API比较类似于传统的Serial库 | 有自己独特的API和使用方法 | 方法和API比较类似于SoftwareSerial库 |
对于初学者来说,SoftwareSerial库已经足够使用。但需要注意,SoftwareSerial库最高只能支持两个IO口(RX和TX),即最多只能额外跟一个设备串口通信。即使使用了SoftwareSerial库,算上Arduino UNO自带的硬件串口,也只能同时跟两个设备串口通信。如果需要跟更多设备通信,建议使用Arduino Mega2560(它有四个硬件串口)或NewSoftSerial库。
SoftwareSerial库使用示例
首先需要在Arduino IDE中安装SoftwareSerial库。以Arduino Uno R3开发板为例,应用代码如下:
#include <SoftwareSerial.h> //引用库文件
SoftwareSerial Serial1(2, 3); // 定义软串口RX为2, TX为3和软串口对象Serial1
void setup() {
Serial1.begin(9600); // 初始化软串口,设置波特率为9600
}
void loop() {
if (Serial1.available()) {
char c = Serial1.read(); // 读取接收到的数据
Serial1.write(c); // 发送数据
}
}
这里可以将软串口定义为Serial1、Serial2、Serial3等,方便项目移植。例如,将Arduino UNO的代码转移到Arduino Mega2560上时,只需要删除掉SoftwareSerial相关的代码,然后重新接线即可。
以BLE低功耗蓝牙模块为例,软串口接线方式如下:
Arduino | BLE蓝牙模块 |
---|---|
2 (RX) | TX |
3 (TX) | RX |
3.3V | 3.3V |
GND | GND |
串口函数介绍
在使用软串口时,以下函数最为常用:
Serial1.begin(9600);
:初始化串行通信,并设置数据传输速率(波特率)。Serial1.read();
:从串行缓冲区读取接收到的第一个字节的数据。Serial1.write();
:通过串行端口发送数据。Serial1.available();
:查询串行缓冲区中可读取的字节数。Serial1.print();
:发送数据到串行端口,以ASCII字符形式。
这些函数的使用方法与硬件串口的Serial库基本相同,只是将Serial替换为SoftSerial对象(如Serial1)即可。