PAGE1
PAGE1
串行通信(UART)
什么是UART?
UART(UniversalAsynchronousReceiver/Transmitter,通用异步收发传输器)是一种常见的串行通信协议,用于在两个设备之间进行异步数据传输。UART通信不需要同步时钟信号,而是通过起始位、停止位和校验位来实现数据的同步和错误检测。ArduinoUno系列(基于ATmega328P)内置了硬件UART模块,可以方便地与其他设备进行串行通信。
UART的基本原理
异步通信
异步通信的特点是发送方和接收方不需要共享时钟信号。数据传输通过起始位和停止位来同步。起始位通常是一个低电平信号,表示数据传输的开始;停止位是一个高电平信号,表示数据传输的结束。数据位在起始位和停止位之间传输。
数据帧格式
一个典型的UART数据帧包括以下几个部分:
起始位:1位,低电平,表示数据传输的开始。
数据位:5到9位,实际传输的数据。
校验位:可选,1位,用于检测数据传输的错误。
停止位:1到2位,高电平,表示数据传输的结束。
波特率
波特率是指每秒传输的位数,单位是bps(bitspersecond)。常见的波特率有9600、19200、38400、57600、115200等。发送方和接收方必须设置相同的波特率,以确保数据能够正确传输。
ArduinoUno的硬件UART
ArduinoUno内置了一个硬件UART模块,可以通过数字引脚0(RX)和1(TX)进行串行通信。此外,ArduinoIDE提供了Serial库来方便地使用硬件UART。
初始化UART
在使用UART通信之前,需要初始化串行通信。这可以通过调用Serial.begin()函数来实现,该函数需要一个参数,即波特率。
voidsetup(){
Serial.begin(9600);//初始化串行通信,设置波特率为9600
}
发送数据
使用Serial.print()或Serial.println()函数可以发送字符串或数值。Serial.write()函数可以发送单个字节。
voidloop(){
Serial.print(Hello,World!);//发送字符串
Serial.println(Thisisaserialcommunicationexample.);//发送字符串并换行
Serial.write(A);//发送单个字节A
delay(1000);//延迟1秒
}
接收数据
使用Serial.available()函数可以检查是否有数据可用,Serial.read()函数可以读取数据。
voidloop(){
if(Serial.available()0){//检查是否有数据可用
intincomingByte=Serial.read();//读取一个字节
Serial.print(Received:);
Serial.println(incomingByte,HEX);//以十六进制格式打印接收到的字节
}
}
例子:简单的串行通信
硬件连接
将ArduinoUno的TX引脚(数字引脚1)连接到另一个设备的RX引脚。
将ArduinoUno的RX引脚(数字引脚0)连接到另一个设备的TX引脚。
确保两个设备共地。
代码示例
发送端
//发送端代码
voidsetup(){
Serial.begin(9600);//初始化串行通信,设置波特率为9600
}
voidloop(){
Serial.print(Hello,World!);//发送字符串
Serial.println(Thisisaserialcommunicationexample.);//发送字符串并换行
Serial.write(A);//发送单个字节A
delay(1000);//延迟1秒
}
接收端
//接收端代码
voidsetup(){
Serial.begin(9600);//初始化串行通信,设置波特率为9600
}
voidloop(){
if(Serial.available()0){//检查是否有数据可用
intincomingByte=Serial.read();//读取一个字节
Serial.print(Receiv