目录
简介
单片机与电脑的串口通信我想谁都会,电脑打开串口监视器,就可以轻易地查看到单片机通过串口发送回来的信息。那么两个单片机之间怎么通信呢?接下来让我们来学习一下吧。下面将使用一个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
步骤四 编写程序
发送端程序:
/*
作者:趣讨教(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);
}
接收端程序:
步骤五 验证结果
左边是发送端,每发送完一次串口监视器打印一个OK。右边接收端显示发送端发过来的数据。
[…] 本文转自 趣讨教 […]
你好,我的发送端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
请问这种情况应该怎么办?
哦没事了,是我在烧录程序之前先接了线,所以串口被占用了
这种问题,一般是串口出现占用,或者端口出问题,重新拔插一下就好了