hanreng 发表于 2020-8-21 09:54:51

Arduinio Uno,Nano,ESP8266,ESP32控制器之间的串口通信

本帖最后由 hanreng 于 2020-8-21 10:34 编辑

Arduinio Uno,Nano,ESP8266,ESP32控制器之间的串口通信


串行通信的介绍
串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。使用串口通信时,发送和接收到的每一个字符实际上都是一次一位传送的,每一位为1或者为0.这就好像大家在电视里看到的通过敲门声的长短能够表达一些复杂的信息一样,这里敲门声的长短就相当于信号0或者1,只要双方约定好,就能够通过这种长短的变化表达固定的信息。在串行通信中, “双方约定好”这一点很重要,因为从实质上来说,通信的信号就是一堆0和1的数字,如果没有约定好这些0、1数字组合所代表的意义,那么双方不可能知道对方所发送信息的含义,就好像如果两个人交谈时使用不同的语言,那么他们的交谈是没有任何意义的。
串行通信的约定
串行通信中的这种约定包含两个方面,一方面是通信的速率要保持一致,另一方面是字符的编码要一致。
波特率
通信速率是指单位时间内传输的信息量,可用比特率和波特率来表示。比特率是指每秒传输的二进制位数,用bps (bits)表示。波特率是指每秒传输的符号数,若每个符号所含的信息量为1比特,则波特率等于比特率。在电子学中,一个符号的含义为高电平或低电平,它们分别代表"1"和"0",所以 ,每个符号所含的信息量刚好为1比特,因此常将比特率称为波特率,即:1波特(B) =1比特(bit) =1位/秒(1bps)常用的波特率有:110,300,600, 1200,2400,4800,9600, 19200,38400,115200等最常用的是9600。
ASCII码
ASCII码是由美国国家标准学会(American National StandardInstitute , ANSI)制定的,其英文全称是AmericanStandard Code for Information Interchange,它是现今最通用的单字节编码系统,主要是为了解决大家在串行通信中的信息一致性问题。在Arduino中也采用这种字符编码方式。在计算机中,所有的数据在存储和运算时都用0或者1来表示,像a,b,c,d这样的字母(包括大写共52个);以及0、1等数字还有一些常用的符号(*、#、@等)在计算机中都要使用0或1来表示,而具体用哪些0、1组合表示哪个符号,每个人都可以约定自己的一套定义(这个定义就叫编码),只要双方的编码一致就可以通信了。而要想让更多人互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了所谓的ASCI1编码,统一规定了上述常用符号用哪些0、1的组合来表示.ASCII是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。
标准的ASCII码
ASCII码使用指定的7 bit或8 bit数据组合来表示128或256种可能的字符。标准 ,ASCI码使用7bit数据来表示所有的大写和小写字母、数字0到9、标点符号,以及在美式英语中使用的特殊控制字符。其中0~31及127 (共33个)是控制字符或通信专用字符,如: LF (换行)、CR (回车)、FF (换页)、 DEL (删除)、BS (退格), BEL (响铃)等;通信专用字符包括: SOH (文头)、EOT (文尾)、ACK (确认)等;ASCII值为8、9、10和13分别转换为退格、制表、换行和回车字符。这些字符并没有特定的图形显示,但会依不同的应用程序,而对文本显示产生不同的影响,其余为可显示字符。32 ~ 126 (共95个)是字符(32是空格),其中 48~57为0到9十个阿拉伯数字。65~90为26个大写英文字母, 97 ~ 122号为26个小写英文字母,其余为一些标点符号、运算符号等。
串行通信的应用
使用串行通信我们就能让Arduino与计算机通信了,在Arduino端进行串行通信的引脚称为串行端口,一般分为发送和接收,其中发送用TX表示,接收用RX表示。深入了解Arduino与外部设备的通信方式,这些通信方式均属于串行通信. 串行通信是相对于并行通信的一个概念。

如上图所示,并行通信虽然可以多位数据同时传输,速度更快,但其占用的I/O口较多,而Arduino的I/O口资源较少,因此在Arduino中更常用的是串行通信方式. Arduino硬件集成了串口IIC SPI 三种常见的通信方式,掌握了这三种通信类库的用法,即可与具有相应通信接口的各种设备通信,也可以为基于这些通信方式的传感器或模块写驱动程序。
硬件串口通信
串口,也称UART(Universal Asynchronous Receiver Transmitter, 通用异步(串行)收/发器)接口,是指Arduino 硬件集成的串口.在Arduino中,通过Arduino上的USB接口与计算机连接而进行Arduino与计算机之间的串口通信. 除此之外,还可以使用串口引脚连接其他的串口设备进行通信. 需要注意的是,通常一个串口只能连接一个设备进行通信。
软串口通信
软串口就是用程序模拟硬串口实现通信的功能,可以在arduino主板的引脚进行模拟实现,好处是可以设置多个软串口,与电脑通过硬件串口下载程序不冲突,本章的实验主要是通过软串口进行控制器之间的通信。
实验:Arduino UNO与Nano之间进行串口通信
现在,我的实验需要两台电脑,通过USB接口连接各自arduino主板,实现硬串口连接,另外,利用uno板上的D2,D3引脚和nano板上的d5,d6引脚交叉对联实现软串口通信。这里先上一张串口对联示意图:

接线方式
Arduino UNO   <------>Arduino Nano                D2    <------>   D6               D3    <------>   D5               GND   <------>   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="";
    }
}
}

在计算机A中打开arduinoIDE的串口监视器,随意输入字母或数字,点击发送,计算机A通过硬串口把内容发送到与该计算机连接的arduino主板串口中,主板将发送信息存储到变量中,再通过arduino板的软串口发送到另一arduino板的软串口接收,并存储到接收端变量中,再通过接收端的硬串口输出接收到的信息到计算机B的串口监视器中。以下就是测试代码的效果图:

MIXLYNANO的主程序:

MIXLYUNO的主程序:

页: [1]
查看完整版本: Arduinio Uno,Nano,ESP8266,ESP32控制器之间的串口通信