我们都知道Arduino UNO板的数字IO端口为D0~D13,其中D0、D1还作为串口通信的接收(Rx)、发送(Tx)端口,当Arduino UNO板外接的串口通信模块超过一个时,怎么办?此外,我们调试程序时经常会用到串口显示语句Serial.print(),如果我们的模块占用了这个串口,就没法用Serial.print()语句来显示我们的测试数据了。Arduino UNO板解决这个问题的办法,就是用其它的IO端口来模拟串口通信,也就是我们通常称之为软串口(或模拟串口)。
一般采用微处理器芯片的单板机等,数字IO口的电平信号都是采用TTL电平标准的,即5V为1,0V为0。Arduino的数字IO口亦是采用TTL电平标准,它上面的硬件串口(D0、D1)采用的也是TTL标准的串行协议。因此我们就可以用其它的IO口来模拟硬件串口,即用软件程序将一个字节(BYTE)拆成8个位(bit),根据bit=1或0,依次按指定的频率用相应的高低电平串行发送,接收端读取到这些高低电平后,再将这些高低电平信号还原成1或0,然后还原成一个字节数据,也就是模拟硬件串口进行通信。
如果按上述的方法编程,那不是太麻烦了啊!幸好Arduino IDE里已经自带了一个softwareserial.h库,它让我们使用软串口编程与硬串口编程几乎一模一样。我们使用这个库可以将D2~D13的任何2个IO端口定义为软串口的接收(Rx)或发送(Tx)端口。可以创建多个SoftwareSerial对象,但是在给定时刻只能有一个活动。
下面说下如何在程序中使用softwareserial.h库。
(一)softwareserial.h库提供了一个SoftwareSerial类,当然我们首先要引用一下库,即:
#include<SoftwareSerial.h>
(二)接着自定义一个软串口SoftwareSerial类的实例对象:
SoftwareSerial mySerial(rxPin, txPin)
参数:
mySerial:用户自定义软串口对象名
rxPin:软串口接收引脚
txPin:软串口发送引脚
返回:
无
这里自定义软件串口对象的名,可以随便取,例如你可以取名为SS1或其他的,如果用D10作为接收端口,D11作为发送端口,则程序语句为:
SoftwareSerial SS1(10,11);
(三)接着我们要用begin来设置串行通信的速度(波特率):
mySerial.begin(speed)
参数:
speed:所需波特率。支持的波特率为:300、600、1200、2400、4800、9600、14400、19200、28800、31250、38400、57600。
返回:
无
(四)接下来我们就可以用available来检测接收缓冲区里是否有已经接收到的数据:
mySerial.available()
参数:
无
返回:
可读取的字节数
(五)然后就可以用read来读取接收引脚(rxPin)上接收到的字符,并且清除掉接收缓冲区中的第一个字节。请注意,一次只能有一个SoftwareSerial对象接收传入的数据(使用listen()函数选择哪个对象)。
(1)
mySerial.read()
参数:
无