Arduino(2) Mega2560和外部设备串口通信

前言

Arduino开发板因为搭载的I/O资源较少,所以通常会采用串行通信方式。其中Arduino硬件集成了串口、IIC、SPI三种常见的通信方式,可以与具有相应通信接口的各种设备通信。这一章先介绍一下串口通信。
参考:CSDN博客 【STM32】串口通信基本原理(超基础、详细版)—— Yngz_Miao

硬件串口通信

  • 串口也被称为UART(Universal Asynchronous Receiver Transmitter,通用异步串行收发器)接口。两个设备在进行串口通信时,需要交叉相连发送端(TxD)和接收端(RxD),共用电源地线(GND),这也意味着通常一个串口只能连接一个设备进行通信。
    Arduino(2) Mega2560和外部设备串口通信_第1张图片
  • Arduino Mega2560开发板可以使用USB接口与电脑相连,使用的是默认的Serial串口,同时这块开发板还集成了额外的三个串口,TX和RX脚定义成从14脚起至19脚,也就是Mega2560作为下位机控制板除了和电脑上位机串口通信之外,还可以再和三个外部设备进行串口通信。
  • 硬件串口通信是指直接利用Arduino开发板上集成好的串口来进行通信,使用到了Arduino核心库里的HardwareSerial类,并且是默认被包含,无需include调用。它主要使用到的一些函数如下所示:
1. Serial.available()

获取到串口缓冲区接收到的字节数,最多可保存64Bytes

2. Serial.begin(speed)

初始化串口,可配置串口的各项参数。speed:波特率

3. Serial.find(target)

从串口缓冲区读取数据,直至读到指定的字符串。target:需要搜寻的字符串或字符

4. Serial.flush()

等待正在发送的数据发送完成。早期版本里可用来清空接收缓冲区。

5. Serial.peek()

返回一字节的数据,但不会从接收缓冲区删除该数据

6. Serial.print(val, format)

将数据以ASCII码形式输出。val:需要输出的数据 format:数据输出的格式

7. Serial.read()

从串口读取数据,每读取一个字节,就会从接收缓冲区移除一字节的数据。

8. Serial.readBytes(buffer, length)

从接收缓冲区读取指定长度的字符,并将其存入一个数组。buffer:用于存储数据的数组(char[]或者byte[]) length:需要读取的字符长度

9. Serial.write(val)

输出数据到串口,以字节形式。val:发送的数据

串口接收数据的两种方法

  • 第一种方法可以接收任意大小的数据,使用Arduino自带的串口监视器来发送字符串,输入任意字符后,可以在滚动框里看到刚才输入的数据。
void setup()
{
	Serial.begin(9600);    //初始化与电脑通信的串口
}

void loop()
{
	String rxdata="";
	while(Serial.available()>0)
	{
		char inchar = Serial.read();  
		rxdata+=(char)inchar;          //逐个字符接收串口缓冲区内的数据
		delay(10);                     //等待数据完全进入串口缓冲区
	}
	if(rxdata!="")                     //如果接收到数据,就将其打印出来
	{ 
		Serial.print("Input: ");
		Serial.println(rxdata);
	}
}

Arduino(2) Mega2560和外部设备串口通信_第2张图片

  • 第二种方法使用Serial.readBytes()函数来接收输入的数据,这种方式就必须提前知道输入数据的大小,适合于接收一些特定传感器或者模块返回的数据。
const int Length = 11;
byte rxData[Length];   //提前申明一个用来存储数据的byte数组

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

void loop() 
{
    delay(20);
    int rxLength = Serial.available();
    if(rxLength > 0)                //当串口缓冲区内有数据进入时
    {
        if (rxLength == Length)     //验证所需的数据是否完全进入串口缓冲区
        {
            Serial.readBytes(rxData, Length);   //用提前申明的数组来接收数据
			Serial.write(rxData, Length);       //打印数组内的数据
        }
    }
}

Arduino(2) Mega2560和外部设备串口通信_第3张图片

软件模拟串口通信

  • Arduino还提供了SoftwareSerial类库,可将其他数字引脚通过程序来模拟成串口通信引脚。这样以来,开发板上集成的串口可称为硬件串口,使用SoftwareSerial类库模拟成的串口称为软串口。当然这样也有相应的局限性,波特率越高越不稳定,而且软串口是通过AVR芯片的PCINT中断功能来实现,所以不是所有的引脚都可以设置成软串口,Mega2560支持的引脚有10-13,50-53
  • SoftwareSerial类库不属于Arduino核心库,所以使用之前需要申明包含SoftwareSeria.h头文件,其中定义的成员函数也与硬串口类似,available()、begin()、read()、write()、print()等函数用法也相同,下面是几个不同于硬串口的成员函数。
1. SoftwareSerial mySerial(rxPin, txPin)

这个函数是SoftwareSerial类的构造函数,通过它可以指定软串口的RX和TX引脚。
mySerial:用户自定义的软串口对象 rxPin:软串口接收引脚 txPin:软串口发送引脚

2. mySerial.listen()

开启软串口监听状态,Arduino在同一时间仅能监听一个软串口,所以当需要监听某个软串口时,就需要该对象调用此函数开启监听功能

3. mySerial.overflow()

检测缓冲区是否已经溢出,软串口缓冲区同硬件串口缓冲区一样,最多可保存64Bytes的数据

你可能感兴趣的:(Arduino)