![uno和nano主板软串口通信](https://i-blog.csdnimg.cn/blog_migrate/c01dae2d05f96cf7f9e5aa725cac5983.jpeg)
最近不忙,闲来总结一下arduino板之间是如何通过软串口实现通信的。在之前不懂的情况下也做过类似的查阅文档和网上研究,基本靠拿来主义得到的都是硬串口和软串口之间通信,要么就是简单介绍软串口通信的基础知识,很少或基本看不到软串口之间的通信资料,今天我就向大家详细介绍下软串口之间是怎么通信的,整个文章思路起源于《arduino程序设计基础》的某篇通信理论为基础,在此进行的知识拓展。
软串口就是用程序模拟硬串口实现通信的功能,可以在arduino主板的引脚进行模拟实现。现在,我的实验需要两台电脑,通过USB接口连接各自arduino主板,实现硬串口连接,另外,利用uno板上的2,3引脚和nano板上的d5,d6引脚交叉对联实现软串口通信。这里给没基础的爱好者们先上一张串口对联示意图:
tx:就是发送端;rx:就是接收端;gnd:共地。两两交叉对联。下面我直接贴代码跟大伙交流交流:下面是nano的主程序:
/*
* Serial =======computer
* softSerial ======nano Serial1
*/
#include<SoftwareSerial.h>
//新建一个softSerial对象,rx:6,tx:5
SoftwareSerial softSerial1(6,5);
void setup() {
// 初始化串口通信:
Serial.begin(9600);
//初始化软串口通信;
softSerial1.begin(9600);
//监听软串口通信
softSerial1.listen();
}
// 两个字符串分别用于存储A、B两端传来的数据:
String device_B_String="";
String device_A_String="";
void loop() {
// 读取从计算机传入的数据,并通过serial1发送个设备B:
if(Serial.available()>0)
{
if(Serial.peek()!='\n') //在没接收到回车换行的条件下
{
device_B_String+=(char)Serial.read(); //这段代码是在把字符串联成字符串
}
else
{ //这段代码实现从缓冲区读取数据,并将数据发送到计算机显示和软串口发送;
Serial.read();
Serial.print("you said:");
Serial.println(device_B_String);
softSerial1.println(device_B_String);
device_B_String="";
}
}
//读取从设备A传入的数据,并在串口监视器中显示
if(softSerial1.available()>0)
{
if(softSerial1.peek()!='\n')
{
device_A_String+=(char)softSerial1.read();
}
else
{
softSerial1.read();
Serial.print("device A said:");
Serial.println(device_A_String);
device_A_String="";
}
}
}
下面是uno主程序:
/*
* arduino uno端程序
* 串口使用情况
serial -----computer
serial1----- nano softwearserial
*/
#include<SoftwareSerial.h>
SoftwareSerial softSerial(3,2);
void setup() {
//初始化serial,该串口用于与计算机连接通信:
Serial.begin(9600);
//初始化serial1,该串口用于与设备B连接通信;
softSerial.begin(9600);
softSerial.listen();
}
//两个字符串分别用于存储A,B两端传来的数据
String device_A_String="";
String device_B_String="";
void loop() {
// 读取从计算机传入的数据,并通过softSerial发送个设备B:
if(Serial.available()>0)
{
if(Serial.peek()!='\n')
{
device_A_String+=(char)Serial.read();
}
else
{
Serial.read();
Serial.print("you said:");
Serial.println(device_A_String);
softSerial.println(device_A_String);
device_A_String="";
}
}
//读取从设备B传入的数据,并在串口监视器中显示
if(softSerial.available()>0)
{
if(softSerial.peek()!='\n')
{
device_B_String+=(char)softSerial.read();
}
else
{
softSerial.read();
Serial.print("device B said:");
Serial.println(device_B_String);
device_B_String="";
}
}
}
以上两段代码主要实现发送信息和接收信息功能。在不能实现接收数据的常见问题主要有:1,检查USB硬串口是否连接正常;2,软串口各引脚连接是否正常,(我曾遇到自己把引脚线插错到A2,A3导致无法通信)。
其实实现的原理很简单:在计算机A中打开arduinoIDE的串口监视器,随意输入字母或数字,点击发送,计算机A通过硬串口把内容发送到与该计算机连接的arduino主板串口中,主板将发送信息存储到变量中,再通过arduino板的软串口发送到另一arduino板的软串口接收,并存储到接收端变量中,再通过接收端的硬串口输出接收到的信息到计算机B的串口监视器中。以下就是测试代码的效果图: