博主的树莓派4B烧录的系统为Raspberry Pi OS (64-bit)
首先贴出树莓派的引脚定义。
下面贴出树莓派4B的串口内容。相比树莓派0、1、2、3的双串口UART0(PL011)和UART1(mini UART),树莓派4B新增了 4 个 PL011 串口共计有6个 UART。对于树莓派0-3使用串口,由于本身串口不够用,故需要禁用下蓝牙(默认配置好的两串口一个用于蓝牙(UART0)另一个是miniUART)。但对树莓派4B来说并不需要,因为有额外 4 个串口可以利用。
按下面操作开始配置串口:
sudo nano /boot/firmware/config.txt
在结尾添加:
dtoverlay=uart2
dtoverlay=uart3
dtoverlay=uart4
dtoverlay=uart5
重启后查看是否生效:
ls /dev/ttyAMA*
观察到:
pi@pi:~ $ ls /dev/ttyAMA*
/dev/ttyAMA2 /dev/ttyAMA3 /dev/ttyAMA4 /dev/ttyAMA5
下面给出各 UART 串口与 GPIO 对应关系,一般使用建议UART2-5。
UART0: GPIO14 = TXD0 GPIO15 = RXD0
UART2: GPIO0 = TXD2 -> ttyAMA2 GPIO1 = RXD2 -> ttyAMA2
UART3: GPIO4 = TXD3 -> ttyAMA3 GPIO5 = RXD3 -> ttyAMA3
UART4: GPIO8 = TXD4 -> ttyAMA4 GPIO9 = RXD4 -> ttyAMA4
UART5: GPIO12 = TXD5 -> ttyAMA5 GPIO13 = RXD5 -> ttyAMA5
测试代码如下,不知道为什么我加了注释后命令行运行会报错,把注释删掉就行了。注意下面我使用的是ttyAMA2,按上面进行接线。
import serial
import time
# 配置串口参数
ser = serial.Serial(
port='/dev/ttyAMA2', # 更改为 ttyAMA2 端口,需要确认对应的GPIO引脚
baudrate=115200, # 设置波特率
parity=serial.PARITY_NONE, # 无校验位
stopbits=serial.STOPBITS_ONE, # 1个停止位
bytesize=serial.EIGHTBITS, # 8位数据位
timeout=1 # 超时时间
)
try:
# 发送'lpf'字符串
ser.write(b'lpf\n') # 发送数据,b表示字节字符串
print("Message sent: lpf")
time.sleep(0.1) # 稍微等待,确保数据完全发送
except Exception as e:
print("Error sending message:", e)
finally:
ser.close() # 关闭串口
运行后在接收端可以收到 lpf ,结果正常。
后记:年少不知通信好,错把IO当成宝。我现在越来越觉得单片机、边缘板卡等等之间的通信是至关重要的。以前只是点灯大师罢了。