前言
Arduino开发板因为搭载的I/O资源较少,所以通常会采用串行通信方式。其中Arduino硬件集成了串口、IIC、SPI三种常见的通信方式,可以与具有相应通信接口的各种设备通信。这一章先介绍一下串口通信。
参考:优快云博客 【STM32】串口通信基本原理(超基础、详细版)—— Yngz_Miao
硬件串口通信
- 串口也被称为UART(Universal Asynchronous Receiver Transmitter,通用异步串行收发器)接口。两个设备在进行串口通信时,需要交叉相连发送端(TxD)和接收端(RxD),共用电源地线(GND),这也意味着通常一个串口只能连接一个设备进行通信。

- 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);
}
}

- 第二种方法使用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还提供了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 Mega2560如何进行串口通信,包括硬件串口通信的常用函数如Serial.begin(), Serial.read()等,以及如何使用SoftwareSerial类库创建软串口,实现与多个设备的通信。内容涵盖了串口通信的基本原理和实际应用。"
81120354,5628410,SVM深入解析:线性不可分情况下的解决方案,"['SVM', '机器学习', '数据挖掘', '非线性模型', '核方法']
1706

被折叠的 条评论
为什么被折叠?



