- A+

简介
单片机与电脑的串口通信我想谁都会,电脑打开串口监视器,就可以轻易地查看到单片机通过串口发送回来的信息。那么两个单片机之间怎么通信呢?接下来让我们来学习一下吧。下面将使用一个Arduino UNO R3和Nodemcu为例。两个Arduino的单片机通信同样适用。
步骤一 材料准备
硬件准备:
- Arduino UNO*1
- Nodemcu*1
- 杜邦线若干
- USB数据线两根
软件准备:
- Arduino IDE
步骤二 原理说明
单片机通信方式分为好多种,有SPI,I2C,USART等等,通信方式分为两种:串行通信和并行通信。所谓串行通信就是一堆数据,被一个一个地传输,这时候看上去就像一个“串串”,所以叫串行通信,见图2。串行通信是一个大类,凡是数据被一个一个传输的都属于串行通信。像SPI,I2C,USART等等,它们都是将数据一个一个传输的,而区别仅仅在于一些细节上,但是从大的原理上讲他们都是属于串行通信。并行通信是和串行通信相区别的,并行通信就是一次同时传输多位数据,这些数据就像肩并肩一样被传输出去。从图2中可以看到,并行通信一次可以传输多位数据,而串行通行一次这能传输一位数据。下面的图是来自于网络的一张串行和并行的区别图:

下面是这个教程使用的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 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);
}
步骤五 验证结果

左边是发送端,每发送完一次串口监视器打印一个OK。右边接收端显示发送端发过来的数据。
本文转自 趣讨教
- 我的微信
- 这是我的微信扫一扫
-
- 我的微信公众号
- 我的微信公众号扫一扫
-