将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串口通信方式的图:

将Arduino的数据通过串口发送给Nodemcu

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

步骤四 编写程序

发送端程序:

/*
  作者:趣讨教(qutaojiao.com)
  时间:2019 - 03 - 15
  描述:通过光敏电阻控制灯的亮灭
  引脚连接:
  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);
}

接收端程序:

步骤五 验证结果

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

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

给TA买糖
共{{data.count}}人
人已赞赏
Arduino

Arduino入门:数码管的动态使用

2019-3-10 9:54:09

Arduino

Arduino使用TLC5940 PWM 驱动LED

2019-3-19 1:16:01

4 条回复 A文章作者 M管理员
  1. […] 本文转自 趣讨教 […]

  2. 静水流深4134

    你好,我的发送端arduino没问题,但是esp8266就一直上传程序失败,esptool.py v3.0
    Serial port COM3
    Connecting…….._____….._____….._____….._____….._____….._____…..____Traceback (most recent call last):
    File “C:UsersHPAppDataLocalArduino15packagesesp8266hardwareesp82663.0.2/tools/upload.py”, line 66, in
    esptool.main(cmdline)
    File “C:/Users/HP/AppData/Local/Arduino15/packages/esp8266/hardware/esp8266/3.0.2/tools/esptoolesptool.py”, line 3552, in main
    esp.connect(args.before, args.connect_attempts)
    File “C:/Users/HP/AppData/Local/Arduino15/packages/esp8266/hardware/esp8266/3.0.2/tools/esptoolesptool.py”, line 529, in connect
    raise FatalError(‘Failed to connect to %s: %s’ % (self.CHIP_NAME, last_error))

    esptool.FatalError: Failed to connect to ESP8266: Timed out waiting for packet header
    请问这种情况应该怎么办?

    • Luca

      这种问题,一般是串口出现占用,或者端口出问题,重新拔插一下就好了

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索