Arduino使用软串口通信

之前学习Arduino时没有接触过软串口,不过后来我买了一个Esp8266模块,在网上找的参考资料中给出的代码大部分都是Arduino使用软串口与Esp8266通信,但是我在使用的时候一直有问题,总是出现乱码。不清楚是不是我软串口用的有问题,所以就想好好把软串口看看,顺便写篇文章记录一下。在网上查资料找的资料中,参考文献1对软串口库中的函数进行了介绍,而参考文献2对软串口的原理进行了说明,还给了个示例用来展示软串口和串口之间的通信。
1、软串口和串口之间通信
本节参考参考文献2,使用数字引脚2、3模拟软串口,将这两个引脚与USB转TTL模块连接,然后接入电脑,然后Arduino也接入电脑,将下列代码下载到Arduino中,打开两个Arduino程序,分别监控不同的串口,这样就可以实现两个软串口之间的通信了。

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3);//RX=2,TX=3
void setup()
{
//硬件串口波特率
Serial.begin(4800);
//软件串口波特率
mySerial.begin(9600);
}
void loop()
{
//如果硬件串口有数据
if(Serial.available())
{
//从硬件串口读出一字节,写入软件串口
mySerial.write(Serial.read());
}
//如果软件串口有数据
if(mySerial.available())
{
//从软件串口读出一字节,写入硬件串口
Serial.write(mySerial.read());
}
}

实物连线图如下图所示:
Arduino使用软串口通信 - gc_2299 - gc_2299的博客
 
测试过程中发现,从高波特率的串口向低波特率的串口发送中文、英文、数字都没有问题,但是从低波特率的窗口向高波特率的串口只能发送英文、数字,发送中文的话,高波特率的窗口没法解析。这个没有去细究原因。
2、同时使用多个软串口
如果在一段程序中同时使用多个串口,就有一个谁先谁后的问题。Arduino示例代码中给出了同时使用两个软窗口的例子,如下所示,使用某个软串口之前,首先要调用该串口的listen()函数,然后再调用该串口的其它函数,数据处理完之后, 如果还要读取其它串口的数据,则调用其它串口的listen()函数进行切换:

#include <SoftwareSerial.h>
// software serial #1: TX = digital pin 10, RX = digital pin 11
SoftwareSerial portOne(10, 11);

// software serial #2: TX = digital pin 8, RX = digital pin 9
// on the Mega, use other pins instead, since 8 and 9 don't work on the Mega
SoftwareSerial portTwo(8, 9);

void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}


// Start each software serial port
portOne.begin(9600);
portTwo.begin(9600);
}

void loop() {
// By default, the last intialized port is listening.
// when you want to listen on a port, explicitly select it:
portOne.listen();
Serial.println("Data from port one:");
// while there is data coming in, read it
// and send to the hardware serial port:
while (portOne.available() > 0) {
char inByte = portOne.read();
Serial.write(inByte);
}

// blank line to separate data from the two ports:
Serial.println();

// Now listen on the second port
portTwo.listen();
// while there is data coming in, read it
// and send to the hardware serial port:
Serial.println("Data from port two:");
while (portTwo.available() > 0) {
char inByte = portTwo.read();
Serial.write(inByte);
}

// blank line to separate data from the two ports:
Serial.println();
}

3、默认软串口库的不足
参考文献1中介绍了Arduino默认的软串口库的一些不足,如下所示:
    • 如果有多少软串口,一次只有一个软串口能接收数据;
    • 不是所有Arduino产品的每个引脚都支持Change中断,要看每个Arduino产品具体有哪些引脚支持中断;
如果需要多个软串口同时处理数据,参考文献1中建议可以使用Paul Stoffregen的AltSoftSerial库。

参考文献
[1]http://www.plclive.com/a/tongxinjiekou/2016/0504/500.html
[2]http://www.carrotech.cn/?p=542
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页