一、原理
1、树莓派 4B 有 UART0(PL011)、UART1(mini UART)和 4 个 PL011 串口共计有 6 个 UART
2、默认情况下,树莓派会将 /dev/ttyAMA0
用作终端串口,而不是普通的串口设备。可以通过编辑 /boot/cmdline.txt
文件来禁用终端串口。找到以 console=serial0
开头的行,并将其修改为 console=tty1
,如下图所示
二、 其他串口配置
2.1 展示所有串口命令
输出下面的命令可以看到所有的串口
dtoverlay -a | grep uart
2.2 查看特定串口信息
使用下面的命令会展示串口的配置信息
dtoverlay -h uart3
2.3 配置开启串口 UART2-5
在/boot/config.txt的末尾添加如下的代码,保存重启树莓派
dtoverlay=uart2
dtoverlay=uart3
dtoverlay=uart4
dtoverlay=uart5
查看是否生效
ls /dev/ttyAMA*
结果如下图
到这里就打开了所有的串口了
三、验证结果
各 UART 串口与 GPIO 对应关系:
GPIO14 = TXD0 -> ttyAMA0
GPIO0 = TXD2 -> ttyAMA1
GPIO4 = TXD3 -> ttyAMA2
GPIO8 = TXD4 -> ttyAMA3
GPIO12 = TXD5 -> ttyAMA4
GPIO15 = RXD0 -> ttyAMA0
GPIO1 = RXD2 -> ttyAMA1
GPIO5 = RXD3 -> ttyAMA2
GPIO9 = RXD4 -> ttyAMA3
GPIO13 = RXD5 -> ttyAMA4
3.1这里进行两个验证:
UART2的自环测试,UART2和3的串口间通信,以及一个究极测试:同时打开所有的串口(包括USB转的,看看树莓派的CPU使用率有多少)
杜邦线短接 GPIO4 和 GPIO5
编写下面的 python 程序
import serial
ser1 = serial.Serial(port='/dev/ttyAMA2',baudrate=115200)
ser1.write(b'Hello, World!\n')
data = ser1.readline()
print(data)
3.2 UART2和3的串口间通信
使用杜邦线按照下图的方式进行连接
GPIO4(TXD3)-------GPIO9(RXD2)
GPIO5(RXD3)-------GPIO8(TXD2)
然后编写如下的程序
import serial
ser2 = serial.Serial(port='/dev/ttyAMA2',baudrate=115200)
ser3 = serial.Serial(port='/dev/ttyAMA3',baudrate=115200)
ser2.write(b'hello ser3,I am ser2\n')
ser3.write(b'hello ser2,I am ser3\n')
line2 = ser2.readline()
line3 = ser3.readline()
print('ser2Rec:'+str(line2))
print('ser3Rec:'+str(line3)
结果如下图,说明串口生效,实验成功:
四、串口接受发送16进制数据
1、打开串口usart2、3
使用 nano
编辑器:
sudo nano /boot/config.txt
这将使用 nano
编辑器打开 /boot/config.txt
文件。你需要使用超级用户权限(sudo
)运行该命令,以便能够编辑 /boot
目录下的文件。
使用 vi
编辑器:
sudo vi /boot/config.txt
这将使用 vi
编辑器打开 /boot/config.txt
文件。同样,你需要使用超级用户权限(sudo
)来编辑该文件。
修改完成后,按下相应编辑器的保存快捷键(通常是 Ctrl+O
),然后按下退出快捷键(通常是 Ctrl+X
)来保存并退出编辑器。
在/boot/config.txt
的末尾添加如下的代码,保存重启树莓派 sudo reboot
查看是否生效
ls /dev/ttyAMA*
结果如下图
各 UART 串口与 GPIO 对应关系:
GPIO14 = TXD0 -> ttyAMA0
GPIO0 = TXD2 -> ttyAMA1
GPIO4 = TXD3 -> ttyAMA2
GPIO8 = TXD4 -> ttyAMA3
GPIO12 = TXD5 -> ttyAMA4
GPIO15 = RXD0 -> ttyAMA0
GPIO1 = RXD2 -> ttyAMA1
GPIO5 = RXD3 -> ttyAMA2
GPIO9 = RXD4 -> ttyAMA3
GPIO13 = RXD5 -> ttyAMA4
在树莓派上,引脚的编号可以使用两种方式:物理引脚编号(Physical Pin Numbering)和BCM引脚编号(BCM GPIO Numbering)。
# -*- coding: UTF-8 -*-
#!/usr/bin/python3 python3
import serial
def init_usart1(baudrate):
ser = serial.Serial('/dev/ttyAMA2', baudrate, timeout=1) # 打开 ttyUSB0 设备,指定波特率
return ser
def send_hex_data(ser, data):
hex_data = bytearray.fromhex(data)
ser.write(hex_data) # 将16进制数据转换成字节并发送到串口
print('发送的数据:', ' '.join(format(byte, '02X') for byte in hex_data))
def read_hex_data(ser):
try:
while True:
if ser.in_waiting > 0: # 如果串口有数据可读
data_recv = ser.read(ser.in_waiting) # 读取所有可用的数据
hex_data = data_recv.hex() # 将数据以16进制格式打印出来
print(hex_data) # 将数据以16进制格式打印出来
except KeyboardInterrupt:
# Ctrl+C被按下,执行异常处理
ser.close()
print("程序终止,关闭串口")
# 在主程序中调用函数
baudrate = 115200
usart1 = init_usart1(baudrate)
send_data = "AA 55 01 01 55 AA" # 要发送的16进制数据
send_hex_data(usart1, send_data)
read_hex_data(usart1)
运行结果如下
参考链接:https://blog.csdn.net/FuckerGod/article/details/131232138