将Arduino的数据通过串口发送给Nodemcu:单片机与单片机通信-转载

阅读次数: 758

  • A+
所属分类:建站
将Arduino的数据通过串口发送给Nodemcu:单片机与单片机通信-转载
将Arduino的数据通过串口发送给Nodemcu:单片机与单片机通信-转载

简介

单片机与电脑的串口通信我想谁都会,电脑打开串口监视器,就可以轻易地查看到单片机通过串口发送回来的信息。那么两个单片机之间怎么通信呢?接下来让我们来学习一下吧。下面将使用一个Arduino UNO R3和Nodemcu为例。两个Arduino的单片机通信同样适用。

步骤一 材料准备

硬件准备:

  • Arduino UNO*1
  • Nodemcu*1
  • 杜邦线若干
  • USB数据线两根

软件准备:

  • Arduino IDE

步骤二 原理说明

单片机通信方式分为好多种,有SPI,I2C,USART等等,通信方式分为两种:串行通信和并行通信。所谓串行通信就是一堆数据,被一个一个地传输,这时候看上去就像一个“串串”,所以叫串行通信,见图2。串行通信是一个大类,凡是数据被一个一个传输的都属于串行通信。像SPI,I2C,USART等等,它们都是将数据一个一个传输的,而区别仅仅在于一些细节上,但是从大的原理上讲他们都是属于串行通信。并行通信是和串行通信相区别的,并行通信就是一次同时传输多位数据,这些数据就像肩并肩一样被传输出去。从图2中可以看到,并行通信一次可以传输多位数据,而串行通行一次这能传输一位数据。下面的图是来自于网络的一张串行和并行的区别图:

将Arduino的数据通过串口发送给Nodemcu:单片机与单片机通信-转载

下面是这个教程使用的USART串口通信方式的图:

USART—,USART又叫串口通信,图所示就是USART的引脚连接方式。USART即没有时钟引脚,也没有片选引脚,所以这就决定了USART协议的两大特点:

1.由于没有时钟信号所以USART需要另外的方法来协调主机和从机之间的动作,即“设定波特率”;

2.由于没有片选引脚,USART只能单点对单点通信,不能1对多或者多对1

下面分别讲讲这两大特点:

波特率:波特率往往会和另一个概念“比特率”混淆,不过通常情况下两者数量上一致。在Arduino上通常不需要区分两者区别,为了简单起见我就简单地下个定义:在Arduino上,波特率就是比特率,即每秒发送的bit数量

USART的点对点通信:Arduino UNO只有一套串口通信接口,即一个TX一个RX,所以如果采用USART协议,Arduino同时只能和一个外设进行通信。不过有两点要说明:首先,Arduino是一个系列,它还有高端版本的版子可供选用,而这些高端版子拥有不止一套的USART串口,比如Arduino Mega。其次,Arduino UNO的的串口通信分为硬串口和软串口两种,什么意思呢?硬串口就是默认的Pin0为RX,Pin1为TX;不过你也可以自己定义哪一个Pin作为TX,哪一个Pin作为RX,这就是软串口。软串口的定义方法见下代码所示:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); //RX=2,TX=3

可见软串口的使用也需要通过“库”文件,不过这个库文件“Software.h”是Arduino自带的,不需要从网上下载,直接打命令就可以。上面的程序代码就是将Pin2作为RX,Pin3作为TX。

接下来的例程中,Arduino UNO作为发送端,将使用软串口的方式。

Nodemcu将作为接收端,使用硬串口。

步骤三 电路搭建

将Arduino的数据通过串口发送给Nodemcu:单片机与单片机通信-转载

连接方式:

  • Arduino 3 Pin——Nocemcu RX
  • Arduino 2 Pin——Nodemcu TX

步骤四 编写程序

发送端程序:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); //RX=2,TX=3

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
}

void loop() {
  char str[20] = "";
  int i = 0;
  char s[] = "www.qutaojiao.com"; //每隔3s发送一次字符数组s
  Serial.println("OK");
  mySerial.print(s);
  delay(3000);
}

接收端程序:

void setup() {
  Serial.begin(9600);
}
void loop() {
  char a[20] = ""; //定义字符数组,接受来自上位机的数据
  int i = 0;
  while (!Serial.available()); //等待数据传送过来,若没有数据,一直等待,即执行到本行不向下执行
  while (Serial.available()) //当发现缓存中有数据时,将数据送至字符数组a中
  {
    a[i] = Serial.read();
    i++;
    delay(3);
  }
  Serial.println(a);
  delay(2000);
}

步骤五 验证结果

将Arduino的数据通过串口发送给Nodemcu:单片机与单片机通信-转载

左边是发送端,每发送完一次串口监视器打印一个OK。右边接收端显示发送端发过来的数据。

本文转自 趣讨教

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: