arduino实现软串口通信

uno和nano主板软串口通信
uno和nano实现软串口通信

      最近不忙,闲来总结一下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的串口监视器中。以下就是测试代码的效果图:

 

  • 32
    点赞
  • 254
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值