赞
踩
1、树莓派 4B 有 UART0(PL011)、UART1(mini UART)和 4 个 PL011 串口共计有 6 个 UART
2、默认情况下,树莓派会将 /dev/ttyAMA0
用作终端串口,而不是普通的串口设备。可以通过编辑 /boot/cmdline.txt
文件来禁用终端串口。找到以 console=serial0
开头的行,并将其修改为 console=tty1
,如下图所示
输出下面的命令可以看到所有的串口
dtoverlay -a | grep uart
使用下面的命令会展示串口的配置信息
dtoverlay -h uart3
在/boot/config.txt的末尾添加如下的代码,保存重启树莓派
dtoverlay=uart2
dtoverlay=uart3
dtoverlay=uart4
dtoverlay=uart5
查看是否生效
ls /dev/ttyAMA*
结果如下图
到这里就打开了所有的串口了
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
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)
使用杜邦线按照下图的方式进行连接
- 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)
结果如下图,说明串口生效,实验成功:
使用 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。