目录
介绍
UART(通用异步接收器/发送器)是一种串行通信协议,其中数据是串行传输的,即逐位传输。异步串行通信广泛用于面向字节的传输。在异步串行通信中,一次传输一个字节的数据。
UART串行通信协议使用定义的帧结构作为其数据字节。异步通信中的帧结构包括:
- START位: 它有点表示串行通信已启动且始终为低电平。
- Data bits包:数据位可以是5到9位的包。通常我们使用8位数据包,它总是在START位之后发送。
- STOP位:通常为一位或两位。它在数据位包之后发送以指示帧结束。停止位始终为逻辑高电平。
UART框架结构
通常,异步串行通信帧由START位(1位)后跟数据字节(8位)和STOP位(1位)组成,它形成一个10位帧,如上图所示。帧也可以由2个STOP位而不是单个位组成,并且在STOP位之后还可以有一个PARITY位。
Raspberry Pi UART
Raspberry Pi有两个内置UART,如下所示:
- PL011 UART
- mini UART
PL011 UART是基于ARM的UART。该UART具有比迷你 UART 更高的吞吐量。
在Raspberry Pi 3中,mini UART用于Linux控制台输出,而PL011用于板载蓝牙模块。
在其他版本的Raspberry Pi中,PL011用于Linux控制台输出。
Mini UART使用与GPU核心频率相关的频率。因此,随着GPU核心频率的变化,UART的频率也会发生变化,从而改变UART的波特率。这使得mini UART不稳定,可能导致数据丢失或损坏。要使mini UART稳定,请修复核心频率。mini UART没有奇偶校验支持。
PL011是一款稳定的高性能UART。为了更好和有效的通信,使用PL011 UART代替迷你UART。
建议启用Raspberry Pi的UART进行串行通信。否则,我们无法进行串行通信,因为UART端口用于Linux控制台输出和蓝牙模块。
Raspberry Pi 3 UART针脚
在Raspberry Pi上配置UART
在Raspberry Pi中,在终端窗口中输入以下命令以启用UART,
sudo raspi-config
选择 – > Interfacing Options
选择“接口”选项后,选择“ Serial ”选项以启用UART
然后它会要求登录shell可通过Serial访问,选择No如下所示:
最后,它会要求启用硬件串口,选择Yes:
最后,我们的UART启用了Raspberry Pi 3的RX和TX引脚上的串行通信:
然后,重新启动Raspberry Pi。
用于UART通信的串行端口
默认情况下,mini UART映射到UART引脚(TX和RX),而PL011连接到Raspberry Pi 3上的板载蓝牙模块。
在以前版本的Raspberry Pi型号中,PL011用于Linux控制台输出(映射到UART引脚),并且没有板载蓝牙模块。
完成上述配置后,UART可用于UART引脚(GPIO14和GPIO15)。
要在Raspberry Pi 3中访问mini UART,需要分配ttyS0端口。并且为了访问Raspberry Pi 3中的PL011,分配了ttyAMA0端口。但在Raspberry Pi的其他型号中,只有ttyAMA0端口可以访问。
硬件UART端口即GPIO14(TXD)和GPIO15(RXD)也称为serial0,而连接到蓝牙模块的其他UART端口称为serial1。这些名称创建为Raspberry Pi版本可移植性的串行别名。
我们可以检查哪个UART即mini UART(ttyS0)或PL011 UART(ttyAMA0)映射到UART引脚(GPIO14和GPIO15)。要检查UART映射,请输入以下命令。
ls -l /dev
/dev/ttyS0和/dev/ttyAMA0的UART映射如下所示:
Raspberry Pi Dev端口列表与映射
测试Raspberry Pi和PC之间的串行通信
要测试我们的串行通信是否正常,请进行如下图所示的连接:
Raspberry Pi UART与PC /笔记本电脑通信
在笔记本电脑/ PC上打开终端,接收将从Raspberry Pi传输的数据。
现在,输入以下命令从Raspberry Pi终端传输数据。
echo “Hello” > /dev/ttyS0
该命令将在UART端口输出“Hello”字符串,即Tx引脚,并将其显示在PC / Laptop的终端应用程序上。
默认情况下,mini UART映射到GPIO14(TX)和GPIO15(RX)。而PL011即ttyAMA0连接到板载蓝牙模块。
例程
让我们使用UART在Raspberry Pi 3和Laptop / PC之间建立串行通信。我们可以使用Python和C执行基于UART的串行通信。
在这里,我们将在PC上响应回应。
使用Python在Raspberry Pi上进行UART通信
'''
UART communication on Raspberry Pi using Pyhton
https://www.qutaojiao.com
'''
import serial
from time import sleep
ser = serial.Serial ("/dev/ttyS0", 9600) #Open port with baud rate
while True:
received_data = ser.read() #read serial port
sleep(0.03)
data_left = ser.inWaiting() #check for remaining byte
received_data += ser.read(data_left)print (received_data) #print received data
ser.write(received_data) #transmit data serially
使用的功能:
serial.Serial(port,baudrate)
它是Serial的一个类,用于打开端口。为这个类创建实例(这里命名为ser, 我们可以使用任何名称)。
例如
ser = serial.Serial(/dev/ttyS0, 9600)
参数:
Port – 端口名称即ttyUSB0,ttyS0等或无
Baudrate – 波特率如9600,38400等。
以上功能有更多参数,但这里没有使用。因此,有关更多参数详细信息,您可以参考Python API for PySerial。
read(Size)
该功能用于读取串口数据。
参数:
Size – 要读取的字节数。默认大小为1。
返回:
从端口读取的字节数。
write(Data)
此功能用于在串行端口上传输/发送数据。
参数:
Data – 要发送的数据
返回:
写入/发送的字节数
有关更多串行API及其详细信息,您可以参考Python API for PySerial。
使用C在Raspberry Pi上进行UART通信
让我们使用C语言编写的程序在Raspberry Pi 3和Laptop / PC之间实现UART串行通信。在这里,我们使用WiringPi库在Raspberry Pi上建立UART通信。
/*
UART communication on Raspberry Pi using C (WiringPi Library)
https://www.qutaojiao.com
*/
#include
#include
#include
#include
#include
int main ()
{int serial_port ;
char dat;
if ((serial_port = serialOpen ("/dev/ttyS0", 9600)) < 0) /* open serial port */
{
fprintf (stderr, "Unable to open serial device: %sn", strerror (errno)) ;
return 1 ;
}
if (wiringPiSetup () == -1) /* initializes wiringPi setup */
{
fprintf (stdout, "Unable to start wiringPi: %sn", strerror (errno)) ;
return 1 ;
}
while(1){
if(serialDataAvail (serial_port) )
{
dat = serialGetchar (serial_port); /* receive character serially*/
printf ("%c", dat) ;
fflush (stdout) ;
serialPutchar(serial_port, dat); /* transmit character serially on port */
}
}
}
Raspberry Pi终端的输出
Raspberry Pi终端的串行输出
笔记本电脑/ PC终端的输出
PC /笔记本电脑的串行输出
在PC /笔记本电脑端,我们在这里使用Realterm软件。
串行别名
在这里,我们使用了在Raspberry Pi 3中映射UART(GPIO14和GPIO15)的ttyS0端口。但在Raspberry Pi的其他型号中,它被映射到ttyAMA0,因为没有板载蓝牙模块。
因此,为Raspberry Pi 3编写的程序将在旧版Raspberry Pi上出错,因为端口名称不同。为了在端口名称中提供可移植性,在Raspbian中创建了名为serial0和serial1的串行别名。serial0是指映射到默认端口(ttyS0或ttyAMA0)的UART端口。因此,我们可以用serial0替换ttyS0或ttyAMA0。
当我们使用serial0作为UART端口而不是ttyS0或ttyAMA0时,为Raspberry Pi 3编写的程序也将在较旧的Raspberry Pi模型上运行。
在Raspberry Pi 3上交换串行端口
为了获得更好的性能,GPIO14和GPIO15上的串行通信需要使用连接到蓝牙模块的ttyAMA0端口。要使用此端口,我们应交换UART端口,即将ttyAMA0映射到GPIO14和GPIO15,同时将ttyS0(迷你UART)映射到蓝牙模块。
交换串口可以通过设备覆盖使用mini UART(ttyS0)来实现蓝牙模块,即pi3-miniuart-bt。或者可以通过设备覆盖完全禁用蓝牙,即pi3-disable-bt来完成。
要交换UART端口,请打开文件config.txt,如下所示,
sudo nano /boot/config.txt
然后将下面的行添加到文件的末尾,如下所示,
dtoverlay = pi3-miniuart-bt
或者
dtoverlay = pi3-disable-bt
添加上面的行后,将更 改保存到文件并重新启动系统。
我们可以检查串口的新映射,
ls -l /dev
UART端口的映射如下所示,
本节课完整程序下载:
很好!!!!!!!!!!!!!!!!!!